本文原名“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_csvPandas是一种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这样的大炮来轰。

刘江总编发布于GEEK头条 2013-09-18 09:24
分享到:  
评论
 

已有35条评论

  • 最新
ljx930520 2015-01-31 14:28
怎样用pandas读GB级的数据啊?~内存溢出了
0
我是一只魂 2015-04-13 19:13
你好,不知道你的问题解决没? 我用的是pandas0.16版本,python2.7.5,用pandas加载几百兆的数据出现MemoryError。求助解决!
0
毕加索爱编程 2014-09-26 20:08
了解hadoop是必须的,现在hadoop更新的很快,基本上一两个月就能发布一个新版本。 各种性能也在提高。 即使对hadoop的褒贬不一,但是不能否认它是一个非常优秀的分布式平台,大家可以多了解一点。 目前最新的hadoop是hadoop2.5.1,界面什么的都更新了
0
yfteach 2014-08-09 18:34
云凡教育Hadoop2.x架构详解和伪分布式环境搭建视频分享http://www.yfteach.com
0
haitao 2014-03-29 11:29
百G、10亿条级别,mssql2005就完全胜任——内存大点、分区表
0
Mea_Culpa 2013-12-16 15:24
现在都好高级,让我这用awk 分进程的情何以堪...
0
baidu_23542553 2014-11-19 17:08
同感啊 awk飘过
0
瓜瓜东西 2013-11-14 08:45
hadoop也不是啥高新的技术,只是现阶段说有的技术排列组合到一起,实现了一些功能,大数据库处理,内存处理能力已经到天花板了,技术不好提升了
0
红帆软件 2013-09-21 15:00 来自 新浪微博
路要自己走,乐在其中才有建树,追风总会随风而散
0
hills 2013-09-20 22:47
个人认为,Hadoop的分布式计算和可以理论上无限的水平扩展是优势,业务复杂度一般的TPS达到1万是小CASE。
0
BYSF_XF 2013-09-20 12:46
我上次去一家公司,做小项目的,面试居然还问到了负载均衡什么的,简直扯蛋
-1
cheniwantyou 2013-09-20 12:19
那些小破公司动不动也吹神马hadoop啊,其实都是人傻没办法。这些完全就是炒作罢了
0
hctsai 2013-09-20 01:28
真懷疑作者學歷怎麼拿的,還當過CTO。MapReduce 解決的不只是 Scalability 問題,精隨也不只是把工作分到不同節點運算後再合併。更關鍵的解決 Atomic運算的互鎖卻忽略不提。談論Big Data 只考慮數據輛大小,而不考慮處理速度、資料變異性、容錯,真的是誤導新人。
1
期科比 2015-10-11 12:20

说得有理啊

0
车东 2013-09-19 19:39 来自 新浪微博
@梁斌penny 你研究的内存数据库有对此过一些来源引擎吗?
0
xg1103 2013-09-19 17:14
路过~~~~~~~~~
0
搬砖工人 2013-09-19 09:54
其实Hive也是写的SQL语句
0
getclass 2013-09-18 22:04
这句话说的太精辟了 “Hadoop其实是挺局限的。它无非是运行某个通用的计算,用SQL伪代码表示就是: SELECT G(...) FROM table GROUP BY F(...) 你只能改变G和F操作,除非要在中间步骤做性能优化(这可不怎么好玩!)。其他一切都是死的。”
0
我心向着佛 2013-09-18 19:24 来自 新浪微博
[围观]
0
旖旎嫣儿 2013-09-18 16:14 来自 新浪微博
看到了,私信了
0
Bai-Bertie 2013-09-18 16:13 来自 新浪微博
有道理!
0
iamxiami 2013-09-18 15:05
每小时1TB的数据呢? 公司做的项目,每小时差不多可能有1TB的数据. 用户有要求需要秒级查询数据(不统计),为了满足多要求,只能选择冗余多份存放HBASE,更有趣是客户可能需要个IN的操作,有几个列是树型的结构,很可能他查一个数据,条件就几MB,转成几万条查询... 还需要分页... NND,对N多查询自己做seek... 哎~ 真的没什么好替换的方案,被逼的!
0
普世编程技术 2013-09-20 11:49
有个概念叫OLAP知道不? 复杂的,批量数据,就应该先安排作业,然后一天之后才拿到结果。 hadoop这样的东西,只适合google这等即使搜索的业务,所以google自己研究论文,自己实现自己的业务技术。 是个人,是个公司就讲hadoop,就和非洲某个吃不饱饭的小村庄,讨论人家美国总统选举一样荒唐可笑。
0
sniffer12345 2013-09-18 14:42
即便是5TB 你上mysql集群也比hadoop好得多
-1
juefan_c 2013-09-18 14:39
也不见得很对, Hadoop能处理上TB级别的数据, 也能处理100M级别的小数据, 但不见得拿100M级别的数据用其它工具处理就是明智的, 例如这100M的数据得从1TB的数据中生成时, 如果反复迁移数据的话, 那成本更大!
0
胡争辉 2013-09-18 14:33 来自 新浪微博
期待翻译后我好转发
0
白硕SH 2013-09-18 14:18 来自 新浪微博
太拽了!
0
胡争辉 2013-09-18 13:57 来自 新浪微博
浇灭NoSQL虚火从清算Hadoop入手
0
好兵帅克 2013-09-18 13:52
用Hadoop之前应该三思而行,别500MB数据这样的蚊子,你也拿Hadoop这样的大炮来轰。这才是核心!
2
ictcamera 2013-09-18 13:51
国内砖家一般不希望把这层纸给捅破
0
外号cook 2013-09-18 13:29
不太懂
0
无聊找乐 2013-09-18 12:27
其实用的人未必不知道这些。 炒作新概念使用新技术 不过是一种营销手段罢了~
0
Well工作室 2013-09-18 11:59
因地制宜!
0
308682805 2013-09-18 11:47
这个是准确的
0
m101162004 2013-09-18 11:28
 

