1. 程式人生 > >spark-使用總結-大資料基礎入門

spark-使用總結-大資料基礎入門

1、partition數目

spark的輸入可能以多個檔案的形式儲存在HDFS上,每個File都包含了很多塊,稱為Block。

當Spark讀取這些檔案作為輸入時,會根據具體資料格式對應的InputFormat進行解析,一般是將若干個Block合併成一個輸入分片,稱為InputSplit,注意InputSplit不能跨越檔案。 隨後將為這些輸入分片生成具體的Task。InputSplit與Task是一一對應的關係。 隨後這些具體的Task每個都會被分配到叢集上的某個節點的某個Executor去執行。 每個節點可以起一個或多個Executor。 每個Executor由若干core組成,每個Executor的每個core一次只能執行一個Task。 每個Task執行的結果就是生成了目標RDD的一個partiton。 注意: 這裡的core是虛擬的core而不是機器的物理CPU核,可以理解為就是Executor的一個工作執行緒。

而 Task被執行的併發度 = Executor數目 * 每個Executor核數。 大資料學習QQ群119599574

至於partition的數目:

對於資料讀入階段,例如sc.textFile,輸入檔案被劃分為多少InputSplit就會需要多少初始Task。 在Map階段partition數目保持不變。 在Reduce階段,RDD的聚合會觸發shuffle操作,聚合後的RDD的partition數目跟具體操作有關,例如repartition操作會聚合成指定分割槽數,還有一些運算元是可配置的。 2、spark部署模式的對比

這篇部落格中對三種部署模式做了對比,請參考部署模式對比:總結如下:

mesos似乎是Spark更好的選擇,也是被官方推薦的 但如果你同時執行hadoop和Spark,從相容性上考慮,Yarn似乎是更好的選擇,畢竟是親生的。Spark on Yarn執行的也不錯。 如果你不僅運行了hadoop,spark。還在資源管理上運行了docker,Mesos似乎更加通用。 standalone小規模計算叢集,似乎更適合! 對於yarn模式下的client和cluster對比,請參考client和cluster的對比: 理解YARN-Client和YARN-Cluster深層次的區別之前先清楚一個概念:Application Master。在YARN中,每個Application例項都有一個ApplicationMaster程序,它是Application啟動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源之後告訴NodeManager為其啟動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster程序的區別 YARN-Cluster模式下,Driver執行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的執行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上執行,因而YARN-Cluster模式不適合執行互動型別的作業 YARN-Client模式下,Application Master僅僅向YARN請求Executor,Client會和請求的Container通訊來排程他們工作,也就是說Client不能離開 (1)YarnCluster的Driver是在叢集的某一臺NM上,但是Yarn-Client就是在RM的機器上;  (2)而Driver會和Executors進行通訊,所以Yarn_cluster在提交App之後可以關閉Client,而Yarn-Client不可以;

(3)Yarn-Cluster適合生產環境,Yarn-Client適合互動和除錯。

3、spark執行原理

spark應用程式進行各種transformation的計算,最後通過action觸發job。提交之後,構建SparkContext,通過sparkContext根據RDD的依賴關係構建DAG圖,DAG圖提交給DAGScheduler進行解析,解析時是以shuffle為邊界,反向解析,構建stage,stage之間也有依賴關係,這個過程就是對DAG圖進行解析劃分stage,並且計算出各個stage之間的依賴關係。stage以stageSet方式提交給TaskScheduler,然後將一個個TaskSet提交給底層排程器,在spark中是提交給taskScheduler處理,生成TaskSet manager,最後提交給executor進行計算,executor多執行緒計算,完成task任務後,將完成資訊提交給schedulerBackend,由它將任務完成的資訊提交給TaskScheduler。TaskScheduler反饋資訊給TaskSetManager,刪除該task任務,執行下一個任務。同時TaskScheduler將完成的結果插入到成功佇列裡,加入之後返回加入成功的資訊。TaskScheduler將任務處理成功的資訊傳給TaskSet Manager。全部任務完成後TaskSet Manager將結果反饋給DAGScheduler。如果屬於resultTask,交給JobListener。如果不屬於resultTask,儲存結果。全部執行完之後寫入資料。 大資料學習QQ群119599574