歡迎光臨
每天分享高質量文章

什麼是Apache Spark?這篇文章帶你從零基礎學起

導讀:Apache Spark是一個強大的開源處理引擎,最初由Matei Zaharia開發,是他在加州大學伯克利分校的博士論文的一部分。Spark的第一個版本於2012年釋出。

Apache Spark是快速、易於使用的框架,允許你解決各種複雜的資料問題,無論是半結構化、結構化、流式,或機器學習、資料科學。它也已經成為大資料方面最大的開源社群之一,擁有來自250多個組織的超過1000個貢獻者,以及遍佈全球570多個地方的超過30萬個Spark Meetup社群成員。

在本文中,我們將提供一個瞭解Apache Spark的切入點。我們將解釋Spark Job和API背後的概念。

 

作者:託馬茲·卓巴斯(Tomasz Drabas),丹尼·李(Denny Lee)

如需轉載請聯絡大資料(ID:hzdashuju)

 

 

01 什麼是Apache Spark

 

Apache Spark是一個開源的、強大的分散式查詢和處理引擎。它提供MapReduce的靈活性和可擴充套件性,但速度明顯更高:當資料儲存在記憶體中時,它比Apache Hadoop快100倍,訪問磁碟時高達10倍。

 

Apache Spark允許使用者讀取、轉換、聚合資料,還可以輕鬆地訓練和部署複雜的統計模型。Java、Scala、Python、R和SQL都可以訪問 Spark API。

Apache Spark可用於構建應用程式,或將其打包成為要部署在叢集上的庫,或透過筆記本(notebook)(例如Jupyter、Spark-Notebook、Databricks notebooks和Apache Zeppelin)互動式執行快速的分析。

 

Apache Spark提供的很多庫會讓那些使用過Python的pandas或R語言的data.frame 或者data.tables的資料分析師、資料科學家或研究人員覺得熟悉。非常重要的一點是,雖然Spark DataFrame會讓pandas或data.frame、data.tables使用者感到熟悉,但是仍有一些差異,所以不要期望過高。具有更多SQL使用背景的使用者也可以用該語言來塑造其資料。

此外,Apache Spark還提供了幾個已經實現並調優過的演演算法、統計模型和框架:為機器學習提供的MLlib和ML,為圖形處理提供的GraphX和GraphFrames,以及Spark Streaming(DStream和Structured)。Spark允許使用者在同一個應用程式中隨意地組合使用這些庫。

 

Apache Spark可以方便地在本地膝上型電腦上執行,而且還可以輕鬆地在獨立樣式下透過YARN或Apache Mesos於本地叢集或雲中進行部署。它可以從不同的資料源讀取和寫入,包括(但不限於)HDFS、Apache Cassandra、Apache HBase和S3:

 

▲資料來源:Apache Spark is the smartphone of Big Data

http://bit.ly/1QsgaNj

 

02 Spark作業和API

 

在本節中,我們將簡要介紹Apache Spark作業(job)和API

 

1. 執行過程

 

任何Spark應用程式都會分離主節點上的單個驅動行程(可以包含多個作業),然後將執行行程(包含多個任務)分配給多個工作節點,如下圖所示:

 

 

驅動行程會確定任務行程的數量和組成,這些任務行程是根據為指定作業生成的圖形分配給執行節點的。註意,任何工作節點都可以執行來自多個不同作業的多個任務。

 

Spark作業與一系列物件依賴相關聯,這些依賴關係是以有向無環圖(DAG)的方式組織的,例如從Spark UI生成的以下示例。基於這些,Spark可以最佳化排程(例如確定所需的任務和工作節點的數量)並執行這些任務。

 

有關DAG排程器的更多資訊,請參考:

http://bit.ly/29WTiK8

 

2. 彈性分散式資料集

 

彈性分散式資料集(簡稱RDD)是不可變Java虛擬機器(JVM)物件的分散式集合,Apache Spark就是圍繞著RDD而構建的。我們使用Python時,尤為重要的是要註意Python資料是儲存在這些JVM物件中的。

這些物件允許作業非常快速地執行計算。對RDD的計算依據快取和儲存在記憶體中的樣式進行:與其他傳統分散式框架(如Apache Hadoop)相比,該樣式使得計算速度快了一個數量級。

 

同時,RDD會給出一些粗粒度的資料轉換(例如map(…)、reduce(…)和filter(…)),保持Hadoop平臺的靈活性和可擴充套件性,以執行各種各樣的計算。RDD以並行方式應用和記錄資料轉換,從而提高了速度和容錯能力。

透過註冊這些轉換,RDD提供資料沿襲——以圖形形式給出的每個中間步驟的祖先樹。這實際上保護RDD免於資料丟失——如果一個RDD的分割槽丟失,它仍然具有足夠的資訊來重新建立該分割槽,而不是簡單地依賴複製。

