我现在也是在big data业界工作(OpenX)处理的是广告实时竞价
去除重复资料后,一分钟的资料量也有25GB
先讲两个结论:
1. CS 是最接近的科系,但也有很多东西是CS没有教,你要自己学的
这其实不意外。例如,怎么把程式写到production level
在业界明明就是非常需要的能力,但没什么研究价值
2. Process data in large scale != data science
* * *
很多人以为big data就是要做大型数据分析
不过如果你没有一个能靠数据吃饭的business model,你连资料都养不起
OpenX的资料量还不算是非常大的,但也是要700台来装这些数据
资料甚至还不能留太久
我们的主要业务不是在分析数据,而是将数据处理成报表,才能跟客户收钱
这种资料工程师要做的事情可以简化成三件事:
1. 去除无效或重复资料
2. 将相关的资料join
3. join好的资料非常大,类似传统数据库的hyper cube
从这样的资料再去切出各种角度的报表
英文比较好表达这个:aggregation
把这三件事做到好,才是一家公司有办法养大数据的基础
很不幸的,没有学校会想要教你这些,因为这实在是没有学术价值啊
* * *
资料工程要做的三件事虽然目标简单,但要做到large scale一点也不直观
虽然现在hadoop ecosystem上层工具很多,但我建议还是要能做到map-reduce API的程度
这里面最困难的还是去除无效资料
如何筛选相关资料,然后送进同一台机器两两比对是否重复或无效
这种逻辑不直接写到Map-Reduce API我还真无法想像该怎么写
另外跟金钱相关的资料,常常需要在currency间转换
currency的转换要留到最后一步做,太早变成浮点数,数据会在数次aggregation后失真
这种我们需要客制的资料结构来存,用上层工具(hive/pig)来做也是相当困难
这些东西该怎么学?我是自己学的
买一本hadoop definitive guide,全本读完
书里面很多东西没涵盖到,就把API先浏览过一遍,才会发现很多有用的小工具
到最后就是在source code里面挖东西了
我在写自己的input/output format时,就是从它的source code里面找灵感
学习过程也不是学完再做东西,都是一边学一边做
可以先从最简单的目标开始写:
1. 如何写一个select count(1) from... group by xxx
进阶一点select sum, avg, ... from ... group by xxx
2. 如何写one-to-many join, many-to-many join
3. 如何写“去除一分钟内的重复资料”的map-reduce job
* * *
以上是比较基础的资料工程师要做的工作
更进阶的会需要更多深入的资料结构及算法
题目也会变得更灵活
例如,比起sort全部的资料,只找最高的一百个
用map-reduce加上自订的资料结构效能可以比原本快非常多倍
或是如果你只在乎一个query最后会产生多少行,而且只在乎大略的数字
那你可以使用hyperloglog的算法来做
又或是你如果想预先知道一个query会不会data skew
可以使用count min sketch
我自己的工作几乎没有资料分析
但需要很多技巧来将资料处理的算法变得scalable
这也是big data工作的一种型态,我个人觉得应该是比资料分析还缺人啦
至少就我们公司来说,有太多PhD来应征data science,而合格的data engineer
几乎找不到...