1. 程式人生 > >(轉)Hadoop、Spark、HBase與Redis的適用性見解

(轉)Hadoop、Spark、HBase與Redis的適用性見解

由於沒有機會對Hadoop、Spark、HBase與Redis的各個特性進行測試,所以在網路上找到了這篇文章,說說Hadoop、Spark、HBase與Redis的適用性問題。

轉自 http://datainsight.blog.51cto.com/8987355/1426538

問題導讀:
1.你認為Hadoop適用什麼場景?
2.Spark適用於什麼場景?
3.HBase與 Redis各有什麼特點?

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版阿里旺旺,後臺是HBase;小米的米聊用的也是HBase;移動某省公司的手機詳單查詢系統,去年也由原先的Oracle改成了一個32節點的HBase叢集——兄弟們,這些可都是知名大公司的關鍵應用啊,夠能說明問題了吧。


實際上從HBase的技術特點上看,它特別適用於簡單資料寫入(如“訊息類”應用)和海量、結構簡單資料的查詢(如“詳單類”應用)。在上面提到的4個HBase的應用中,Facebook訊息、WEB版阿里旺旺、米聊等均屬於以資料寫入為主的訊息類應用,而移動公司的手機詳單查詢系統則屬於以資料查詢為主的詳單類應用。


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在功能上比較類似,比如它們都屬於NoSQL級別的資料庫,都支援資料分片等,關鍵的不同點實際上只有一個:對HBase而言,一旦資料被成功寫入,從原理上看是不會丟的,因為它有Writa-ahead Log(功能上類似於Oracle REDO);而對於Redis而言,即便是配置了主從複製功能,在Failover時完全存在發生資料丟失的可能(如果不配置主從複製,那麼丟失的資料會更多),因為它第一沒有類似REDO的重做日誌,第二採用了非同步複製的方式。


關鍵還在於效能。通常,Redis的讀寫效能在100,000 ops/s左右,時延一般為10~70微妙左右[4][5];而HBase的單機讀寫效能一般不會超過1,000ops/s,時延則在1~5毫秒之間[3]。忽略其中的硬體因素,100倍的讀寫效能差異已經足夠說明問題了。順便提一下的是,Redis在Tuning上還是比較講究的,比如說,當使用numactl(或taskset)將Redis程序繫結到同一個CPU的不同CORE上時,它的效能一般可以提升30%左右[6],在一些特別的場景下甚至可以有近一倍的提升。


從上述的功能和效能比較上,我們就很容易的總結出HBase和Redis各自的適用範疇:
1)當用來支撐簡單“訊息類”應用時,如果資料失敗是不能容忍的,那就用只能用HBase;如果需要一個高效能的環境,而且能夠容忍一定的資料丟失,那完全可以考慮使用Redis。


2)Redis很適合用來做快取,但除此之外,它實際上還可以在一些“讀寫分離”的場景下作為“讀庫”來用,特別是用來存放Hadoop或Spark的分析結果。
有不少人認為Redis只適合用作“快取”,根據我的理解,這主要是基於以下2個原因:第一,Redis在設計上存在資料丟失的可能性;第二,當無法將資料全部HOLD在記憶體中時,其讀寫效能會急劇下降到每秒幾百ops[6],這一現象類似於Google開源的Leveldb[7],Facebook的RocksDB團隊的通過Performance Benchmark也證實了這一現象的存在[8]。但是,當用作“讀庫”或用於支撐允許資料丟失的“訊息類”應用時,這兩個問題實際上都沒有關係。

[1] Hadoop雖然強大,但不是萬能的。http://database.51cto.com/art/201402/429789.htm
[2] Hiveover HBase和Hive over HDFS效能比較分析。http://superlxw1234.iteye.com/blog/2008274
[3] Hbase效能測試。http://www.cnblogs.com/colorfulkoala/archive/2013/05/13/3076139.html
[4] 網際網路利器 Redis記憶體資料庫效能評測。http://tech.it168.com/a2012/1011/1406/000001406978_all.shtml
[5] Howfast is Redis?http://redis.io/topics/benchmarks
[6] Redis千萬級的資料量的效能測試。http://www.cnblogs.com/lovecindywang/archive/2011/03/03/1969633.html
[7] Leveldb.https://code.google.com/p/leveldb/
[8] RocksDBbenchmark results. https://github.com/facebook/rocksdb/wiki/Performance-Benchmarks

相關推薦

HadoopSparkHBaseRedis適用性見解

由於沒有機會對Hadoop、Spark、HBase與Redis的各個特性進行測試,所以在網路上找到了這篇文章,說說Hadoop、Spark、HBase與Redis的適用性問題。 轉自 http://datainsight.blog.51cto.com/8987355/142

C++ 值傳遞指標傳遞引用傳遞詳解

一直以來對函式的值傳遞引用傳遞理解很模糊,這篇文章可以說是給自己掃盲了。 值傳遞:實參不會發生改變,是因為形參傳遞的是不是實參的源地址(形參和實參地址不一樣)。不影響實參 指標傳遞:本質也是值傳遞,只不過傳遞的是實參的地址(形參實參的地址一樣) 地址的副本 引用傳遞:傳遞的是實參的別名,操作地址就是實參

深入理解DIPIoCDI以及IoC容器

最近在學習Ioc,在網上找到一篇好文章收藏一下。 原文地址:http://www.cnblogs.com/liuhaorain/p/3747470.html 摘要 面向物件設計(OOD)有助於我們開發出高效能、易擴充套件以及易複用的程式。其中,OOD有一個重

