為什么說(shuō)Storm比Hadoop 快?
文 | 楊曉青 張?jiān)坡?/p>
“快”這個(gè)詞是不明確的,專業(yè)屬于點(diǎn)有兩個(gè)層面:
1.時(shí)延 , 指數(shù)據(jù)從產(chǎn)生到運(yùn)算產(chǎn)生結(jié)果的時(shí)間,題主的“快”應(yīng)該主要指這個(gè)。
2. 吞吐, 指系統(tǒng)單位時(shí)間處理的數(shù)據(jù)量。
首先明確一點(diǎn),在消耗資源相同的情況下,一般來(lái)說(shuō)storm的延時(shí)低于mapreduce。但是吞吐也低于mapreduce。
storm的網(wǎng)絡(luò)直傳、內(nèi)存計(jì)算,其時(shí)延必然比hadoop的通過(guò)hdfs傳輸?shù)偷枚?當(dāng)計(jì)算模型比較適合流式時(shí),storm的流式處理,省去了批處理的收集數(shù)據(jù)的時(shí)間;因?yàn)閟torm是服務(wù)型的作業(yè),也省去了作業(yè)調(diào)度的時(shí)延。所以從時(shí)延上來(lái)看,storm要快于hadoop。
說(shuō)一個(gè)典型的場(chǎng)景,幾千個(gè)日志生產(chǎn)方產(chǎn)生日志文件,需要進(jìn)行一些ETL操作存入一個(gè)數(shù)據(jù)庫(kù)。
假設(shè)利用hadoop,則需要先存入hdfs,按每一分鐘切一個(gè)文件的粒度來(lái)算(這個(gè)粒度已經(jīng)極端的細(xì)了,再小的話hdfs上會(huì)一堆小文件),hadoop開(kāi)始計(jì)算時(shí),1分鐘已經(jīng)過(guò)去了,然后再開(kāi)始調(diào)度任務(wù)又花了一分鐘,然后作業(yè)運(yùn)行起來(lái),假設(shè)機(jī)器特別多,幾鈔鐘就算完了,然后寫(xiě)數(shù)據(jù)庫(kù)假設(shè)也花了很少的時(shí)間,這樣,從數(shù)據(jù)產(chǎn)生到***可以使用已經(jīng)過(guò)去了至少兩分多鐘。
而流式計(jì)算則是數(shù)據(jù)產(chǎn)生時(shí),則有一個(gè)程序去一直監(jiān)控日志的產(chǎn)生,產(chǎn)生一行就通過(guò)一個(gè)傳輸系統(tǒng)發(fā)給流式計(jì)算系統(tǒng),然后流式計(jì)算系統(tǒng)直接處理,處理完之后直接寫(xiě)入數(shù)據(jù)庫(kù),每條數(shù)據(jù)從產(chǎn)生到寫(xiě)入數(shù)據(jù)庫(kù),在資源充足時(shí)可以在毫秒級(jí)別完成。
當(dāng)然,跑一個(gè)大文件的wordcount,本來(lái)就是一個(gè)批處理計(jì)算的模型,你非要把它放到storm上進(jìn)行流式的處理,然后又非要讓等所有已有數(shù)據(jù)處理完才讓storm輸出結(jié)果,這時(shí)候,你再把它和hadoop比較快慢,這時(shí),其實(shí)比較的不是時(shí)延,而是比較的吞吐了。
storm是典型的流計(jì)算系統(tǒng),mapreduce是典型的批處理系統(tǒng)。下面對(duì)流計(jì)算和批處理系統(tǒng)流程。
整個(gè)數(shù)據(jù)處理流程來(lái)說(shuō)大致可以分三個(gè)階段:
1. 數(shù)據(jù)采集與準(zhǔn)備
2. 數(shù)據(jù)計(jì)算(涉及計(jì)算中的中間存儲(chǔ)), 題主中的“那些方面決定”應(yīng)該主要是指這個(gè)階段處理方式。
3. 數(shù)據(jù)結(jié)果展現(xiàn)(反饋)
1)數(shù)據(jù)采集階段,目前典型的處理處理策略:數(shù)據(jù)的產(chǎn)生系統(tǒng)一般出自頁(yè)面打點(diǎn)和解析DB的log,流計(jì)算將數(shù)據(jù)采集中消息隊(duì)列(比如kafaka,metaQ,timetunle)等。批處理系統(tǒng)一般將數(shù)據(jù)采集進(jìn)分布式文件系統(tǒng)(比如HDFS),當(dāng)然也有使用消息隊(duì)列的。我們暫且把消息隊(duì)列和文件系統(tǒng)稱為預(yù)處理存儲(chǔ)。二者在延時(shí)和吞吐上沒(méi)太大區(qū)別,接下來(lái)從這個(gè)預(yù)處理存儲(chǔ)進(jìn)入到數(shù)據(jù)計(jì)算階段有很大的區(qū)別,流計(jì)算一般在實(shí)時(shí)的讀取消息隊(duì)列進(jìn)入流計(jì)算系統(tǒng)(storm)的數(shù)據(jù)進(jìn)行運(yùn)算,批處理一系統(tǒng)一般會(huì)攢一大批后批量導(dǎo)入到計(jì)算系統(tǒng)(hadoop),這里就有了時(shí)延的區(qū)別。
2)數(shù)據(jù)計(jì)算階段,流計(jì)算系統(tǒng)(storm)的時(shí)延低主要有一下幾個(gè)方面
A: storm 進(jìn)程是常駐的,有數(shù)據(jù)就可以進(jìn)行實(shí)時(shí)的處理
mapreduce 數(shù)據(jù)攢一批后由作業(yè)管理系統(tǒng)啟動(dòng)任務(wù),Jobtracker計(jì)算任務(wù)分配,tasktacker啟動(dòng)相關(guān)的運(yùn)算進(jìn)程
B: stom每個(gè)計(jì)算單元之間數(shù)據(jù)之間通過(guò)網(wǎng)絡(luò)(zeromq)直接傳輸。
mapreduce map任務(wù)運(yùn)算的結(jié)果要寫(xiě)入到HDFS,在于reduce任務(wù)通過(guò)網(wǎng)絡(luò)拖過(guò)去運(yùn)算。相對(duì)來(lái)說(shuō)多了磁盤(pán)讀寫(xiě),比較慢
C: 對(duì)于復(fù)雜運(yùn)算
storm的運(yùn)算模型直接支持DAG(有向無(wú)環(huán)圖)
mapreduce 需要肯多個(gè)MR過(guò)程組成,有些map操作沒(méi)有意義的
3)數(shù)據(jù)結(jié)果展現(xiàn)
流計(jì)算一般運(yùn)算結(jié)果直接反饋到最終結(jié)果集中(展示頁(yè)面,數(shù)據(jù)庫(kù),搜索引擎的索引)。而mapreduce一般需要整個(gè)運(yùn)算結(jié)束后將結(jié)果批量導(dǎo)入到結(jié)果集中。
實(shí)際流計(jì)算和批處理系統(tǒng)沒(méi)有本質(zhì)的區(qū)別,像storm的trident也有批概念,而mapreduce可以將每次運(yùn)算的數(shù)據(jù)集縮小(比如幾分鐘啟動(dòng)一次),facebook的puma就是基于hadoop做的流計(jì)算系統(tǒng)。