更多資料沿襲資訊參見:

http://ibm.co/2ao9B1t

RDD有兩組並行操作:轉換(傳回指向新RDD的指標)和動作(在執行計算後向驅動程式傳回值)。

請參閱Spark程式設計指南,獲取最新的轉換和動作串列:

 http://spark.apache.org/docs/latest/programming-guide.html#rdd-operations

某種意義上來說,RDD轉換操作是惰性的,因為它們不立即計算其結果。只有動作執行了並且需要將結果傳回給驅動程式時,才會計算轉換。該延遲執行會產生更多精細查詢:針對效能進行最佳化的查詢。

這種最佳化始於Apache Spark的DAGScheduler——面向階段的排程器,使用如上面截圖中所示的階段進行轉換。由於具有單獨的RDD轉換和動作,DAGScheduler可以在查詢中執行最佳化,包括能夠避免shuffle資料(最耗費資源的任務)。

有關DAGScheduler和最佳化(特別是窄或寬依賴關係)的更多資訊,有一個很好的參考是《Effective Transformations》第5章:

 

https://smile.amazon.com/High-Performance-Spark-Practices-Optimizing/dp/1491943203

3. DataFrame

DataFrame像RDD一樣,是分佈在叢集的節點中的不可變的資料集合。然而,與RDD不同的是,在DataFrame中,資料是以命名列的方式組織的。

如果你熟悉Python的pandas或者R的data.frames,這是一個類似的概念。

DataFrame旨在使大型資料集的處理更加容易。它們允許開發人員對資料結構進行形式化,允許更高階的抽象。在這個意義上來說,DataFrame與關係資料庫中的表類似。DataFrame提供了一個特定領域的語言API來操作分散式資料,使Spark可以被更廣泛的受眾使用,而不只是專門的資料工程師。

DataFrame的一個主要優點是,Spark引擎一開始就構建了一個邏輯執行計劃,而且執行生成的程式碼是基於成本最佳化程式確定的物理計劃。與Java或者Scala相比,Python中的RDD是非常慢的,而DataFrame的引入則使效能在各種語言中都保持穩定。

4. Catalyst最佳化器

Spark SQL是Apache Spark最具技術性的元件之一,因為它支援SQL查詢和DataFrame API。Spark SQL的核心是Catalyst最佳化器。最佳化器基於函式式程式設計結構,並且旨在實現兩個目的:簡化向Spark SQL新增新的最佳化技術和特性的條件,並允許外部開發人員擴充套件最佳化器(例如,新增資料源特定規則,支援新的資料型別等等):

 

 

詳細資訊,請檢視Deep Dive into Spark SQL’s Catalyst Optimizer :

http://bit.ly/271I7Dk

和Apache Spark DataFrames: 

Simple and Fast Analysis of Structured Data 

http://bit.ly/29QbcOV

6. 鎢絲計劃

Tungsten(鎢絲)是Apache Spark執行引擎專案的代號。該專案的重點是改進Spark演演算法,使它們更有效地使用記憶體和CPU,使現代硬體的效能發揮到極致。

該專案的工作重點包括:

  • 顯式管理記憶體,以消除JVM物件模型和垃圾回收的開銷。

  • 設計利用記憶體層次結構的演演算法和資料結構。

  • 在執行時生成程式碼,以便應用程式可以利用現代編譯器並最佳化CPU。

  • 消除虛擬函式排程,以減少多個CPU呼叫。

  • 利用初級程式設計(例如,將即時資料載入到CPU暫存器),以加速記憶體訪問並最佳化Spark的引擎,以有效地編譯和執行簡單迴圈。

更多詳細資訊,請參考Project Tungsten: 

Bringing Apache Spark Closer to Bare Metal 

https://databricks.com/blog/2015/04/28/project-tungstenbringing-spark-closer-to-bare-metal.html

Deep Dive into Project Tungsten: Bringing Spark Closer to Bare Metal [SSE 2015 Video and Slides

https://spark-summit.org/2015/events/deep-dive-into-project-tungsten-bringing-spark-closerto-bare-metal/

Apache Spark as a Compiler: Joining a Billion Rows per Second on a Laptop 

https://databricks.com/blog/2016/05/23/apache-sparkas-a-compiler-joining-a-billion-rows-per-second-on-alaptop.html

本文摘編自《PySpark實戰指南:利用Python和Spark構建資料密集型應用並規模化部署》,經出版方授權釋出。

延伸閱讀《PySpark實戰指南

點選上圖瞭解及購買

轉載請聯絡微信:DoctorData

推薦語:Pyspark的實用參考指南,深度挖掘Python+Spark的強大功能。 

贊(0)

分享創造快樂