別老扯什么Hadoop了,你的數據根本不夠大
英文原文: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 之前應該三思而行,別 500
MB 數據這樣的蚊子,你也拿 Hadoop 這樣的大炮來轟。