# 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) 計算的概念，提供使用者對於暫存資料的控管，減低在迭代時所需要的資料存取時間。

![來自: https://ogirardot.wordpress.com/2015/05/29/rdds-are-the-new-bytecode-of-apache-spark/](https://13218333-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPzeYWaV4cPH8nI_rTk%2F-LPzfo5VF0vBjpRa8gWb%2F-LPzgPFeFVLKVwJVxCtq%2Ffuture-of-spark.png?alt=media\&token=e84c3636-361f-487f-9b15-04e2b929b15c)

Spark 沿用了 HDFS 的分散式資料儲存結構，同時加入了以Tachyon為基礎的分散式內存系統，提供資料在記憶體中的管理。在Spark中，所有的資料單元被表示為RDD (Resilient Distributed Dataset)，RDD 是分佈在一組叢集中的唯讀物件集合 (也可為可讀寫的物件，在之後會說明)，RDD將一份資料存放在多個分區上，並在運算時，對於每一個分區進行相同的動作。藉由備份和血統 (Lineage) 的機制，RDD也提供雲端需要的容錯機制。RDD可以指定成7種不同的儲存等級 (例如: 記憶體或是硬碟)，在Spark中， RDD擁有兩種建立模式:

* 可以從檔案中 (包括 HDFS 和 HBase) 創建
* 或是從另一個RDD中產生

&#x20;當進行完運算後，所產生的RDD也可以存回HDFS或是檔案。

## Spark Streaming

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

![來自: http://datanome.co.uk/category/spark/](https://13218333-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LPzeYWaV4cPH8nI_rTk%2F-LPzjPoH1rJqdsUt4XwE%2F-LPzjySj4SzbycIdkXq3%2Fspark-dstream.png?alt=media\&token=57b598ce-dce0-4907-a15c-0cf67e7df29a)

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

| Platforms                                                         | Spark                             | Storm                              | Hadoop MapReduce |
| ----------------------------------------------------------------- | --------------------------------- | ---------------------------------- | ---------------- |
| Programming model                                                 | <p>In-memory;</p><p>RDD-based</p> | <p>Graphical;</p><p>Node-based</p> | 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             |
| [Performance](http://www.cs.duke.edu/~kmoses/cps516/dstream.html) | 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 進行更詳細的說明並解釋。
