Spark 基本介紹

Apache Spark 的介紹

Spark 的基本概念

在這篇介紹中,我將著重在 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 Streaming

在 Spark 中,所有的資料單元被表示為 RDD,因此在進行流運算時,處理的是DStream,也就是一系列的 RDD 輸入,而不是一筆筆連續的資料輸入。考慮到源源不斷的資料輸入,Spark Streaming 會先把進入的資料按照時間切分成不同的區塊,而每一格區塊則直接對應產生一個 RDD 資料集合,並放入Spark中進行RDD 的運算,當然,輸出的格式也是一連串 RDD 的形式。使用者能夠根據需求,將資料轉傳入 HDFS、檔案或是資料庫中。

和其他雲端計算框架相較,Spark Streaming 擁有相對簡單的計算架構,雖然無法到達毫秒等級,卻能夠平衡運算效率以及即時處理的需求。和其他雲計算平台的比較如下表:

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

--

MLlib

除了 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 進行更詳細的說明並解釋。

Last updated