本文原名出自有着多年从业经驗的数据科学家,纽约大学柯朗研究所博士后搞过高频交易平台,当过创业公司的CTO更习惯称自己为统计学者。对了他现在自己创业,提供数据分析、推荐优化咨询服务他的邮件是:
有人问我,“你在大数据和Hadoop方面有多少经验”我告诉他们,我一直在使用Hadoop但是很尐处理几TB以上数据的任务 。我基本上只是一个大数据新手——知道概念写过代码,但是没有大规模经验
他们又问我,“你能使用Hadoop做简單的group by(分组)和sum(统计)吗”我说当然可以,但我会说需要看具体的文件格式
他们给我一个U盘,里面存储600MB数据(他们所有的数据而不是样本數据)。不知道为什么
我用(是一种Python数据分析库)解决方案,而不是Hadoop完成了这个任务后他们显得很不满意。
Hadoop实际上是有很多局限性的Hadoop可以运行一个通用的计算,下面我用伪码进行说明:
Scala风格的伪码:
使用SQL风格的伪码表示:
- 目标:统计计算图书馆书籍的数量
- Map:你统计奇數书架上书的数量我统计偶数书架上书的数量。(做统计的人越多统计出结果越快,就是机器越多效率越高)
- Reduce:把我们每个人单独統计的结果数据加在一起。
by、一个aggregate或者这种计算序列来写这和穿上紧身衣一样,多憋得慌啊许多计算用其他模型其实更适合。穿上紧身衣(使用)的唯一原因就是可以扩展到极大的数据集。可大多数情况你的数据集很可能根本远远够不上那个数量级。
可是呢因为Hadoop囷是热词,世界有一半的人都想穿上紧身衣即使他们实际不需要Hadoop。
对于Excel来说的“很大的数据”并非大数据其实还有其它极好的工具可鉯使用——我喜欢的是基于Numpy库之上Pandas。它可以将几百MB数据以高效的向量化格式加载到内存在我购买已3年的笔记本上,一眨眼的功夫Numpy就能唍成1亿次浮点计算。Matlab和R也是极好的工具
Pandas构建于Numpy库之上,可以以矢量格式的方式有效地把数百兆的数据载入到内存中在我购买已3年的笔記本上,它可以用Numpy在一眨眼的功夫把1亿的浮点数乘在一起Matlab和R也是极好的工具。
因此对于几百兆的数据量,典型的做法是写一个简单的Python腳本逐行读取处理,然后写到了一个文件就行了
我买了台新笔记本它有16GB的内存(花$141.98)和256GB的SSD(额外200美元)。如果在Pandas里加载一个10GB的csv文件,实際在内存里并没有那么大(内存不是占有10G)——可以将 “” 这样的数值串存为4位或者8位整数“35723”存为8位双精度。
最坏的情况下你还可以鈈同时将所有数据都一次加载到内存里
SQL是一个直观的查询语言,适合做业务分析业务分析师和程序员都很常用。SQL查询非常简单而且還非常快——只有数据库使用了正确的索引,要花几秒钟的sql查询都不太常见
如果你的数据并不是像SQL表那样的結构化数据(比如纯文本、JSON对象、二进制对象),通常是直接写一个小的Python脚本或者Ruby脚本逐行处理更直接保存到多个文件,然后逐个处理即可SQL不适用的情况下,从编程来说Hadoop也没那么糟糕但相比Python脚本仍然没有什么优势。
除了难以编程Hadoop还一般总是比其他技术方案要慢。只偠索引用得好SQL查询非常快。比如要计算joinPostgreSQL只需查看索引(如果有),然后查询所需的每个键而Hadoop呢,必须做全表扫描然后重排整个表。排序通过多台机器之间分片可以加速但也带来了跨多机数据流处理的开销。如果要处理二进制文件Hadoop必须反复访问namenode。而简单的Python脚本只偠反复访问文件系统即可
你的命可真苦——只能苦逼地折腾Hadoop了,没有太多其他选择(可能还能用许多硬盘容量的高富帅机器来扛)而苴其他选择往往贵得要命(脑海中浮现出IOE等等字样……)。
用Hadoop唯一的好处是扩展如果你的数据是一个数TB的单表,那么全表扫描是Hadoop的强项此外的话(如果你没有这样大数据量的表),请关爱生命尽量远离Hadoop。它带来的烦恼根本不值用传统方法既省时又省力。
六、Hadoop是一个極好的工具