spark 原理

什么是RDD

RDD作為數據結構,本質上是一個只讀的分區記錄集合。一個RDD可以包含多個分區,每個分區就是一個dataset片段。RDD可以相互依賴。如果RDD的每個分區最多只能被一個Child RDD的一個分區使用,則稱之為narrow dependency;若多個Child RDD分區都可以依賴,則稱之為wide dependency。不同的操作依據其特性,可能會產生不同的依賴。例如map操作會產生narrow dependency,而join操作則產生wide dependency。

1.Spark生態圈

如下圖所示為Spark的整個生態圈,最底層為資源管理器,采用Mesos、Yarn等資源管理集群或者Spark自帶的Standalone模式,底層存儲為文件系統或者其他格式的存儲系統如HBase。Spark作為計算框架,為上層多種應用提供服務。Graphx和MLBase提供數據挖掘服務,如圖計算和挖掘迭代計算等。Shark提供SQL查詢服務,兼容Hive語法,性能比Hive快3-50倍,BlinkDB是一個通過權衡數據精確度來提升查詢晌應時間的交互SQL查詢引擎,二者都可作為交互式查詢使用。Spark Streaming將流式計算分解成一系列短小的批處理計算,并且提供高可靠和吞吐量服務。

Paste_Image.png

2.Spark基本原理

Spark運行框架如下圖所示,首先有集群資源管理服務(Cluster Manager)和運行作業任務的結點(Worker Node),然后就是每個應用的任務控制結點Driver和每個機器節點上有具體任務的執行進程(Executor)。

Paste_Image.png

與MR計算框架相比,Executor有二個優點:
一個是多線程來執行具體的任務,而不是像MR那樣采用進程模型,減少了任務的啟動開稍。
二個是Executor上會有一個BlockManager存儲模塊,類似于KV系統(內存和磁盤共同作為存儲設備),當需要迭代多輪時,可以將中間過程的數據先放到這個存儲系統上,下次需要時直接讀該存儲上數據,而不需要讀寫到hdfs等相關的文件系統里,或者在交互式查詢場景下,事先將表Cache到該存儲系統上,提高讀寫IO性能。
另外Spark在做Shuffle時,在Groupby,Join等場景下去掉了不必要的Sort操作,相比于MapReduce只有Map和Reduce二種模式,Spark還提供了更加豐富全面的運算操作如filter,groupby,join等。

Paste_Image.png

Spark采用了Scala來編寫,在函數表達上Scala有天然的優勢,因此在表達復雜的機器學習算法能力比其他語言更強且簡單易懂。提供各種操作函數來建立起RDD的DAG計算模型。把每一個操作都看成構建一個RDD來對待,而RDD則表示的是分布在多臺機器上的數據集合,并且可以帶上各種操作函數。如下圖所示:

首先從hdfs文件里讀取文本內容構建成一個RDD,然后使用filter()操作來對上次的RDD進行過濾,再使用map()操作取得記錄的第一個字段,最后將其cache在內存上,后面就可以對之前cache過的數據做其他的操作。整個過程都將形成一個DAG計算圖,每個操作步驟都有容錯機制,同時還可以將需要多次使用的數據cache起來,供后續迭代使用。


3.spark 在yarn集群上運行

Paste_Image.png

1. 由client向ResourceManager提交請求,并上傳jar到HDFS上這期間包括四個步驟:
a). 連接到RM
b). 從RM ASM(ApplicationsManager )中獲得metric、queue和resource等信息。
c). upload app jar and spark-assembly jard). 設置運行環境和container上下文(launch-container.sh等腳本)

**2. **ResouceManager向NodeManager申請資源,創建Spark ApplicationMaster(每個SparkContext都有一個ApplicationMaster)
**3. **NodeManager啟動Spark App Master,并向ResourceManager AsM注冊
4. Spark ApplicationMaster從HDFS中找到jar文件,啟動DAGscheduler和YARN Cluster Scheduler
5. ResourceManager向ResourceManager AsM注冊申請container資源(INFO YarnClientImpl: Submitted application)
**6. **ResourceManager通知NodeManager分配Container,這時可以收到來自ASM關于container的報告。(每個container的對應一個executor)
**7. **Spark ApplicationMaster直接和container(executor)進行交互,完成這個分布式任務。
需要注意的是:
a). Spark中的localdir會被yarn.nodemanager.local-dirs替換
b). 允許失敗的節點數(spark.yarn.max.worker.failures)為executor數量的兩倍數量,最小為3.
c). SPARK_YARN_USER_ENV傳遞給spark進程的環境變量d). 傳遞給app的參數應該通過–args指定。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容