分布計(jì)算系統(tǒng)框架,按照數(shù)據(jù)集的特點(diǎn)來(lái)說(shuō),主要分為data-flow和streaming兩種。data-flow主要是以數(shù)據(jù)塊為數(shù)據(jù)源來(lái)處理數(shù)據(jù),代表有:MR、Spark等,我稱作它們?yōu)榇髷?shù)據(jù),而streaming主要是處理單位內(nèi)得到的數(shù)據(jù),這種方式,更注重于實(shí)時(shí)性,主要包括Strom、JStorm和Samza等,我稱作它們?yōu)榭鞌?shù)據(jù)。
在這篇文章中,我主要談?wù)搒treaming相關(guān)的框架。
第一個(gè)是Storm,一個(gè)實(shí)時(shí)計(jì)算系統(tǒng),它假定數(shù)據(jù)源是動(dòng)態(tài)的,可以向流水一樣處理數(shù)據(jù)。
它的特點(diǎn)是:低延遲、高性能、分布式、可擴(kuò)展和容錯(cuò)性。
架構(gòu)如下圖所示。

Storm的具體概念可以參照:http://blog.csdn.net/hljlzc2007/article/details/12976211,這里不做具體介紹。
Storm目前算是最最穩(wěn)定的開(kāi)源流式處理框架,但是個(gè)人認(rèn)為它有兩個(gè)問(wèn)題。
1. Storm雖然支持多個(gè)語(yǔ)言編寫(xiě)spout和bolt端的代碼,但是它的主要技術(shù)實(shí)現(xiàn)是clojure,這給玩大數(shù)據(jù)、開(kāi)源的朋友帶來(lái)了極大的不變,因?yàn)榇蠹視?huì)的語(yǔ)言不是以java和C++等大眾語(yǔ)言為主,這樣的話,變得不可控了,難以深入了解、修改其細(xì)節(jié)。
2. Storm可以支持在Yarn(Hadoop 2.0)上,可以和其他開(kāi)源框架共享Hadoop集群的資源,但是性能不佳,這個(gè)有待Storm改善
當(dāng)然無(wú)論如何,Storm依然是目前開(kāi)源流式處理框架的王者。
第二個(gè)我想說(shuō)的是JStorm,這個(gè)是阿里做的,算是Storm的另一個(gè)實(shí)現(xiàn),它用的語(yǔ)言是Java.
特點(diǎn):
1. 客戶端的API與Storm基本上是一致的,如果從Storm遷移過(guò)來(lái),不需要修改bolt和spout的代碼
2. Jstrom比Strom穩(wěn)定,速度更快
3. 提供了一些新的特性
大家有興趣可以去玩玩,項(xiàng)目地址https://github.com/alibaba/jstorm
第三個(gè)是Samza
Samza是由LinkedIn開(kāi)源的一個(gè)技術(shù),它是一個(gè)開(kāi)源的分布式流處理系統(tǒng),非常類似于Storm。不同的是它運(yùn)行在Hadoop之上,并且使用了自己開(kāi)發(fā)的Kafka分布式消息處理系統(tǒng)。
這是Linkin開(kāi)發(fā)的一個(gè)小而美的項(xiàng)目,如何美呢?
1. 只有幾千行代碼,完成的功能就可以和Storm媲美,當(dāng)然目前還有很多的不足
2. 和Kafka結(jié)合緊密,更方便的處理數(shù)據(jù)
3. 運(yùn)行在Yarn上
之前我做過(guò)的一個(gè)項(xiàng)目,是Kafka + Storm + ElasticSearch,將來(lái)完全可以將Storm替換成Samza,這樣的話,還可以利用Hadoop集群的資源,做一些存儲(chǔ)、離線分析的功能。將實(shí)時(shí)處理和離線分析都運(yùn)行在Hadoop上,不得不說(shuō)Samza是一個(gè)偉大的項(xiàng)目,這樣可以減少項(xiàng)目的增長(zhǎng)復(fù)雜度,利于維護(hù),還是那句話,小而美的東西,更受歡迎一些。
架構(gòu):
Samza主要包含三層,
1. 流處理層 --> Kafka
2. 執(zhí)行層 --> YARN
3. 處理層 --> Samza API
Samza的流處理層和執(zhí)行層都是可插拔式的,開(kāi)發(fā)人員可以使用其他框架來(lái)替代,不局限于上述兩種技術(shù)。
Samza提供了一個(gè)YARN ApplicationMaster,和YARN job,運(yùn)行在集群之外,下圖中不同顏色代表不同的主機(jī)。
Samza客戶端告訴YARN的Resouce Manager,它想啟動(dòng)一個(gè)Samza job, YARN RM 告訴YARN Node manager,分配空間給YARN ApplicationMaster,NM指定完空間后,YARN container會(huì)運(yùn)行Samza Task Runner。

Samza狀態(tài)管理
流式處理數(shù)據(jù)對(duì)狀態(tài)的管理是很難的,由于數(shù)據(jù)是流動(dòng)的,本身沒(méi)有狀態(tài),這樣就需要靠歷史數(shù)據(jù)來(lái)記錄應(yīng)用的場(chǎng)合,Samza提供了一個(gè)內(nèi)部的key-value數(shù)據(jù)庫(kù),它是基于LevelDB,運(yùn)行的JVM之外的,使用它來(lái)存儲(chǔ)歷史數(shù)據(jù)。這樣的做的好處是:
1. 減少JVM的開(kāi)銷
2. 使用內(nèi)部存儲(chǔ),極大提高的吞吐率
3. 減少并發(fā)操作
Samza處理流程.
下圖是Samza官方給的一例子,根據(jù)Member ID分組,計(jì)算頁(yè)面訪問(wèn)次數(shù)。入口消息分別來(lái)自Machine1、2,出口是Machine3,我們可以這樣理解,消息分散在不同的消息系統(tǒng)中(Kafka),Samza從不同的Kafka中讀取topic,在將topic進(jìn)行處理后,發(fā)送到Machine3,這里不做過(guò)多分解,具體可以參照官方文檔。

項(xiàng)目地址:https://github.com/apache/incubator-samza
官方文件:http://samza.incubator.apache.org/
以上給了我們無(wú)限遐想,Storm是否會(huì)保持領(lǐng)先地位,Samza能否取而代之呢,無(wú)論如何,作為開(kāi)發(fā)者來(lái)說(shuō),幾千行代碼,我都迫不及待去要讀一下了。