大數據計算常用的分布式計算組件——Hadoop、Storm以及Spark

“工欲善其事,必先利其器”,具有特定功能的可複用組件正是計算機領域中的利器。在大數據的浪潮下,許多用於處理大數據的組件應運而生,分別應用在“數據傳輸”“數據存儲”“數據計算”以及“數據展示”的環節中。

本文將介紹“數據計算”環節中常用的三種分佈式計算組件——Hadoop、Storm以及Spark。

當前的高性能PC機、中型機等機器在處理海量數據時,其計算能力、內存容量等指標都遠遠無法達到要求。在大數據時代,工程師採用廉價的PC機組成分佈式集群,以集群協作的方式完成海量數據的處理,從而解決單臺機器在計算與存儲上的瓶頸。Hadoop、Storm以及Spark是常用的分佈式計算組件,其中Hadoop是對非實時數據做批量處理的組件;Storm和Spark是針對實時數據做流式處理的組件。

1.Hadoop

Hadoop是受Google Lab開發的MapReduce和Google File System(GFS) 的啟發而實現的開源大數據處理平臺。Hadoop的核心由HDFS分佈式文件系統和MapReduce編程框架組成。前者已經在前述章節中有過介紹,它為海量數據提供了存儲;後者則用於對海量數據的計算,是本節要著重介紹的內容。

MapReduce是一種通用的編程模型,下面對它做簡單介紹,它的工作流程如圖。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

MapReduce工作流程

我們以字母統計為例說明上述流程。假設有文件內容為“Iamapanda, andIamfromChina”。首先,把大文件分割成data數據塊;其次,把data發送到各個工作機;此時,工作機解析內容,形成Key-Value鍵值對數據。本例中形成的數據為, , , ,

Hadoop平臺上通過JobTracker和TaskTracker協調調度,實現MapReduce的運行,其工作機制可以用下圖說明。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

MapReduce實現機制

上圖可知,JobTracker負責任務調度,而TaskTracker負責任務的執行;同時,需要處理的數據存儲在HDFS中,TaskTracker根據MR程序讀取並處理數據。

以上對Hadoop的介紹依據的是Hadoop1.0(第一代Hadoop)的整體框架,當前Hadoop2.0(第二代Hadoop)引入了YARN作為其資源調度的方式,架構與1.0略有不同,但依然採用MR的計算模型。

2.Storm

Storm是用Clojure語言編寫的分佈式實時流處理系統。Hadoop平臺執行批處理操作,數據處理的延遲較高;而進入Storm的數據則像水流一樣源源不斷流入,並對其做實時處理。Storm集群架構如下。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

Storm集群架構

Nimbus與Hadoop中JobTracker的功能類似,負責資源的管理和任務的調度。從Zookeeper中讀取各節點信息,協調整個集群的運行。

Supervisor與Hadoop中TaskTracker的功能類似,負責接受任務,負責自身Worker進程的創建和任務的執行。

Worker是機器上具體的運行進程,Executor是該進程中的線程。一個Executor可以執行多個Task。在該集群架構的方式下,Storm實現瞭如下的計算模型。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

Storm計算模型

Spout是數據的入口,負責接受推送的數據,或者主動拉取數據。同時,把接收的數據轉換為Tuple對象發送到Blot中處理。數據從Spout進入,封裝成Tuple,傳輸到第一層的某個Blot中,該Blot處理完成後,路由到第二層的某個Blot中,依此類推直到最後一組Blot處理結束。

Blot是Storm實際的數據處理單元,接受Spout或者上一級Blot傳輸的數據並處理。根據併發度的設置,Blot會分散到集群的一臺或多臺集群上併發執行,從而有效利用集群的計算能力,提高數據處理的實時性。這和在單臺機器上多線程處理有相似之處。

