1. 程式人生 > >【精】從入門到高深,史上最全的Spark綜合帖

【精】從入門到高深,史上最全的Spark綜合帖

http://dataunion.org/2824.html

什麼是Spark

Spark是UC Berkeley AMP lab所開源的類Hadoop MapReduce的通用的平行計算框架,Spark基於map reduce演算法實現的分散式計算,擁有Hadoop MapReduce所具有的優點;但不同於MapReduce的是Job中間輸出和結果可以儲存在記憶體中,從而不再需要讀寫HDFS,因此Spark能更好地適用於資料探勘與機器學習等需要迭代的map reduce的演算法。

Spark的適用場景

Spark是基於記憶體的迭代計算框架,適用於需要多次操作特定資料集的應用場合。需要反覆操作的次數越多,所需讀取的資料量越大,受益越大,資料量小但是計算密集度較大的場合,受益就相對較小(大資料庫架構中這是是否考慮使用Spark的重要因素)

由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的儲存或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
總的來說Spark的適用面比較廣泛且比較通用。

執行模式

  • 本地模式
  • Standalone模式
  • Mesoes模式
  • yarn模式

Spark生態系統

Shark ( Hive on Spark): Shark基本上就是在Spark的框架基礎上提供和Hive一樣的H iveQL命令介面,為了最大程度的保持和Hive的相容性,Shark使用了Hive的API來實現query Parsing和 Logic Plan generation,最後的PhysicalPlan execution階段用Spark代替Hadoop MapReduce。通過配置Shark引數,Shark可以自動在記憶體中快取特定的RDD,實現資料重用,進而加快特定資料集的檢索。同時,Shark通過UDF使用者自定義函式實現特定的資料分析學習演算法,使得SQL資料查詢和運算分析能結合在一起,最大化RDD的重複使用。

Spark streaming: 構建在Spark上處理Stream資料的框架,基本的原理是將Stream資料分成小的時間片斷(幾秒),以類似batch批量處理的方式來處理這小部分資料。Spark Streaming構建在Spark上,一方面是因為Spark的低延遲執行引擎(100ms+)可以用於實時計算,另一方面相比基於Record的其它處理框架(如Storm),RDD資料集更容易做高效的容錯處理。此外小批量處理的方式使得它可以同時相容批量和實時資料處理的邏輯和演算法。方便了一些需要歷史資料和實時資料聯合分析的特定應用場合。

Bagel: Pregel on Spark,可以用Spark進行圖計算,這是個非常有用的小專案。Bagel自帶了一個例子,實現了Google的PageRank演算法。

想成為Spark大資料高手要怎麼做?

伴隨Spark技術的普及推廣,對專業人才的需求日益增加。Spark專業人才在未來也是炙手可熱,輕而易舉可以拿到百萬的薪酬。而要想成為Spark高手,也需要一招一式,從內功練起:通常來講需要經歷以下階段:

第一階段:熟練的掌握Scala語言

Spark框架是採用Scala語言編寫的,精緻而優雅。要想成為Spark高手,你就必須閱讀Spark的原始碼,就必須掌握Scala,;

雖然說現在的Spark可以採用多語言Java、Python等進行應用程式開發,但是最快速的和支援最好的開發API依然並將永遠是Scala方式的API,所以你必須掌握Scala來編寫複雜的和高效能的Spark分散式程式;

尤其要熟練掌握Scala的trait、apply、函數語言程式設計、泛型、逆變與協變等;

入門Scala可參考以下文章:

第二階段:精通Spark平臺本身提供給開發者API

掌握Spark中面向RDD的開發模式,掌握各種transformation和action函式的使用;

掌握Spark中的寬依賴和窄依賴以及lineage機制;

掌握RDD的計算流程,例如Stage的劃分、Spark應用程式提交給叢集的基本過程和Worker節點基礎的工作原理等

擴充套件閱讀:

第三階段:深入Spark核心

