Spark 基本介紹
Apache Spark 的介紹
Last updated
Apache Spark 的介紹
Last updated
在這篇介紹中,我將著重在 Stream 和 ML 部分,這也是未來在研究 Spark 時會比較重視的部分。 Apache Spark 是由 UC Berkeley AMP 實驗室所開發的雲端運算框架,用來構建大型的,低延遲的資料分析系統。比較起其他雲端運算架構,像是 IBM 的InfoSphere、或是 Strom 的流計算 (Stream Computing),Spark 繼承了MapReduce 中根據資料位置移動計算的精神 (moves compute processes to the data),並在此架構上,引進了記憶體層 (in-memory) 計算的概念,提供使用者對於暫存資料的控管,減低在迭代時所需要的資料存取時間。
Spark 沿用了 HDFS 的分散式資料儲存結構,同時加入了以Tachyon為基礎的分散式內存系統,提供資料在記憶體中的管理。在Spark中,所有的資料單元被表示為RDD (Resilient Distributed Dataset),RDD 是分佈在一組叢集中的唯讀物件集合 (也可為可讀寫的物件,在之後會說明),RDD將一份資料存放在多個分區上,並在運算時,對於每一個分區進行相同的動作。藉由備份和血統 (Lineage) 的機制,RDD也提供雲端需要的容錯機制。RDD可以指定成7種不同的儲存等級 (例如: 記憶體或是硬碟),在Spark中, RDD擁有兩種建立模式:
可以從檔案中 (包括 HDFS 和 HBase) 創建
或是從另一個RDD中產生
當進行完運算後,所產生的RDD也可以存回HDFS或是檔案。
在 Spark 中,所有的資料單元被表示為 RDD,因此在進行流運算時,處理的是DStream,也就是一系列的 RDD 輸入,而不是一筆筆連續的資料輸入。考慮到源源不斷的資料輸入,Spark Streaming 會先把進入的資料按照時間切分成不同的區塊,而每一格區塊則直接對應產生一個 RDD 資料集合,並放入Spark中進行RDD 的運算,當然,輸出的格式也是一連串 RDD 的形式。使用者能夠根據需求,將資料轉傳入 HDFS、檔案或是資料庫中。
和其他雲端計算框架相較,Spark Streaming 擁有相對簡單的計算架構,雖然無法到達毫秒等級,卻能夠平衡運算效率以及即時處理的需求。和其他雲計算平台的比較如下表:
除了 Spark Streaming 之外,在 Spark 上也成立了一個 MLlib 專案,負責提供機器學習 (Machine Learning) 演算法的函式庫。
在 MLlib 中,已經實作了多種樣態的機器學習演算法,包括分類法中的 SVM (Support Vector Machine)、K-means等,除了估計與分類演算法之外,MLlib 也提供了一些分析的工具,例如: 隨機訊號的產生、假設檢定、SVD、 PCA 等。這些工具都是建立於 Spark 所定義的 RDD 運算上,使得 Spark 的管理節點能夠基於資料所在的位置,將運算分散到叢集中的工作結點上。
同時,對於目前盛行的深度學習 (deep learning),雖然 Spark MLlib 本身並沒有支援,不過也有像是 Deeplearning4j 的專案支援,也有許多人探討如何利用 Spark 加速深度學習 (主要透過 Spark SQL),有興趣的同學可以找資料看看。
我們之後會對 MLlib 進行更詳細的說明並解釋。
Platforms
Spark
Storm
Hadoop MapReduce
Programming model
In-memory;
RDD-based
Graphical;
Node-based
MapReduce
Complexity
Medium
Most complex
Simplest
Data processing
RDD
Tuple
HDFS
Streaming
Yes (DStream)
Yes (Tuple)
No
Machine learning
Yes (MLlib)
Yes (Trident-ml)
Yes (Mahout)
Processing mode
Batch and stream
Only stream
Only batch
Latency
second
Sub-second
Long
400,000 Records/s/node
10,000 Records/s/node
--