關於此文
最近在忙着准備校招的相關復習,所以也整理了一下上學期上課時候的學到的一些知識。剛好發現當時還寫了一篇類似於文獻綜述性質的文章,就在這里貼出來。題材是關於大數據的,也是比較火熱的一個話題,雖然現在接觸的項目與大數據不太有關聯,可能以后也不一定從事這方面的工作吧。就IT行業的研究成果來講國外期刊無論是發表速度還是質量都是高於國內,所以參考的大部分都是當時最新在核心期刊上發表的論文,參考文獻在最后一一列出。因為文章沒有多少自己的創新點,僅僅是最新、最熱技術或者分析的一個總結,所以放上來僅僅是對大數據相關前景做一個階段性匯總。篇幅較長,可能會有幾篇。 下部分鏈接
1 大數據概述
1.1 大數據的產生
我們正處於一個信息化的時代。在信息化時代,我們認為[1]數據就是金錢、就是成功的根基。借助於電腦和衛星等科技的幫助,我們能夠收集大量的數據。起初,我們利用電腦和各式各樣的存儲技術來存儲各種形態的數據。然而,隨着時間的推移,大量的異構的數據存儲構成的數據集就變的異常的龐大。
隨着因特網在全球范圍的普及,數據量變的如此的巨大,以至於使用現有的數據管理方法或者傳統的數據處理應用很難應付。上述所提到的大規模、大體量的數據集我們就稱之為大數據。
1.1.1 大數據的形成
大數據就是一類復雜且龐大的數據集合,傳統的數據管理工具或者應用已經無法勝任其數據的處理工作。數據之所以會大規模的增長[1],其中一個原因就在於通過對一些具有單一關聯的大型數據集的分析,產生的額外的信息資源。這些通過分析產生的信息資源利用的案例可以在“景點的商業發展趨勢的預測”、“研究成果質量的預測”、“疾病的預防”、“打擊犯罪”和“預測實時交通擁塞程度”等場景下看到。
1.2 大數據的發展趨勢和挑戰
大數據通常是和雲計算、數據挖掘、機器學習密不可分的。大數據的分析主要涉及到以下的四個方面[2]:數據管理和結構支撐、開發模型和評測、可視化和用戶接口、商業模型。
1.2.1 大數據的發展
圖1[2]顯示了傳統的大數據工作流分析經歷的一些階段。數據以數據庫,數據流,數據集合以及數據倉庫等方式來建模。數據的數量級以及數據的多樣性要求在處理之前要進行數據的集成、清洗以及過濾等工作,以保證其后續工作的開展。
數據分析過程中最耗時、耗力的就是[2]數據的准備階段。通常會遇到的一個問題就是需要分析的數據會使得現有的分析系統達到飽和。因此,分析大規模的數據時必須考慮到數據存儲、過濾、移植和檢索的效率。
分析處理這些大數據之所以面臨挑戰的另一個原因是[2]數據形式的多樣性。正如圖2所示,數據主要有四種形式。而如今大部分的數據,既不是結構化的數據,也不是半結構化的數據。
下面將討論數據的速率[2](圖3)。這里所說的速率,主要是討論數據到達的時間問題。在某些應用中,數據的到達以及處理形式可能是成批的,但是在其他的應用中可能數據就需要以連續不斷的或者實時的形式展現。一些時候需要對這些數據進行及時的處理和響應。例如為數據中心提供實時的數據活動的管理。
1.2.2 大數據的挑戰
大數據已經成為一個炙手可熱的話題,但是不可否認,大數據仍然面臨一系列的挑戰。尤其是現階段廣泛使用的流數據(下面會重點討論)。
數據的多樣性[2]:如何去應對始終呈增長趨勢的數據。尤其是當數據以非結構化的形式產生的時候,如何從大量該類型的數據中快速有效的讀取出用戶所需要的數據。如何從流式數據中聚集並讀取數據中的潛在關聯性。
數據的存儲:如何從非結構化的數據中快速提取並存儲重要的信息?如何優化存儲的結構,使得存儲在其中的數據能夠被高效率的檢索?現存的文件系統能否有效的滿足大數據分析所要求的性能?
數據的集成:需要新的協議和接口來滿足不同形態和不同來源的數據。
數據處理和資源管理:需要設計出應用於流式數據的最優模型。需要設計出協同文件系統達到最高效能的處理引擎。
2 數據流挖掘概述
傳統的數據處理的方法[3],對於那些建立在特定數據集上的離線的數據,以及批量到達的數據顯得相對有效。但是隨着時代的發展和處理任務的更迭,有時候,我們的任務所處理的對象是流式數據,或者在線的實時產生的數據。越來越多的實時應用程序需要動態的處理基於流式數據的一些查詢請求。若在這樣的請求中,在運用傳統的方法,那么無論是對於空間占用還是效率來說,可能花銷都是比較大的。現在先對流式數據的一些概念加以闡釋。下述內容主要也將針對流式數據展開。
2.1 流式數據概述
為了能夠在數據倉庫中提取出一些新的潛在信息,我們已經掌握了一些系列數據挖掘的技術。但是[4]如今,當我們試圖從大量的流式數據中以一種合適、高效的方法來提取我們所需要的信息時,出現了一系列的挑戰。
2.2 流式數據發展及挑戰
在處理流式數據挖掘的時候,我們不能無視靜態數據和流式數據之間的區別。我們知道,靜態數據是預先存儲在固定的設備上,供查詢和分析,一邊找到潛在的價值。但是,由於流式數據連續性特性,很顯然無法完全存儲不斷進入應用的流式數據,而且,應用通常也要求我們要在極短的時間內對請求做出相應,這與處理靜態數據來比,時間顯然要短得多。因此流式數據的挖掘處理主要面對內存管理、數據結構和資源分配方面的挑戰。
3 流式數據工具集
表1[3]列出了大數據(包括流式數據、批量數據等形式)處理所需要的工具集,包括大數據處理的所需要的庫、平台和框架引擎。
工具集 |
處理對象 |
匹配引擎 |
Mahout |
Batch |
MapReduce, Spark, H2O |
MLlib |
Batch, Streaming |
Spark |
H2O |
Batch |
H2O |
SAMOA |
Streaming |
Storm, Samza, S4 |
表1 大數據處理工具集
因為本文主要針對性地調研了流式數據相關方面的內容,因此下面的分析也主要集中於流式數據相關工具集(SAMOA),對於MLlib僅簡單介紹。關於匹配引擎和框架的內容將在下一章節具體分析。
3.1 MLlib庫
MLlib[3]是一個與Spark幾乎同時段出現的產物,MLlib是一個機器學習的庫文件。其作為一款常駐內存的分布式處理引擎,廣受歡迎並且被許多大數據應用程序所使用。MLlib兼容批量數據和流式數據。MLlib的設計初衷就是為了使用戶能夠在利用該庫的基礎上創建自己的算法。Spark.ml提供了一系列統一的接口與MLlib合作創建、擴展以及應用一些機器學習的算法。MLlib支持很多有助於數據處理和模型評估的數學和統計學方法。現在很多的模型都很好的使用了MLlib庫,包括分類模型、迭代模型、評價模型、集群以及降維等。
3.2 SAMOA平台
3.2.1 SAMOA平台概述
Samoa(Scalable Advanced Massive Online Analysis)是一種流數據挖掘的平台。該平台為[5]最常用的數據挖掘和機器學習的任務(如:分類、集群、迭代以及抽象等等)提供了一系列分布式的流式處理算法。它的優勢在於提供了接口,這使得其能很好的被利用在多種分布式系統,結合一些流式處理引擎(Storm、S4、Samza)。Samoa用Java語言編寫,是一個開源的平台,可以在[6]http://samoa-project.net上獲取使用。圖4描述了平台與引擎之間的關系。
我們既可以將SAMOA看作是一個框架也可以將其看作是一個庫(跟上面提到的MLlib類似)。
作為框架,它允許算法的開發人員從底層的硬件設備中抽象,達到代碼重用的目的。上文提到,它的優勢[5]在於提供了能用在多種分布式系統上的接口,並適配多種流式處理引擎。通過設計了一個基於現代DSPE必要元素的最小化的應用程序接口API。這些接口使得可以很方便的將其綁定到新的引擎上面。SAMOA通過API和部署的方式,隱藏了DSPE的底部細節和底層差異。
圖5和圖6具體給出了SAMOA的項目架構。作為庫,SAMOA包含了為在分布式機器上進行流式數據機器學習所設計的算法的實現。為“分類”這一步的操作,提供了Vertical Hoeffding Tree (VHT)算法,對於集群,其包含了基於CluStream的算法。
Samoa平台在科學研究和實際生產生活的部署中都占有一席之地。
3.2.2 SAMOA算法架構
在SAMOA中,算法[5]被看作有向圖上的節點進行消息傳遞的,這些節點之間通過數據流的形式傳遞消息。在圖7表示的有向圖拓撲中,每個節點都是一個通過流來發送和接收消息的處理器。每一個處理機都是節點執行算法的載體[7]。一個數據流可以有一個源節點,但是可以有多個目的節點(類似於PUB/SUB模型)有向圖的拓撲是通過一個拓撲建立器的工具來生成的,它連接各部分用戶的代碼到SAMOA平台上,並且在后台做相應的處理和備份工作。圖8則是從集群角度來描述了對應的算法架構。
4 流式數據框架
流式處理平台[8]使得應用程序能夠對源源不斷進入系統的數據進行分析和處理。現實生活中有許多借助於流式大數據來實現其系統目標的案例。例如,在醫院系統中,我們可以通過檢測病人的生理構造的變化情況,來預測是否應該為病人進行實時的生命體征狀態監控。這些功能的實現都離不開數據框架的支持,下面將對流式數據中采用的主流框架進行分析,並在某些性能方面與應用於其他數據結構的框架進行對比。
4.1 Storm框架
如果[9]只能用一句話來形容storm或者來介紹storm,那么用“分布式實時計算系統”來概括則再好不過了。Storm是一個開源的實時計算系統,它提供了一系列的基本元素用於進行計算。
4.1.1 Storm概述
Apache Storm[10]是一款免費的開源分布式實時計算系統。Storm能夠可靠的處理大量的流式數據。現在Storm所做的工作,好比就是Hadoop在批處理數據階段所做的工作。Storm簡單易用,可以兼容任何的編程語言。Storm是一個由一系列用戶所編寫的消息和應用程序代碼所組成的平台。Storm中非常重要的一個概念就是“流”。所謂的“流”就是許許多多無界的數據的元組組成的序列。用戶可以通過使用Storm提供的兩個概念(spout、bolt),將一組已經存在的流(例如:twitter的消息)傳遞到新的流(例如:趨勢信息)中去。spout和bolt都提供了接口,用戶必須實現這些接口來完成自己的邏輯功能的實現。
4.1.2 Storm相關概念
在圖4關於SAMOA中已經接觸到了storm數據流,現在對圖9的數據流加以分析。
Spout就是數據源也稱消息源。Storm對於原始數據輸入來源並不加以嚴格的限制。這取決於用戶自己編寫的代碼,無論是來自於隊列、來自於數據庫、來自於網站還是其他的任何來源。例如。一個spot可能從隊列中讀取元組然后形成輸入流,也可能使用twitter的接口,然后將一系列從twitter獲取的數據作為輸入。然后這些數據然后被傳遞給一個或者多個bolt處理。
對於bolt來說,它將接收多個輸入流,然后做一些處理工作,並且可能產生一組新的流式數據。一些復雜的流式數據的傳遞處理過程可能會經歷多步驟並且需要不止一個bolt的配合才能夠完成。通過將一個大的任務分散成若干個小的任務塊,每個bolt可以集中處理單個相對規模較小的任務,從而也會產生較快的響應。使用多個bolt也可以同時帶來較高的性能,因為storm可以提供多個源數據給bolt處理以加快其處理的進程和處理的效率。
Spout和bolt都被打包成Topology[8]。Topology就是用戶提交給storm執行的一個操作單元。為了能夠在storm上面進行實時的計算,首先要創建topology。這個topology就是一個計算圖。在其中,每個節點不是bolt就是spout,這些節點都包含了一個邏輯處理,並且圖中的箭頭表示了數據是如何在不同的節點之間流動的。節點之間的操作都是並發進行的。直到用戶主動去終止一個拓撲或者出現崩潰,否則拓撲會一直在運行。當然,如果系統檢測到某個spout或者bolt崩潰,那么會結束這單個的spout或者bolt。
結合上述storm中一個拓撲topology的組成部分,圖10給出了strom中的一些角色關系。
表2列出了Hadoop與Strom中角色關系的對比。
|
Hadoop |
Storm |
系統角色 |
JobTracker |
Nimbus |
TaskTracker |
Supervisor |
|
Child |
Worker |
|
應用名稱 |
Job |
Topology |
組件接口 |
Mapper/Reducer |
Spout/Bolt |
表2 Hadoop與Storm系統角色對比
Hadoop主要是針對於批量數據的大數據處理框架,雖然針對目標不同,但是通過對比還是能輕易的得出Storm各部分角色在框架中所起的作用。
Nimbus:任務調度和資源分配。
Supervisor:接受任務,啟動和停止屬於自己管理的worker進程。
Worker:運行具體處理組件邏輯的進程。
Task:worker中每一個spout/bolt的線程稱為一個task。在storm0.8之后,task不再與物理線程對應,同一個spout/bolt的task可能會共享一個物理線程,該線程稱為executor。
4.1.3節中,我們會結合於上面的表格針對Strom具體說明不同的節點運行的角色以及它們是如何相互配合的。
4.1.3 Storm架構
在一個Storm集群中主要有兩種類型的節點[8]。主節點和處理節點。
主節點運行一個稱之為Nimbus的進程。其負責在集群中部署代碼、分派任務、監視任務的進展情況以及回報崩潰的情況。它也同時運行一個UI進程。UI即用戶界面,它提供了一個網站給用戶以實時觀測集群的狀態以及管理拓撲和拓撲上的節點。在目前的Storm版本中,會有這樣的情況出現:即當主節點崩潰后,處理節點仍然在工作,但是重新配置集群等操作在此期間就是無法進行了,除非我們去重啟主節點。也許未來的Strom版本會對這一問題進行改進。
進程節點,運行一個稱之為Supervisor的進程。這個Supervisor一直在監聽者分派給這台機器的任務。它根據需求動態的開始和停止工作。這個需求是基於主節點分派給這台機器的任務。在一個進程節點中的若干個任務,都執行一系列的拓撲。例如一個或多個spout和bolt、metrics。鑒於此情況。一個拓撲topology很可能是分布在一個集群的若干個機器之間。進程節點同樣也運行一個LogViewer進程,該進程可以用來查看網站上的瀏覽日志。
主節點與進程節點之間的協同工作是通過Zookeeper集群來完成的。在Zookeeper中可以存儲和檢索有關分配任務情況、進程處理健康狀態以及集群的狀態。
用戶需要手動的將應用程序的代碼打包成jar包,並且傳遞給主節點。將jar包分派給進程節點的工作進程是通過進程節點和主節點之間的直連網絡來實現的。圖11就展現了Storm架構的主要組成部分。
通常當需要較高的執行性能時,可以通過strom向集群里增加一些節點,同理當不需要的時候,可以實時的移走這些多余的節點,從而達到動態處理的效果。一言以蔽之,Strom賦予用戶往平台上增加節點的功能。
4.1.4 Storm集群應用
在自動化計算領域,我們最常見的就是使用監控、分析、計划、執行(MAPE)這樣一個循環往復的過程來控制一個系統。通過上述的循環過程使得Strom變得靈活而且可擴展。例如:Strom集群規模的增長和收縮都是基於拓撲結構的需要。首先用傳感器來檢測Storm集群的工作狀態。MAPE的環路然后監測傳感器的輸出,分析數據的內容查處問題所在,然后找出補救的措施,執行新的選擇算法。這個過程最終以動態修改集群的原有配置(通過Effector實現),使其適應新環境下的新需求而結束。圖12給出了MAPE的執行流程。
監測:監測一個Storm集群系統可以作用於多個層面。進程節點將提供系統級的信息,包括處理器的使用情況、內存的使用、磁盤使用和網絡接口狀況。平台自身也是一個數據監測源。Storm本身也提供平台狀況信息,包含正在工作的節點的數量和狀態、拓撲以及元組數。最后,監測的數據也可以用應用層面提供。例如,一個拓撲檢查自動計算系統的日志文件可以匯報其沖突率。監控輸出的結果集是一個metrics。
分析:分析階段通過查驗一系列的metrics,來給出結論,判斷是否當前的狀態是正常的。例如:判斷過去5分鍾內處理器的平均占用率是否低於百分之七十?當然,其他的復雜的運算情形也是需要考慮在內的,包括結合平台狀況、系統性能來分析metrics。在Storm集群中分析階段需要給出的結論是當前的狀態是(1)良好的(2)需要新的進程節點(3)存在過多的進程節點等等。
計划:當前面的分析階段給出的結論是現在Storm集群存在問題時,必須在計划階段給出處理的辦法。如果需要一個進程節點,那么計划階段就會立即告知執行階段此請求,並且要求提供一個已經裝有Storm的虛擬機。但是及時加入了新的節點,當前的執行任務不會重新被分配執行,這種情況下,拓撲就不是最優化的。只有當上一個分析階段指出之一狀況時,計划階段會通知執行階段重新分派任務,這樣,剛剛被加進來的節點就能被利用了。如果當前的進程節點過多,就會銷毀一部分。
執行:最后一個階段就是執行計划階段所需求的任務。在Storm集群中最主要的就是三方面的任務:第一、添加一個虛擬機,並配置相關的strom軟件。第二、重構拓撲結構。第三、刪除多余的虛擬機。這一階段執行的時間可能不僅僅是幾秒鍾而已,因此必須做好相對應的監控工作,防止引起不必要的災難。
4.2 Spark框架
Spark[11]是一個高速、通用的集群計算系統。它為Java、Scala、Python以及R語言都提供了應用程序接口。它也是最佳的支持通用執行圖的引擎。不僅如此,Spark也提供了非常豐富的插件工具,其中包括為SQL設計的Spark SQL、結構化的數據處理工具、機器學習庫MLlib、圖像處理工具GraphX和Spark Streaming。
4.2.1 Spark概述
Spark起源於加利福尼亞大學伯克利分校[3]。設計Sprak的目的就是為了解決許多Hadoop MapReduce處理框架所遺留下來的一些問題。Spark項目引進了一個新的概念:彈性分布式數據集(RDD)。該數據集使得數據在集群節點之間的存儲和處理直接在內存中進行,從而極大的加快了效率。同時,也創建了一個有向無環圖(DAG)實現其容錯機制。當集群中的某一個節點崩潰后,可以轉由另一個節點來接手處理原來節點所負責的事物。Spark最大的特點和優勢就是減少了I/O讀寫所耗費的時間。在2014年sort benchmark上Spark刷新了記錄。使用206個節點在23分鍾之內成功排序了100TB的數據。而之前的記錄則是由MapReduce保持的(使用210個節點在72分鍾內排序同樣數量的數據)。Spark兼容Hadoop的組件(如HDFS和Hive)並且可以使用YARN運行在Hadoop上。
4.2.2 Spark架構
Spark的架構圖如圖13[12]所示。
下面將對幾個重要的概念進行說明:
MLlib:在3.1節已經講到,此處不再贅述。
Spark SQL:Spark SQL是一個Spark為結構化處理所設計的模塊。它提供了一個編程的抽象叫DataFrames[13]。當然也可以作為分布式的SQL查詢引擎。Spark SQL也可以從已存在的Hive中讀取數據。DataFrames則是以列形式組織起來的分布式的數據集。在概念它等同於關系數據庫中的一張表或者R/Python語言中的數據框架,但是它又比前者的性能優越。我們可以從幾個方面來構造DataFrames:結構化的數據文件、Hive表格、已存在的數據庫或者已存在的RDD。DataFrames的API兼容Scala、java、Python和R語言。
GraphX:GraphX是Spark中的一個新的組成部分。可以用於圖像和並行圖像的計算,同時通過引入了新的圖像抽象技術:帶權有向圖,擴充了RDD。為了支持圖像處理,GraphX提出了一系列基本的操作符和API。同時Graphx也在不斷的擴充自己的算法庫以便不斷的簡化圖像處理的過程。
4.2.3 Spark Streaming
Spark借助於自身的Spark Streaming,提供了數據流處理的功能。結合圖14,下面具體分析其計算流程、實時性等評價參數。
Spark Streaming的計算流程是這樣的[3]。利用Spark引擎,通過將進入系統的流數據打包成小的批量數據,這與Storm不同,Spark Streaming並不是一次性的處理流式數據。而且在處理數據之前將數據按照時間間隔切割成小的批量數據。從而加速處理。其針對持續性數據流的抽象是通過離散流(Discretized Stream)來實現的。所謂的離散流就是若干的RDD組成的集合。這使得既可以處理流式數據也可以處理批量數據。這也就解釋了MLlib能夠適用於流式數據處理的原因了。
實時性:實時性不能一概而論,具體的處理框架所涉及的不同應用場合會帶來不同的效果。Spark Streaming將流式計算分解成多個Job,對於每一段數據的處理都會經過有向無環圖分解,並給予對應的任務集的調度。就當前的Streaming版本來說,最小的Batch Size的選取在0.5~2秒鍾之間(Storm目前最小的延遲是100ms左右),所以Spark Streaming能夠滿足除對實時性要求非常高(如高頻實時交易)之外的所有流式准實時計算場景。
4.2.4 RDD
RDD可以說是Spark框架的核心。RDD[15]即Resilient Distributed Dataset,彈性分布式數據集。它是一個分布式的內存抽象,RDD允許程序員在大數據上進行基於內存的計算而仍然能夠保持較好的容錯率。由於現有的流式數據處理的系統對一下的兩種問題無法有效的解決:第一、迭代算法,這在圖形學和機器學習中很常見。第二、交互式數據挖掘工具。因此催生了RDD。在兩種案例中,使得數據常駐內存可以帶來較高的效率。為了同時達到較好的容錯性,RDD提供了一種非常嚴格的內存共享機制:即RDD只能以只讀的形式被訪問。對於創建RDD,只可以通過其他RDD上的批量操作來進行。
在Sprak框架下,RDD被視為對象。通過這些對象上的方法來實現轉換。
一旦RDD被定義后[15],就能夠被程序員使用了(在動作中使用)。所謂的動作就是向程序返回值的操作或者將數據傳遞給存儲系統的一些操作。這些操作包括count(返回RDD的元素數量)、collect(返回元素本身)以及save(將RDD輸出到存儲系統)。在Spark中,RDD只有在動作第一次使用時,才會計算RDD,這樣保證了在構建RDD時,通過管道的方式完成轉換。
程序員也可以從兩個方面來控制RDD。分別是緩存和分區。用戶如果請求緩存RDD,那么在同時可以將已經被計算過的RDD分區存儲備用。緩存的RDD通常來說都是存放在內存中。另一方面,RDD還能使用戶通過關鍵字來指定分區順序,這是個可選的項目。當前支持的分區是哈希分區和范圍分區。
借助[14]於RDD,Spark Streaming能有較好的容錯性。容錯性對於流式計算來說非常的重要,一旦無法保證容錯能力,那么對於流式計算來說是致命的打擊。因為任何一個RDD都是彈性分布式可重算的數據集,其中包含了確定的操作關系,當數據在某個RDD上出現錯誤了,可以通過原始的數據轉換操作到其余的RDD上重新執行計算操作,從而保證了系統的穩定性和容錯能力。圖15就是反映RDD操作繼承關系的圖例。
4.2.5 Spark性能分析(與Hadoop比較)
Spark[16]的出現是為了解決Hadoop框架下的很多問題才應運而生的。Spark的一大閃光點就是RDD。通過RDD,Streaming等結合,極大的增加了大數據分析的效能。下面將Spark與Hadoop進行比較。與Hadoop相比,Spark在I/O操作上花費的時間明顯縮小了。但是我們認為其為了引入RDD需要耗費額外的內存空間,很明顯Spark這一舉動是空間換取時間的一種妥協。下面的實驗用來評測Hadoop和Spark的系統性能。在實驗中選取了典型的迭代算法PageRank。在真實數據和模擬的數據上都進行了相關的測試。測試的結果見圖16、圖17和圖18。
具體的實驗算法和步驟,可以參考附錄的參考文獻。從上面的三組對比數據可以得出以下的結論。(1)當內存能夠滿足整個迭代過程時,Spark的效率明顯高於Hadoop(2)當內存不夠時,結論則相反。這說明了,Spark的確是采用了一種空間換時間的做法。因此在使用時必須預先估計數據的規模。否則,可能無法達到預期的計算效果。
4.3 Samza框架
Apache Samza是一個分布式的流處理框架。它使用Apache Kafka來傳遞消息,使用Apache Hadoop YARN來提供容錯、安全和資源管理等功能。
4.3.1 Samza概述
與Storm和Spark都不同,Samza的處理對象不是元組也不是DStream,而是一條一條的消息。在深入理解Samza之前,需要了解下面幾個概念:流、作業、任務、區間分割等。
流[17]的概念與Storm和Spark中提到的概念相同。Samza通過對流進行抽象使得其支持嵌入式系統。在Kafka中,流就是一個主題。在數據庫中我們可以通過更新操作來讀取流。在Hadoop中我們可以在HDFS中定位文件目錄。
作業:在Samza中作業就是在一系列輸入流上執行邏輯轉換並將其加到輸出隊列中以供輸出到輸出流上的代碼的集合。如果不考慮可擴展性,我們所需要的僅僅是流和作業。我們將流和作業分割成小的部分:分區和任務。
區間:如圖19所示,每一個數據流都被分割成一個或多個區間。流中的每一個區間就是一串有序的消息的序列。序列中的每條消息都有一個唯一的識別碼,可以是整型序列、比特字符、或者字符串,這些都是由特定的系統所決定的。當一條消息被添加到一個流中去,它僅僅會被添加到一個區間上,至於如何選定區間,則是由用戶通過一些算法來決定的。
任務:大規模的作業將會被分成很多的任務。任務是作業的組成單元,正如區間是數據流的組成單元。每個任務都按順序的擁有它所在輸入區間的消息。
4.3.2 Samza架構
Samza的成分有三層:Streaming layer、execution layer和processing layer。並且為每一層都提供了支持,分別是Kafka、YARN和Samza API。這三塊共同構成了Samza(如圖20)。
4.4 Storm、Spark和Samza對比
4.1、4.2、4.3節提到的三種框架都是開源的框架。具有延遲低、效率高、容錯性強的特點[12]。它們的共同特色在於:當你在框架下運行數據流相關的代碼進行操作時可以允許並行的進行操作,提高效率的同時保證了容錯性。此外,他們都隱藏了底層的實現細節,通過提供的API簡化操作。
雖然三者在不同的框架下的專業術語名稱不一致,但是其代表的概念具有很大的相似性。
表3列出了三個框架下的基本術語。
|
Storm |
Spark |
Samza |
Stream Source(s) |
spouts |
Receivers |
consumers |
Stream Primitive(p) |
Tuples |
DStream |
Message |
Stream Computation(c) |
Bolts |
Transformation Windows Operations |
Tasks |
表3 三個框架術語表
表4列出了三個框架的不同之處。
|
Storm |
Spark |
Samza |
Delivery Semantics |
At least Once |
Exactly Once |
At least Once |
State Management |
stateless |
stateful |
stateful |
Latency |
Sub-second |
seconds |
Sub-second |
Language Support |
Any |
Scala,Java,Python |
Scala,Java |
表4 三個框架差異
從表4可以看出,三個框架無論在支持的語言還是其他判斷方面都是存在着差異的,但是無法評判哪個更優秀,哪個更完美。只有結合具體的環境、具體的需求才能做出最優的判斷。當然,實際上,這三個框架都有很多公司在用。
使用Storm的公司有:Twitter,雅虎,Spotify還有The Weather Channel等。
使用Spark的公司有:亞馬遜,雅虎,NASA JPL,eBay還有百度等。
使用Samza的公司有:LinkedIn,Intuit,Metamarkets,Quantiply,Fortscale等。
4.5 其他框架
除了上面具體分析的Storm、Spark和Samza三大主流框架外,還有包括Apache Flink[18]、StreamBase[19]、YAHOO S4[20]等出色的框架,當然也存在着基於上述框架改編的新框架,限於篇幅,此處不再贅述。