spark學習一
阿新 • • 發佈:2019-01-03
Spark背景
背景:在Spark出現之前,Hadoop的迅速發展,hadoop分散式叢集,把程式設計簡化為自動提供 位置感知性排程,容錯,以及負載均衡的一種模式,使用者就可以在普通的PC機上執行超大叢集運算,hadoop有一個非常大的問題:hadoop是基於流處理的,hadoop會從(物理儲存)hdfs中載入資料,然後處理之後再返回給物理儲存hdfs中,這樣不斷的讀取與寫入,佔用了大量的IO,後來hadoop出現了非迴圈的資料流模型,也就是DAG,但是其中任然出現了兩個重大的問題:
- 任然是不斷的重複寫入和讀取磁碟。每次操作都要完成這兩步,太浪費了。
- 互動式資料查詢。比如:使用者不斷查詢具體的一個使用者的子集。
- 比如,機器學習,圖計算,資料探勘方面不適用,現在要做大量的重複操作,並且下一次的開始,要依據前面計算的結果,這樣對於hadoop來說就要重新的計算,從而浪費大量的資源。
基於上述:
spak提出了分散式的記憶體抽象,RDD(彈性分散式資料集)支援工作集的應用,也具有資料流模型的特點,例如,自動容錯,位置感知,可伸縮性和可擴充套件性,並且RDD支援多個查詢時,顯示的將工作集快取到記憶體中,後續查詢時能夠重用工作集的結果。這樣與hadoop相比,就極大的提高了速度。
RDD提供了共享記憶體模型,RDD本身只記錄分割槽的集合,只能通過其他的RDD通過轉換例如,map,join等操作來建立新的RDD,而RDD並不需要檢查點操作,為什麼?因為前後之間的RDD是有”血統”關係的,其核心原因是,每個RDD包含了從其他RDD計算出分割槽的所有內容,並且這個計算不是從頭開始計算,而是僅僅指的是從上一步開始計算得到即可,這也就實現了工作集的複用。
Spark周圍的SQL,機器學習,圖計算都是基於此構建出來的,使得Spark成為一體化的
- Spark的中間資料放到記憶體中,對於迭代運算效率更高。Spark更適合於迭代運算比較多的ML和DM運算。因為在Spark裡面,有RDD的抽象概念。
- Spark比Hadoop更通用。Spark提供的資料集操作型別有很多種,不像Hadoop只提供了Map和Reduce兩種操作。比如map, filter, flatMap, sample, groupByKey, reduceByKey, union, join, cogroup, mapValues,sort,partionBy等多種操作型別,Spark把這些操作稱為Transformations。同時還提供Count, collect, reduce, lookup, save等多種actions操作。這些多種多樣的資料集操作型別,給給開發上層應用的使用者提供了方便。各個處理節點之間的通訊模型不再像Hadoop那樣就是唯一的Data Shuffle一種模式。使用者可以命名,物化,控制中間結果的儲存、分割槽等。可以說程式設計模型比Hadoop更靈活。
- 不過由於RDD的特性,Spark不適用那種非同步細粒度更新狀態的應用,例如web服務的儲存或者是增量的web爬蟲和索引。就是對於那種增量修改的應用模型不適合。
- 容錯性。在RDD計算,通過checkpint進行容錯,而checkpoint有兩種方式,一個是checkpoint data,一個是logging the updates。使用者可以控制採用哪種方式來實現容錯,預設是logging the updates方式,通過記錄跟蹤所有生成RDD的轉換(transformations),也就是記錄每個RDD的lineage(血統)來重新計算生成丟失的分割槽資料。
- 可用性。Spark通過提供豐富的Scala, Java,Python API及互動式Shell來提高可用性。
相對於MapReduce,Spark在以下方面優化了作業的執行時間和資源使用。
- DAG程式設計模型。 通過Spark的DAG程式設計模型可以把七個MapReduce簡化為一個Spark作業。Spark會把該作業自動切分為八個Stage,每個Stage包含多個可並行執行的Tasks。Stage之間的資料通過Shuffle傳遞。最終只需要讀取和寫入HDFS一次。
- Spark作業啟動後會申請所需的Executor資源,所有Stage的Tasks以執行緒的方式執行,共用Executors,相對於MapReduce方式,Spark申請資源的次數減少了近90%。
- Spark引入了RDD(Resilient Distributed Dataset)模型,中間資料都以RDD的形式儲存,而RDD分佈儲存於slave節點的記憶體中,這就減少了計算過程中讀寫磁碟的次數。RDD還提供了Cache機制,例如對上圖的rdd3進行Cache後,rdd4和rdd7都可以訪問rdd3的資料。
- 提供了支援DAG圖的分散式平行計算框架,減少多次計算之間中間結果的IO開銷。對應pipeline。
- 提供Cache機制來支援多次迭代計算或者資料共享,減少IO開銷。對應快取級別。
- RDD之間維護了血統(lineage)關係,一旦RDD fail掉,能通過父RDD自動重建,保證了容錯性。根據寬窄依賴,分別有RDD重建和分割槽重建。
- 移動計算而非移動資料,RDD Partition可以就近讀取分散式檔案系統中的資料塊到各個節點記憶體中進行計算;
- 使用多執行緒池模型來減少task啟動開銷。
- Shuffle過程中不必要的sort操作。Spark 1.2版本後預設採用了sort機制;
- 採用容錯的、高可伸縮性的akka作為通訊框架;