Friday, August 25, 2017

Big Data(四):Spark

Big Data(四):Spark

2017/08/18

本文整理了一些 Spark 的網路資料。從 Spark 底層環境的介紹、核心資料格式 RDD 的設計原理,如何演變到 DataFrame,以及 Spark ML Pipeline 如何收取外界大數據資料、如何利用 Python 視覺化工具。

相信讀者閱讀完畢後,對於如何在 Spark 上使用機器學習,會有很大的幫助。

-----

Summary:

Spark,廣義來說,可以視為 Hadoop 生態系的一員 [1],參考圖1。而事實上,Spark 本身也有自己完整的生態系 [2]-[7],參考圖2。

相對於 Hadoop 的 MapReduce,Spark 最大的差異點在於將暫存從硬碟移到記憶體,因而速度可以達到100倍 [8]。

Spark 的架構中,個人認為比較重要的,有 MLlib [8],RDD [2], [9] - [12],ML Pipelines [13], [14],DataFrames / Datasets [15] - [19],以及 Standard alone、YARN、Mesos 這三種底層架構 [20], [21]。

-----


Fig. 1. Hadoop ecosystem [1].

-----



Fig. 2. Spark [2].

-----

Outline

1. MLlib
2. RDD
3. ML Pipelines
4. DataFrames / Datasets
5. Standalone / Mesos / YARN

-----

1. MLlib

參考圖2。

「MLlib是Spark上分散式機器學習框架。Spark分散式記憶體式的架構比Hadoop磁碟式的Apache Mahout快上10倍。」[8]

底下列出部分 Spark 支援、較常用的機器學習演算法:

「匯總統計、相關性、分層抽樣、假設檢定、隨機資料生成 分類與回歸:支援向量機、回歸、線性回歸、決策樹、樸素貝葉斯 協同過濾:ALS 分群:k-平均演算法 維度縮減:奇異值分解(SVD),主成分分析(PCA) 特徵提取和轉換:TF-IDF、Word2Vec、StandardScaler 最佳化:隨機梯度下降法(SGD)、L-BFGS。」[8]

-----

2. RDD

「通常來講,針對數據處理有幾種常見模型,包括:Iterative Algorithms (Machine learning),Relational Queries (SQL),MapReduce (Batch),Stream Processing (Streaming)。 例如Hadoop MapReduce採用了MapReduces模型,Storm則採用了Stream Processing模型。 RDD混合了這四種模型,使得Spark可以應用於各種大數據處理場景。」[12]

「要如何設計一個高容錯(tolerant) 高效能(efficient)的結構?這是RDD的設計概念由來Resilient Distributed Datasets 」[11]

A. 資料分片

RDD則是指一個Partion(資料分片)的集合,大多數情況都存於Memory中。即一個RDD裡可能會有多個在不同機器上的partition。一個RDD主要會有三樣東西 1.每個partition位置 2.與親代RDD的依賴關係 3.親代RDD經過何種運算得到此RDD的 (function) 以上三樣在RDD概念裡主要是為了實現 血統關係(lineage) (為了容錯)[11]。

B. 高效能

「在RDD之上,可以施加兩類型的操作,一種稱為「轉換(Transformation)」,另一種則為「動作(Action)」。其中,所謂的「轉換」,其操作結果為新的RDD,意即其作用在於將RDD再轉換生成另一個RDD。而所謂的「動作」,則是在RDD之上進行計算之後,將其結果返回 Spark 的驅動程序,或寫至檔案系統 [10]。以上再說的更簡單一點,即是:「無論執行了多少次transformation操作,RDD都不會真正執行運算,只有當action操作被執行時,運算才會觸發 [12]。」

另外,「對於那些會重複使用的RDD,可以將RDD「持久化」在記憶體中做為後續使用,以加快執行效能 [17]。」

C. 高容錯

「當有RDD遺失時,會根據前面提到的血統關係(lineage)來重新計算所需RDD,所以實際上Spark是沒有replication機制。但明顯的要是,失去的RDD剛好是要計算出結果的1萬次運算的9999次怎麼辦?那不是等於要重算嗎? 所以Spark還提供一個客製化的機制CheckPoint,由使用者自己設計儲存點,在這點的RDD會存於Storage 以免遺失,所以實際上Spark經由lineage 與 CheckPoint來執行容錯 [11]。」