此階段主要是通過Spark框架的原始碼研讀來深入Spark核心部分:

通過原始碼掌握Spark的任務提交過程;

通過原始碼掌握Spark叢集的任務排程;

尤其要精通DAGScheduler、TaskScheduler和Worker節點內部的工作的每一步的細節;

推薦閱讀:

第四階級:掌握基於Spark上的核心框架的使用

Spark作為雲端計算大資料時代的集大成者,在實時流處理、圖技術、機器學習、NoSQL查詢等方面具有顯著的優勢,我們使用Spark的時候大部分時間都是在使用其上的框架例如Shark、Spark Streaming等:

Spark Streaming是非常出色的實時流處理框架,要掌握其DStream、transformation和checkpoint等;

Spark的離線統計分析功能,Spark 1.0.0版本在Shark的基礎上推出了Spark SQL,離線統計分析的功能的效率有顯著的提升,需要重點掌握;

對於Spark的機器學習和GraphX等要掌握其原理和用法;

第五階級:做商業級別的Spark專案

通過一個完整的具有代表性的Spark專案來貫穿Spark的方方面面,包括專案的架構設計、用到的技術的剖析、開發實現、運維等,完整掌握其中的每一個階段和細節,這樣就可以讓您以後可以從容面對絕大多數Spark專案。

第六階級:提供Spark解決方案

徹底掌握Spark框架原始碼的每一個細節;

根據不同的業務場景的需要提供Spark在不同場景的下的解決方案;

根據實際需要,在Spark框架基礎上進行二次開發,打造自己的Spark框架;

前面所述的成為Spark高手的六個階段中的第一和第二個階段可以通過自學逐步完成,隨後的三個階段最好是由高手或者專家的指引下一步步完成,最後一個階段,基本上就是到”無招勝有招”的時期,很多東西要用心領悟才能完成。

Spark的硬體配置有哪些要求?

Spark與儲存系統

如果Spark使用HDFS作為儲存系統,則可以有效地運用Spark的standalone mode cluster,讓Spark與HDFS部署在同一臺機器上。這種模式的部署非常簡單,且讀取檔案的效能更高。當然,Spark對記憶體的使用是有要求的,需要合理分配它與HDFS的資源。因此,需要配置Spark和HDFS的環境變數,為各自的任務分配記憶體和CPU資源,避免相互之間的資源爭用。

若HDFS的機器足夠好,這種部署可以優先考慮。若資料處理的執行效率要求非常高,那麼還是需要採用分離的部署模式,例如部署在Hadoop YARN叢集上。

擴充套件閱讀:

Spark對磁碟的要求

Spark是in memory的迭代式運算平臺,因此它對磁碟的要求不高。Spark官方推薦為每個節點配置4-8塊磁碟,且並不需要配置為RAID(即將磁碟作為單獨的mount point)。然後,通過配置spark.local.dir來指定磁碟列表。

Spark對記憶體的要求

Spark雖然是in memory的運算平臺,但從官方資料看,似乎本身對記憶體的要求並不是特別苛刻。官方網站只是要求記憶體在8GB之上即可(Impala要求機器配置在128GB)。當然,真正要高效處理,仍然是記憶體越大越好。若記憶體超過200GB,則需要當心,因為JVM對超過200GB的記憶體管理存在問題,需要特別的配置。

記憶體容量足夠大,還得真正分給了Spark才行。Spark建議需要提供至少75%的記憶體空間分配給Spark,至於其餘的記憶體空間,則分配給作業系統與buffer cache。這就需要部署Spark的機器足夠乾淨。

Spark對網路的要求

Spark屬於網路繫結型系統,因而建議使用10G及以上的網路頻寬。

Spark對CPU的要求

Spark可以支援一臺機器擴充套件至數十個CPU core,它實現的是執行緒之間最小共享。若記憶體足夠大,則制約運算效能的就是網路頻寬與CPU數。

關於硬體配置的更多詳盡內容見Spark的硬體配置