英文原文:Don't use Hadoop when your data isn't that big ”
作者:Chris Stucchio 有着多年从业经验的数据科学家,纽约大学柯朗研究所博士后,搞过高频交易平台,当过创业公司的 CTO,更习惯称自己为统计学者。对了,他现在自己创业,提供数据分析、推荐优化咨询服务,他的邮件是:stucchio@gmail.com 。
“你有多少大数据和 Hadoop 的经验?”他们问我。我一直在用 Hadoop,但很少处理几 TB 以上的任务。我基本上只是一个大数据新手——知道概念,写过代码,但是没有大规模经验。
接下来他们会问:“你能用 Hadoop 做简单的 group by 和 sum 操作吗?”我当然会,但我会说需要看看具体文件格式。
他们给我一个U盘,里面有所有的数据,600MB,对,他们所有的数据。不知道为什么,我用 pandas.read_csv(Pandas 是一种 Python 数据分析库)而不是 Hadoop 完成了这个任务后,他们显得很不满意。
Hadoop 其实是挺局限的。它无非是运行某个通用的计算,用 SQL 伪代码表示就是:SELECT G (...) FROM table GROUP BY F (...)你只能改变G和F操作,除非要在中间步骤做性能优化(这可不怎么好玩!)。其他一切都是死的。
(关于 MapReduce,之前作者写过一篇“41 个词讲清楚 MapReduce”,可以参考。)
Hadoop 里,所有计算都必须按照一个 map、一个 group by、一个 aggregate 或者这种计算序列来写。这和穿上紧身衣一样,多憋得慌啊。许多计算用其他模型其实更适合。忍受紧身衣的唯一原因就是,可以扩展到极大极大的数据集。可你的数据集实际上很可能根本远远够不上那个数量级。
可是呢,因为 Hadoop 和大数据是热词,世界有一半的人都想穿上紧身衣,即使他们根本不需要。
可我的数据有好几百 MB 呢!Excel 都装不下
对 Excel 很大可不是什么大数据。有很多好工具——我喜欢用的是基于 Numpy 的 Pandas。它可以将几百 MB 数据以高效的向量化格式加载到内存,在我已经 3 年的老笔记本上,一眨眼的功夫,Numpy 就能完成 1 亿次浮点计算。Matlab 和R也是很棒的工具。
数百 MB 数据一般用一个简单的 Python 脚本逐行读取文件、处理,然后写到了一个文件就行了。
可我的数据有 10G 呢!
我刚买了一台笔记本电脑。16G 内存花了 141.98 美元,256GB SSD 多收 200 美元。另外,如果在 Pandas 里加载一个 10GB 的 csv 文件,实际在内存里并没有那么大——你可以将 “17284932583” 这样的数值串存为 4 位或者 8 位整数,“284572452.2435723”存为 8 位双精度。
最差情况下,你还可以不同时将所有数据都一次加载到内存里。
可我的数据有 100GB/500GB/1TB!
一个 2T 的硬盘才 94.99 美元,4T 是 169.99。买一块,加到桌面电脑或者服务器上,然后装上 PostgreSQL。
Hadoop 的适用范围远小于 SQL 和 Python 脚本
从计算的表达能力来说,Hadoop 比 SQL 差多了。Hadoop 里能写的计算,在 SQL 或者简单的 Python 脚本都可以更轻松地写出来。
SQL 是直观的查询语言,没有太多抽象,业务分析师和程序员都很常用。SQL 查询往往非常简单,而且一般也很快——只要数据库正确地做了索引,要花几秒钟的查询都不太多见。
Hadoop 没有任何索引的概念,它只知道全表扫描。而且 Hadoop 抽象层次太多了——我之前的项目尽在应付 Java 内存错误、内存碎片和集群竞用了,实际的数据分析工作反而没了时间。
如果你的数据结构不是 SQL 表的形式(比如纯文本、JSON、二进制),一般写一小段 Python 或者 Ruby 脚本按行处理更直接。保存在多个文件里,逐个处理即可。SQL 不适用的情况下,从编程来说 Hadoop 也没那么糟糕,但相比 Python 脚本仍然没有什么优势。
除了难以编程,Hadoop 还一般总是比其他技术方案要慢。只要索引用得好,SQL 查询非常快。比如要计算 join,PostgreSQL 只需查看索引(如果有),然后查询所需的每个键。而 Hadoop 呢,必须做全表扫描,然后重排整个表。排序通过多台机器之间分片可以加速,但也带来了跨多机数据流处理的开销。如果要处理二进制文件,Hadoop 必须反复访问 namenode。而简单的 Python 脚本只要反复访问文件系统即可。
可我的数据超过了 5TB!
你的命可真苦——只能苦逼地折腾 Hadoop 了,没有太多其他选择(可能还能用许多硬盘容量的高富帅机器来扛),而且其他选择往往贵得要命(脑海中浮现出 IOE 等等字样……)。
用 Hadoop 唯一的好处是扩展。如果你的数据是一个数 TB 的单表,那么全表扫描是 Hadoop 的强项。此外的话,请关爱生命,尽量远离 Hadoop。它带来的烦恼根本不值,用传统方法既省时又省力。
附注:Hadoop 也是不错的工具
我可不是成心黑 Hadoop 啊。其实我自己经常用 Hadoop 来完成其他工具无法轻易完成的任务。(我推荐使用 Scalding,而不是 Hive 或者 Pig,因为你可以用 Scala 语言来写级联 Hadoop 任务,隐藏了 MapReduce 底层细节。)我本文要强调的是,用 Hadoop 之前应该三思而行,别 500MB 数据这样的蚊子,你也拿 Hadoop 这样的大炮来轰。