天天看點

大資料架構師:hadoop、Storm該選哪一個?

首先整體認識:Hadoop是磁盤級計算,進行計算時,資料在磁盤上,需要讀寫磁盤;Storm是記憶體級計算,資料直接通過網絡導入記憶體。讀寫記憶體比讀寫磁盤速度快n個數量級。根據Harvard CS61課件,磁盤通路延遲約為記憶體通路延遲的75000倍。是以Storm更快。

注釋:

1. 延時 , 指資料從産生到運算産生結果的時間,“快”應該主要指這個。

2. 吞吐, 指系統機關時間處理的資料量。

storm的網絡直傳、記憶體計算,其時延必然比hadoop的通過hdfs傳輸低得多;當計算模型比較适合流式時,storm的流式處理,省去了批處理的收集資料的時間;因為storm是服務型的作業,也省去了作業排程的時延。是以從時延上來看,storm要快于hadoop。

從原理角度來講:

Hadoop M/R基于HDFS,需要切分輸入資料、産生中間資料檔案、排序、資料壓縮、多份複制等,效率較低。

Storm 基于ZeroMQ這個高性能的消息通訊庫,不持久化資料。

為什麼storm比hadoop快,下面舉一個應用場景

說一個典型的場景,幾千個日志生産方産生日志檔案,需要進行一些ETL操作存入一個資料庫。

假設利用hadoop,則需要先存入hdfs,按每一分鐘切一個檔案的粒度來算(這個粒度已經極端的細了,再小的話hdfs上會一堆小檔案),hadoop 開始計算時,1分鐘已經過去了,然後再開始排程任務又花了一分鐘,然後作業運作起來,假設機器特别多,幾鈔鐘就算完了,然後寫資料庫假設也花了很少的時間,這樣,從資料産生到最後可以使用已經過去了至少兩分多鐘。

而流式計算則是資料産生時,則有一個程式去一直監控日志的産生,産生一行就通過一個傳輸系統發給流式計算系統,然後流式計算系統直接處理,處理完之後直接寫入資料庫,每條資料從産生到寫入資料庫,在資源充足時可以在毫秒級别完成。

同時說一下另外一個場景:

如果一個大檔案的wordcount,把它放到storm上進行流式的處理,等所有已有資料處理完才讓storm輸出結果,這時候,你再把它和hadoop比較快慢,這時,其實比較的不是時延,而是比較的吞吐了。

最主要的方面:Hadoop使用磁盤作為中間交換的媒體,而storm的資料是一直在記憶體中流轉的。

兩者面向的領域也不完全相同,一個是批量處理,基于任務排程的;另外一個是實時處理,基于流。

以水為例,Hadoop可以看作是純淨水,一桶桶地搬;而Storm是用水管,預先接好(Topology),然後打開水龍頭,水就源源不斷地流出來了。

Storm 的主工程師Nathan Marz表示: Storm可以友善地在一個計算機叢集中編寫與擴充複雜的實時計算,Storm之于實時處理,就好比Hadoop之于批處理。Storm保證每個消息都會得到處理,而且它很快——在一個小叢集中,每秒可以處理數以百萬計的消息。更棒的是你可以使用任意程式設計語言來做開發。

Storm的主要特點如下:

1.簡單的程式設計模型。類似于MapReduce降低了并行批處理複雜性,Storm降低了進行實時處理的複雜性。

2.可以使用各種程式設計語言。你可以在Storm之上使用各種程式設計語言。預設支援Clojure、Java、Ruby和Python。要增加對其他語言的支援,隻需實作一個簡單的Storm通信協定即可。

3.容錯性。Storm會管理工作程序和節點的故障。

4.水準擴充。計算是在多個線程、程序和伺服器之間并行進行的。

5.可靠的消息處理。Storm保證每個消息至少能得到一次完整處理。任務失敗時,它會負責從消息源重試消息。

6.快速。系統的設計保證了消息能得到快速的處理,使用ØMQ作為其底層消息隊列。

7.本地模式。Storm有一個“本地模式”,可以在處理過程中完全模拟Storm叢集。這讓你可以快速進行開發和單元測試。

在消耗資源相同的情況下,一般來說storm的延時低于mapreduce。但是吞吐也低于mapreduce。storm是典型的流計算系統,mapreduce是典型的批處理系統。下面對流計算和批處理系統流程

這個資料處理流程來說大緻可以分三個階段:

1. 資料采集與準備

2. 資料計算(涉及計算中的中間存儲), 題主中的“那些方面決定”應該主要是指這個階段處理方式。

3. 資料結果展現(回報)

1)資料采集階段,目前典型的處理處理政策:

資料的産生系統一般出自頁面打點和解析DB的log,流計算将資料采集中消息隊列(比如 kafaka,metaQ,timetunle)等。批處理系統一般将資料采集進分布式檔案系統(比如HDFS),當然也有使用消息隊列的。我們暫且把消息隊列和檔案系統稱為預處理存儲。二者在延時和吞吐上沒太大差別,接下來從這個預處理存儲進入到資料計算階段有很大的差別,流計算一般在實時的讀取消息隊列進入流計算系統(storm)的資料進行運算,批處理一系統一般會攢一大批後批量導入到計算系統(hadoop),這裡就有了延時的差別。

2)資料計算階段,流計算系統(storm)的延時低主要有一下幾個方面(針對題主的問題)

A: storm 程序是常駐的,有資料就可以進行實時的處理

mapreduce 資料攢一批後由作業管理系統啟動任務,Jobtracker計算任務配置設定,tasktacker啟動相關的運算程序

B: stom每個計算單元之間資料之間通過網絡(zeromq)直接傳輸。

mapreduce map任務運算的結果要寫入到HDFS,在于reduce任務通過網絡拖過去運算。相對來說多了磁盤讀寫,比較慢

C: 對于複雜運算

storm的運算模型直接支援DAG(有向無環圖)

mapreduce 需要肯多個MR過程組成,有些map操作沒有意義的

3)資料結果展現

流計算一般運算結果直接回報到最終結果集中(展示頁面,資料庫,搜尋引擎的索引)。而mapreduce一般需要整個運算結束後将結果批量導入到結果集中。

實際流計算和批處理系統沒有本質的差別,像storm的trident也有批概念,而mapreduce可以将每次運算的資料集縮小(比如幾分鐘啟動一次),facebook的puma就是基于hadoop做的流計算系統。

作者強力推薦閱讀文章:

大資料工程師必須掌握開源工具彙總

大資料進階工程師教你如何讀懂大資料核心技術

頂級大資料工程師需要掌握的技能

大資料、機器學習和人工智能未來發展的8個因素

大資料架構師:hadoop、Storm該選哪一個?

繼續閱讀