-----

「Spark主要優勢是來自RDD本身的特性。RDD能與其他系統相容,可以匯入外部儲存系統的資料集,例如:HDFS、HBase或其他Hadoop 資料來源 [17]。」整個RDD的執行過程如圖3a所示。

RDD 的缺點是使用上不夠友善。首先,RDD 使用上必須要有 Map/Reduce 的概念。另外,RDD 沒有定義Schema (也就是未定義欄位名稱與資料型態) [17]。




Fig. 3a. RDD [11].

-----

3. ML Pipelines

原本的RDD是非Schema的資料。「在Spark 1.3版本,SchemaRDD被重新命名為DataFrame [8]。」從圖3a可以看到,在基於Spark SQL概念發展出來的 DataFrames 資料型態,與原本 MLlib 的基礎之上,新增了 ML Pipelines。「Spark 1.2中,通過與AMPLab(UC Berkeley)合作,一個Pipeline API被添加到MLlib,再次簡化了MLlib的建立工作,並添加了針對ML pipelines的調優機制 [13]。 」

「實際應用中,一個ML管道往往包括一系列的階段,比如數據預處理,特徵提取,模型擬合及可視化。舉個例子,文本分類可能就會包含文本分割與清洗,特徵提取,並通過交叉驗證訓練一個分類模型。雖然當下每個步驟都有許多庫可以使用,但是將每個步驟連接起來卻並不是件容易的事情,特別是在大規模場景下 [13]。」

「幸運的是,Spark SQL已經提供了大多數所期望的功能,機構不需要再重新開始。Spark支持從Parque讀取SchemaRDDs,並支持將SchemaRDDs寫入對應的Parque。Parque是一個非常有效的列存儲格式,可以在RDD和SchemaRDD之間自由轉換,它們同時還支持Hive和Avro這樣的外部數據源。使用Spark SQL,建立新列將非常便捷和友好。SchemaRDD實體化使用了lazy模式,Spark SQL可以基於列的需求來優化執行計劃,可以較好的滿足用戶需求。SchemaRDD支持標準的數據類型,為了讓其可以更好地支持ML,技術團隊為其添加了對向量類型的支持(用戶定義類型),同時支持密集和稀疏特徵向量 [13]。」

-----


Fig. 3b. Spark [3].

-----

4. DataFrames / Datasets

A. DataFrames

「DataFrame是一個分佈式集合,其中數據被組織為命名的列。它概念上等價於關系數據庫中的表,但底層做了更多的優化。DataFrame可以從很多數據源構建,比如:已經存在的RDD、結構化文件、外部數據庫、Hive表。DataFrame的前身是SchemaRDD,從Spark 1.3.0開始SchemaRDD更名為DataFrame。與SchemaRDD的主要區別是:DataFrame不再直接繼承自RDD,而是自己實現了RDD的絕大多數功能 [18]。」

普通的RDD和DataFrame的邏輯框架區別如圖3c所示,用起來是不是比較輕鬆?

-----


Fig. 3c. RDD and DataFrame [18].

-----

B. Datasets

「在有些情況下RDD可以表達的邏輯用DataFrame無法表達,所以後續提出了Dataset API,Dataset結合了RDD和DataFrame的好處 [18]。」

「Dataset是Spark 1.6新添加的一個實驗性接口,其目的是想結合RDD的好處(強類型(這意味著可以在編譯時進行類型安全檢查)、可以使用強大的lambda函數)和Spark SQL的優化執行引擎的好處。可以從JVM對象構造出Dataset,然後使用類似於RDD的函數式轉換算子(map/flatMap/filter等)對其進行操作。 實際上Dataset是包含了DataFrame的功能的,這樣二者就出現了很大的冗餘,故Spark 2.0將二者統一:保留Dataset API,把DataFrame表示為Dataset[Row],即Dataset的子集 [18]。」