大資料晉級之路5HadoopSpark,Storm綜合比較

大資料框架:Spark vs Hadoop vs Storm 目錄 Hadoop Spark Storm   大資料時代,TB級甚至PB級資料已經超過單機尺度的資料處理,分散式處理系統應運而生。 知識預熱 「專治不明覺厲」之“大資料

論python工廠函數內建函數

符號 靜態 iss == hex 功能 小寫 生產 find() 所謂工廠函數就是指這些內建函數都是類對象, 當你調用它們時,實際上是創建了一個類實例。 工廠函數: int(),long(),float(),complex(),bool() str(),unicode(

HashMap底層實現原理/HashMapHashTable區別/HashMapHashSet區別

eem 實現原理 ger 銀行 索引 target 聲明 到你 們的 ①HashMap的工作原理 HashMap基於hashing原理,我們通過put()和get()方法儲存和獲取對象。當我們將鍵值對傳遞給put()方法時,它調用鍵對象的hashCode()方法來計算has

Java GC - 監控回收行為日誌分析

1. 簡介     在上一篇介紹<Java GC - 垃圾回收機制>, 本文將介紹如何監控 Javc GC 行為,同時涉及一些GUI工具的使用(雖然有些已經很老並不再更新),監控GC在於判斷JVM是否在良好高效地工作並且是否需要投入效能調優(主要包括應用程

Win32應用程式的載入啟動分析

 轉自 chenxixia 的 Blog Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=455591 設有一個Win32下的可執行檔案MyApp.exe,這是一個Win32應用程式,符合標準的PE格式。

Windows10下的docker安裝入門 使用docker toolbox安裝docker

查看 ads 而不是 tar bubuko 安裝docker install 流行 移植 Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相

大資料叢集遇到的問題HadoopSparkHivekafkaHbasePhoenix

大資料平臺中遇到的實際問題,整理了一下,使用CDH5.8版本,包括Hadoop、Spark、Hive、kafka、Hbase、Phoenix、Impala、Sqoop、CDH等問題,初步整理下最近遇到的問題,不定期更新。 啟動nodemanager失敗 2016-09-07

8字符編碼-Python

如何 tab wid cnblogs 錯誤 此刻 str 網絡 額外 一 了解字符編碼的知識儲備 1. 文本編輯器存取文件的原理(nodepad++,pycharm,word)     打開編輯器就打開了啟動了一個進程,是在內存中的,所以在編輯器編寫的內容也都是存放與內存中

C語言的條件編譯#if, #elif, #else, #endif#ifdef, #ifndef

n+1 ifdef int pan 不能 ica 推薦 代碼 表達式 有些程序在調試、兼容性、平臺移植等情況下可能想要通過簡單地設置一些參數就生成一個不同的軟件,這當然可以通過變量設置,把所有可能用到的代碼都寫進去,在初始化時配置,但在不同的情況下可能只用到一部分代碼,就

PostGIS+QGIS+GeoServer+OpenLayers實現數據的存儲服務的發布以及地圖的顯示

切換 以及 data- about 100% tail error -s image http://blog.csdn.net/gisshixisheng/article/details/41575833 標題比較長,主要呢是實現以下幾點: 1、將shp數據導入到Pos

Scala中協變(+)逆變(-)上界(<:)下界(>:)簡單介紹

定義類 word ref 一個 pla 而不是 關系 repl 協變 看源碼的時候看到: trait ExtensionId[T <: Extension] {沒見過這個符號啊<: Scala上界(<:)和下界(>:) 1) U >: T

Java設計模式補充:回調模式事件監聽器模式觀察者模式

應該 hand 關閉 lan china 關註 update 使用 event 一、回調函數 為什麽首先會講回調函數呢?因為這個是理解監聽器、觀察者模式的關鍵。 什麽是回調函數 所謂的回調,用於回調的函數。 回調函數只是一個功能片段,由用戶按照回調函數調用約定來實現的

.NETC#和ASP.NET三才之間的區別

編程 tail 基於web 發現 我認 ava 微軟 框架 framwork 經常有同學會在.NET、C#和ASP.NET這三者之間區別不清楚,到底它們之間有什麽聯系呢?在這裏我給大家歸納如下: 1、.NET是一個平臺,一個抽象的平臺的概念。

ShellXtermGnome-TerminalKonsole簡介

外觀 圖形化 nal 全屏 拖放 inux win osc png 什麽是Shell? 簡單的說, Shell就是一個小程序,這個小程序可以接受來自鍵盤的命令並把這些命令發送到操作系統,再有系統來執行。在過去,在安裝有Unix的計算機上,這是唯一的可用的交互式操作。而如今

MySQL:日期函數時間函數處理

減少 expr lec datetime style pan 獲取 相減 sel date_add() 增加MYSQL 獲取當前時間加上一個月 update user set leverstart=now(),leverover=date_add(NOW(), int

高性能高可用的分布式架構體系

基礎上 keepal 第三方應用 備份 用戶 即時通訊 banner 協同辦公 產品 在2B企業服務、雲計算、移動互聯網領域,專業的雲平臺服務裏,分布式技術為支撐平臺正常運作關鍵性技術。從商業利潤和運維成本角度出發,千方百計榨幹服務器的每一分性能很大程度上影響著網站的

Java 位運算(移位異或

位與 異或 print 我們 如果 運行 str 換算 system public class Test { public static void main(String[] args) { // 1、左移( << ) // 0000 0000 00