1. 程式人生 > >spark學習一

spark學習一

Spark背景

背景: 
Spark出現之前,Hadoop的迅速發展,hadoop分散式叢集,把程式設計簡化為自動提供 位置感知性排程,容錯,以及負載均衡的一種模式,使用者就可以在普通的PC機上執行超大叢集運算,hadoop有一個非常大的問題:hadoop是基於流處理的,hadoop會從(物理儲存)hdfs中載入資料,然後處理之後再返回給物理儲存hdfs中,這樣不斷的讀取與寫入,佔用了大量的IO,後來hadoop出現了非迴圈的資料流模型,也就是DAG,但是其中任然出現了兩個重大的問題: 
  • 任然是不斷的重複寫入和讀取磁碟。每次操作都要完成這兩步,太浪費了。 
  • 互動式資料查詢。比如:使用者不斷查詢具體的一個使用者的子集。 
  • 比如,機器學習,圖計算,資料探勘方面不適用,現在要做大量的重複操作,並且下一次的開始,要依據前面計算的結果,這樣對於hadoop來說就要重新的計算,從而浪費大量的資源。 
在千億級大資料環境下,特徵挖 掘、實時處理、即席分析、離線計算等場景對計算、儲存的效能要求非常高。基於傳統的關係型資料庫、分散式Hadoop平臺實現的資料探勘平臺,無法滿足所 有的計算場景的要求。
基於上述: 
spak提出了分散式的記憶體抽象,RDD(彈性分散式資料集)支援工作集的應用,也具有資料流模型的特點,例如,自動容錯,位置感知,可伸縮性和可擴充套件性,並且RDD支援多個查詢時,顯示的將工作集快取到記憶體中,後續查詢時能夠重用工作集的結果。這樣與hadoop相比,就極大的提高了速度。 
RDD提供了共享記憶體模型,RDD本身只記錄分割槽的集合,只能通過其他的RDD通過轉換例如,map,join等操作來建立新的RDD,而RDD並不需要檢查點操作,為什麼?因為前後之間的RDD是有”血統”關係的,其核心原因是,每個RDD包含了從其他RDD計算出分割槽的所有內容,並且這個計算不是從頭開始計算,而是僅僅指的是從上一步開始計算得到即可,這也就實現了工作集的複用。 
Spark周圍的SQL,機器學習,圖計算都是基於此構建出來的,使得Spark成為一體化的
大資料
平臺,不僅降低了各個開發,運維的成本,也提高了效能。和Hadoop 進行對比:

  • 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來提高可用性。
Hadoop MapReduce MapReduce為大資料探勘提供了有力的支援,但是複雜的挖掘演算法往往需要多個MapReduce作業才能完成,多個作業之間存在著冗餘的磁碟讀寫開銷和多次資源申請過程,使得基於MapReduce的演算法實現存在嚴重的效能問題。大處理處理後起之秀Spark得益於其在迭代計算和記憶體計算上的優勢,可以自動排程複雜的計算任務,避免中間結果的磁碟讀寫和資源申請過程,非常適合資料探勘演算法。騰訊TDW Spark平臺基於社群最新Spark版本進行深度改造,在效能、穩定和規模方面都得到了極大的提高,為大資料探勘任務提供了有力的支援。 RDD 相比與MapReduce程式設計模型,Spark提供了更加靈活的DAG(Directed Acyclic Graph) 程式設計模型, 不僅包含傳統的map、reduce介面, 還增加了filter、flatMap、union等操作介面,使得編寫Spark程式更加靈活方便。
相對於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作為通訊框架;