「我們在使用API時,應該優先選擇DataFrame / Dataset,因為它的性能很好,而且以後的優化它都可以享受到,但是為了兼容早期版本的程式,RDD API也會一直保留著。後續Spark上層的庫將全部會用 DataFrame / Dataset,比如MLlib、Streaming、Graphx等 [18]。」

-----

C. 什麼時候使用RDD?

「在以下場景中,請考慮使用RDD:
  • 你需要使用low-level的transformation和action來控制你的數據集; 
  • 你的數據是非結構化的,比如,流媒體或者文本; 
  • 你想使用函數式編程來操作你得數據,而不是用特定領域語言(DSL)表達; 
  • 你不在乎schema,比如,列存儲格式,通過名字或列處理數據。 
  • 你放棄使用DataFrame和Dataset來優化結構化和半結構化數據 [16]。」
-----

D. 什麼時候使用DataFrame或者Dataset? 
  • 「如果您需要豐富的語義,高級抽象和特定於領域語言的API,請使用DataFrame或Dataset。 
  • 你處理的半結構化數據集需要high-level表達式,filter,map,aggregation,average,sum,SQL 查詢,列式訪問和使用lambda函數,那你可DataFrame或者Dataset; 
  • 如果希望在編譯時檢測更高程度的類型安全性,需要類型化的JVM對象,利用Catalyst優化,並從Tungsten的高效代碼生成中受益,使用Dataset。 
  • 你想統一和簡化API使用跨Spark的Library,那你可DataFrame或者Dataset; 
  • 如果你是一個R語言用戶,那你可DataFrame或者Dataset; 
  • 如果您是Python用戶,請使用DataFrames,如果需要更多控制,可以轉回RDD。」
-----

RDD、DataFrame、Dataset三者有許多共性,有各自適用的場景常常需要在三者之間轉換[19]。

有關 RDD、DataFrame、DataSet 的演進,可以參考圖3d。

-----


Fig. 3d. DataFrames / Datasets [4]. 

-----

5.1 Standalone

「作為Spark的一部分,Standalone是一個簡單的集群管理器。它具有master的HA,彈性應對WorkerFailures,對每個應用程序的管理資源的能力,並且可以在現有的Hadoop一起運行和訪問HDFS的數據。該發行版包括一些腳本,可以很容易地部署在本地或在AmazonEC2雲計算。它可以在Linux,Windows或Mac OSX上運行 [20]。」

-----

5.2 Mesos

「Apache Mesos ,分佈式系統內核,具有HA的masters和slaves,可以管理每個應用程序的資源,並對Docker容器有很好的支持。它可以運行Spark工 作, Hadoop的MapReduce的,或任何其他服務的應用程序。它有Java, Python和C ++ 的API。它可以在Linux或Mac OSX上運行 [20]。」

-----

5.3 YARN

「Hadoop YARN,作業調度和集群資源管理的分佈式計算框架,具有HA為masters和slaves,在非安全模式下支持Docker容器,在安全模式下支持Linux和Windows container executors,和可插拔的調度器。它可以運行在Linux和Windows上運行 [20]。 」

-----

以下是三者的使用情境建議:

「從對比上看,Mesos似乎是Spark更好的選擇,也是被官方推薦的。但如果你同時運行Hadoop和Spark,從兼容性上考慮,YARN 似乎是更好的選擇。 Spark on YARN運行的也不錯。 如果你不僅運行了Hadoop,Spark。還在資源管理上運行了Docker,Mesos似乎更加通用。Standalone 對於小規模計算集群,似乎更適合! [20]。」

-----


Fig. 4a. Spark [5].

-----


 Fig. 4b. Standalone [2].

-----

結論:

圖5a可以說是本文的小結。

從最早的 RDD,發展到後來的 DataFrame,更容易與其他的軟體框架交換資料,而幾個重要的 Spark 程式庫也都墊基於 DataFrame 之上。

圖5b則是 Spark 機器學習的總結。

