Hadoop、Spark、HBase與Redis的適用性討論(全文)
2014-06-15 11:22:03
url: http://datainsight.blog.51cto.com/8987355/1426538
最近在網上又看到有關於Hadoop適用性的討論[1]。想想今年大資料技術開始由互連網巨頭走向中小互連網和傳統行業,估計不少人都在考慮各種“紛繁複雜”的大資料技術的適用性的問題。這兒我就結合我這幾年在Hadoop等大資料方向的工作經驗,與大家討論一下Hadoop、Spark、HBase及Redis等幾個主流大資料技術的使用情境(首先聲明一點,本文中所指的Hadoop,是很“狹義”的Hadoop,即在HDFS上直接跑MapReduce的技術,下同)。
我這幾年實際研究和使用過大資料(包含NoSQL)技術包括Hadoop、Spark、HBase、Redis和MongoDB等,這些技術的共同特點是不適合用於支撐事務型應用,特別是與“錢”相關的應用,如“訂購關係”、“超市交易”等,這些場合到目前為止還是Oracle等傳統關係型資料庫的天下。
1. Hadoop Vs. Spark
Hadoop/MapReduce和Spark最適合的都是做離線型的資料分析,但Hadoop特別適合是單次分析的資料量“很大”的情景,而Spark則適用於資料量不是很大的情景。這兒所說的“很大”,是相對於整個叢集中的記憶體容量而言的,因為Spark是需要將資料HOLD在記憶體中的。一般的,1TB以下的資料量都不能算很大,而10TB以上的資料量都是算“很大”的。比如說,20個節點的一個叢集(這樣的叢集規模在大資料領域算是很小的了),每個節點64GB記憶體(不算很小,但也不能算大),共計1.28TB。讓這樣規模的一個叢集把500GB左右的資料HOLD在記憶體中還是很輕鬆的。這時候,用Spark的執行速度都會比Hadoop快,畢竟在MapReduce過程中,諸如spill等這些操作都是需要寫磁碟的。
這兒有2點需要提一下:1)一般情況下,對於中小互連網和企業級的大資料應用而言,單次分析的數量都不會“很大”,因此可以優先考慮使用Spark,特別是當Spark成熟了以後(Hadoop已經出到2.5了,而Spark才剛出1.0呢)。比如說,中國移動的一個省公司(在企業級,移動公司的資料量還是算相當大的),他們單次分析的數量一般也就幾百GB,連1TB都很少超過,更不用說超過10TB了,所以完全可以考慮用Spark逐步替代Hadoop。2)業務通常認為Spark更適用於機器學習之類的“迭代式”應用,但這僅僅是“更”。一般地,對於中等規模的資料量,即便是不屬於“更適合”範疇的應用,Spark也能快2~5倍左右。我自己做過一個對比測試,80GB的壓縮資料(解壓後超過200GB),10個節點的叢集規模,跑類似“sum+group-by”的應用,MapReduce花了5分鐘,而spark只需要2分鐘。
2. HBase
對於HBase,經常聽到的一個說法是:HBase只適合於支撐離線分析型應用,特別是做為MapReduce任務的後台資料來源。持這個觀點不少,甚至在國內一個響噹噹的電信裝置供應商中,HBase也是被歸入資料分析產品線的,並明確不建議將HBase用於線上應用。可實際情況真是這樣嗎。讓我們先看看它的幾大案例:Facebook的訊息類應用,包括Messages、Chats、Emails和SMS系統,用的都是HBase;淘寶的WEB版阿里WangWang,後台是HBase;小米的米聊用的也是HBase;移動某省公司的手機詳單查詢系統,去年也由原先的Oracle改成了一個32節點的HBase叢集——兄弟們,這些可都是知名大公司的關鍵應用啊,夠能說明問題了吧。
實際上從HBase的技術特點上看,它特別適用於簡單資料寫入(如“訊息類”應用)和海量、結構簡單資料的查詢(如“詳單類”應用)。在上面提到的4個HBase的應用中,Facebook訊息、WEB版阿里WangWang、米聊等均屬於以資料寫入為主的訊息類應用,而移動公司的手機詳單查詢系統則屬於以資料查詢為主的詳單類應用。
HBase的另一個用途是作為MapReduce的後台資料來源,以支撐離線分析型應用。這個固然可以,但其效能如何則是值得商榷的。比如說,superlxw1234同學通過實驗對比了“Hive over HBase”和“Hive over HDFS”後驚奇的發現[2],除了在使用rowkey過濾時,基於HBase的效能上略好於直接基於HDFS外,在使用全表掃描和根據value過濾時,直接基於HDFS方案的效能均比HBase好的多——這真是一個謬論啊。不過對於這個問題,我個人感覺從原理上看,當使用rowkey過濾時,過濾程度越高,基於HBase方案的效能必然越好;而直接基於HDFS方案的效能則跟過濾程度沒有關係。
3. HBase Vs. Redis
HBase和Redis在功能上比較類似,比如它們都屬於