别老扯什么hadoop,你的数据根本不够大的更多相关文章

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

    本文原名“Don't use Hadoop when your data isn't that big ”,出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯朗研究所博士后,搞过 ...

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

    本文原名"Don't use Hadoop when your data isn't that big ",出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯 ...

  3. 应对Hadoop集群数据疯长,这里祭出了4个治理对策!

    一.背景 在目前规模比较大的互联网公司中,总数据量能达到10PB甚至几十PB数据量的公司,我认为中国已经有超过了20家了.而在这些公司中,也有很多家公司的 日数据增长达到100TB+ 了. 所以我们每 ...

  4. Hadoop! | 大数据百科 | 数据观 | 中国大数据产业观察_大数据门户

        你正在使用过时的浏览器,Amaze UI 暂不支持. 请 升级浏览器 以获得更好的体验! 深度好文丨读完此文,就知道Hadoop了! 来源:BiThink 时间:2016-04-12 15:1 ...

  5. Hadoop权威指南:从Hadoop URL读取数据

    [TOC] Hadoop权威指南:从Hadoop URL读取数据 使用java.net.URL对象从Hadoop文件系统读取文件 实现类似linux中cat命令的程序 文件名 HDFSCat.java ...

  6. Hadoop 一: NCDC 数据准备

    Hadoop 本文介绍Hadoop- The Definitive Guide一书中的NCDC数据准备,为后面的学习构建大数据环境; 环境 3节点 Hadoop 2.7.3 集群; java vers ...

  7. hadoop(一)之初识大数据与Hadoop

    前言 从今天起,我将一步一步的分享大数据相关的知识,其实很多程序员感觉大数据很难学,其实并不是你想象的这样,只要自己想学,还有什么难得呢? 学习Hadoop有一个8020原则,80%都是在不断的配置配 ...

  8. Hadoop专业解决方案-第1章 大数据和Hadoop生态圈

    一.前言: 非常感谢Hadoop专业解决方案群:313702010,兄弟们的大力支持,在此说一声辛苦了,经过两周的努力,已经有啦初步的成果,目前第1章 大数据和Hadoop生态圈小组已经翻译完成,在此 ...

  9. Hadoop 1: NCDC 数据准备

    本文介绍Hadoop- The Definitive Guide一书中的NCDC数据准备,为后面的学习构建大数据环境; 环境 3节点 Hadoop 2.7.3 集群; java version &qu ...

随机推荐

  1. 使用浏览器自定义协议启动本地程序(.EXE文件)

    比如,自定义协议名称为 myapp,要启动的本地程序为 myapp.exe. 1)首先向注册表添加如下内容: Windows Registry Editor Version 5.00 [HKEY_CL ...

  2. 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)

    1.安装mkyaffsimage, mkyaffs2image命令(用来制作yaffs文件系统) 第一个命令针对Flash小页512B,第二个针对Flash大页2KB首先下载压缩文件 yaffs_so ...

  3. 【Java每日一题】20170301

    20170228问题解析请点击今日问题下方的“[Java每日一题]20170301”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  4. python基础学习(十)字符串

    字符串的定义 字符串 就是 一串字符,是编程语言中表示文本的数据类型 在 Python 中可以使用 一对双引号 " 或者 一对单引号 ' 定义一个字符串 虽然可以使用 \" 或者 ...

  5. js的介绍 及用法 常量 变量!

    1.js介绍 js全程叫javascript,但不是java 他是一门前台语言 而java是后台语言. js的作者是布兰登 爱奇 前台语言:运行在客户端 后台语言:跟数据库有关的. 2.能干什么? 页 ...

  6. 微服务创建——Ubuntu搭建GitLab

    Ubuntu呢,用的国产麒麟,可能对于用习惯了Windows操作系统的人来说使用UKylin会很难受吧,开发的人倒没什么,不过就是命令行的问题 那么,怎么搭建一个完整的GitLab呢,一步步来操作吧, ...

  7. 使用Linux的Crontab定时执行PHP脚本

    0 */6 * * * /home/kdb/php/bin/php /home/kdb/apache/htdocs/lklkdbplatform/kdb_release/Crontab/index.p ...

  8. jfinal框架学习过程

    刚刚学习jfinal,通过一天左右的时间大体上理解了这个框架的用法,我对他的理解是JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功 ...

  9. 09-HTML-form标签

    <html> <head>  <title>form标签学习</title>  <meta charset="utf-8"/& ...

  10. 13.Odoo产品分析 (二) – 商业板块(6) –采购(3)

    接上一篇  查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (二) – 商业板块(6) –采购(2) 7. 仓库 仓库是在安装采购管理模块时出现的菜单.用于管理工厂库存,包括已经在手的货物 ...