從較早的 RDD / MLlib,到稍後的 DataFrame / ML Pipeline,主要是參考了 Python 的 Pandas DataFrame / scikit-learn 架構,使得 Machine Learning 程式的開發更容易。另外 DataFrame 從 Spark 轉到 Python,也可幫助使用 Python 強大的視覺工具 matplotlib。

基於 DataFrame 的架構則讓眾多大數據的來源都可透過 Spark ML Pipeline 加以分析。

-----


Fig. 5a. Future of Spark [6].

-----


Fig. 5b. Future of Spark [7].

-----

References

[1] Fred 豢養的雲中象  Hadoop 2.0 — 讓大象跳舞的 YARN
http://fredbigdata.blogspot.tw/2013/08/hadoop-20-yarn.html 

[2] Apache Spark - DZone - Refcardz
https://dzone.com/refcardz/apache-spark

[3] 10 Things I Wish I Knew Before Using Apache SparkR - The Databricks Blog
https://databricks.com/blog/2016/12/28/10-things-i-wish-i-knew-before-using-apache-sparkr.html

[4] Difference between DataFrame and RDD in Spark - Stack Overflow
https://stackoverflow.com/questions/31508083/difference-between-dataframe-and-rdd-in-spark

[5] Diving Into Apache Spark  Part 2 Apache Spark Components
https://turbonomic.com/blog/on-technology/diving-into-apache-spark-part-2/

[6] R Spark training Mumbai - Hadoop Training Bangalore
http://www.hadooptrainingbangalore.in/r-spark-training-mumbai/ 

[7] 使用Python開發Spark 2.0 +Hadoop機器學習與大數據分析 _ Python+Spark+Hadoop 機器學習與大數據分析實戰
http://pythonsparkhadoop.blogspot.tw/2016/10/pythonspark-20-hadoop.html
 
[8] Apache Spark - 維基百科,自由的百科全書
https://zh.wikipedia.org/wiki/Apache_Spark

[9] 大資料技術新秀Spark如何通吃批次和串流資料分析能力 _ iThome
http://www.ithome.com.tw/news/103290 

[10] 分散式計算的新角色Spark _ iThome
http://www.ithome.com.tw/voice/94139

[11] Spark RDD (Resilient Distributed Datasets) 詳細圖文介紹 @ caca的程式之路   痞客邦 PIXNET
http://yjhyjhyjh0.pixnet.net/blog/post/411468760-spark-rdd-%28resilient-distributed-datasets%29-%E8%A9%B3%E7%B4%B0%E5%9C%96%E6%96%87%E4%BB%8B

[12] 理解Spark的核心RDD
http://www.infoq.com/cn/articles/spark-core-rdd

[13] ML Pipelines:Spark 1.2中一个用于MLlib的High-Level API _ 数盟社区
http://dataunion.org/8967.html

[14] ML Pipelines  A New High-Level API for MLlib - The Databricks Blog
https://databricks.com/blog/2015/01/07/ml-pipelines-a-new-high-level-api-for-mllib.html

[15] A Tale of Three Apache Spark APIs  RDDs, DataFrames, and Datasets - The Databricks Blog
https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html

[16] Apache Spark 2.0三种API的传说:RDD,DataFrame和Dataset[译] _ BI Hell
http://bihell.com/2017/01/05/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets/

[17] Spark分散式運算的演進 RDD、Spark DataFrame、SparkSQL _ Python+Spark+Hadoop 機器學習與大數據分析實戰
http://pythonsparkhadoop.blogspot.tw/2016/11/sparkrddspark-dataframesparksql.html

[18] Spark結構化數據處理:Spark SQL、DataFrame和Dataset - 歌穀穀
http://www.gegugu.com/2016/12/28/22660.html

[19] 谈谈RDD、DataFrame、Dataset的区别和各自的优势 - sweatear - 博客园
http://www.cnblogs.com/starwater/p/6841807.html

[20] Spark的三种集群deploy模式对比 – 字母哥博客
http://www.zimug.com/347.html 

[21] Apache Spark Cluster Managers  YARN, Mesos, or Standalone  - AgilData
http://www.agildata.com/apache-spark-cluster-managers-yarn-mesos-or-standalone/ 

No comments: