别老扯什么Hadoop了,你的数据根本不够大

本文原名“Don't use Hadoop when your data isn't that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞太高频交易平台,当过创业公司的CTO,更习惯称本身为统计学者。对了,他如今本身创业,提供数据分析、推荐优化咨询服务,他的邮件是:stucchio@gmail.com html

“你有多少大数据和Hadoop的经验?”他们问我。我一直在用Hadoop,但不多处理几TB以上的任务。我基本上只是一个大数据新手——知道概念,写过代码,可是没有大规模经验。 node

接下来他们会问:“你能用Hadoop作简单的group by和sum操做吗?”我固然会,但我会说须要看看具体文件格式。 git

他们给我一个U盘,里面有全部的数据,600MB,对,他们全部的数据。不知道为何,我用pandas.read_csvPandas是一种Python数据分析库)而不是Hadoop完成了这个任务后,他们显得很不满意。 程序员

Hadoop实际上是挺局限的。它无非是运行某个通用的计算,用SQL伪代码表示就是: SELECT G(...) FROM table GROUP BY F(...) 你只能改变G和F操做,除非要在中间步骤作性能优化(这可不怎么好玩!)。其余一切都是死的。 github

(关于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这样的大炮来轰。


PS:

MapReduce explained in 41 words

Goal: count the number of books in the library.

Map: You count up shelf #1, I count up shelf #2.

(The more people we get, the faster this part goes. )

Reduce: We all get together and add up our individual counts.

相关文章
相关标签/搜索