Tuple是一個或多個包含鍵值對的列表。數據會封裝成Tuple對象在Spout與Blot之間傳輸。Storm支持7種路由策略,分別為

  • Shuffle分組,Tuple隨機分散傳輸到後續的多個Task中;
  • Fields分組,根據指定field來做哈希,相同的哈希值傳輸到同一個Task;
  • All分組,廣播式地發送,把所有的Tuple發送到所有的Task中;
  • Global分組,把所有的Tuple發送到一個Task中;
  • None分組,也就是不關心如何路由,目前等同於shuffle分組;
  • Direct分組,是一種特殊的分組,需要手動指定Task;
  • Localorshuffle分組,如果目標Blot中的Task和產生數據的Task在同一個Worker中,就執行線程間的內部通信,否則等同於shuffle分組。

3.Spark

Spark是用Scala語言編寫的分佈式數據處理平臺。Spark的核心數據處理引擎依然是運行MapReduce計算框架,並且圍繞該引擎衍生出多種數據處理組件,共同打造了輕量級的數據處理生態圈。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

圍繞Spark構建的數據處理組件

Spark數據引擎是各組件庫的核心。Spark與Hadoop的計算框架都是基於MapReduce模型的,Spark自身不包含類似HDFS的文件系統模塊,而是藉助外部的平臺如HDFS、HBase等存取數據。Spark在執行MapReduce的過程中做了重要的優化:第一,計算的中間數據不寫磁盤,全部在內存中執行(可以設置對磁盤的依賴);第二,支持任務的迭代。Hadoop任務必須依照Map→Reduce成對執行,然而Spark可以依據任務的DAG圖,按照Map→Map→Reduce等任意方式執行。這兩點改進極大縮短了任務時延。

下圖為Spark的工作流程。RDD是Spark的重要概念,代表了數據集和操作的結合。數據集來自內部或者外部,操作包含map,group,reduce等。我們下面給出一個RDD的示例。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

Spark任務提交及集群架構

val lines = sc.textFile("data.txt")

val lineLengths = lines.map(s =>s.length)

val totalLength = lineLengths.reduce((a, b) =>a + b)

lineLengths就代表數據集lines和操作map組成的RDD。一個RDD又可以分多個Task執行,按照其執行的順序組成DAG圖。後續RDD的執行依賴先前RDD的執行,因此這種依賴關係又可以劃分為Stage,下圖直觀說明了DAG、Stage、RDD以及Task的概念。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

DAG、Stage、RDD、Task邏輯關係圖

Spark Streaming是基於Spark核心處理引擎實現的高吞吐與低延遲的分佈式流處理系統。與Storm相比,兩者在功能上是一致的,都實現了數據流的實時處理;Storm的延遲在亞秒級別,而Spark Streaming是在秒級別,主要因為前者對數據的處理就像水流一樣,來一條數據則處理一條,而後者是不斷進行小批量處理,只有在某些苛刻的場景下才能對比出這兩種方式的優劣。Spark Streaming數據處理流程如下。

大數據計算常用的分佈式計算組件——Hadoop、Storm以及Spark

Spark Streaming數據處理流程

SparkSQL是分佈式SQL查詢引擎,與Hive類似,並對Hive提供支持。Hive基於Hadoop的MapReduce實現查詢,而SparkSQL則是基於Spark引擎,因此查詢速度更快。但是,SparkSQL需要更多的內存,在實際應用中其功能的豐富性和穩定性卻不如Hive。不過隨著系統的不斷演化,SparkSQL將逐漸取代Hive,成為分佈式SQL查詢引擎的佼佼者。

MLlib是Spark封裝的一些常用的機器學習算法相關庫。基於RDD的方式實現了二元分類、迴歸、系統過濾等一些算法。GraphX主要對並行圖計算提供支持,開發並實現了一些和圖像相關新的Spark API。


本文選自《Python絕技:運用Python成為頂級數據工程師》,作者黃文青,電子工業出版社2018年6月出版。

僅僅會Python編程是不夠的。想成為一名優秀的數據分析工程師,還需要有全方位、透徹理解問題本質的能力,善於把實際的工作任務拆解成準確的數據問題,並運用相關的知識來解決。

本書恰好是從這個角度出發的,它條分縷析地幫助你認識任務的本質,教你從數據的角度來思考、拆解任務,並最終順利地達成目標。


分享到:


相關文章: