您好,登錄后才能下訂單哦!
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核數。
至于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,保存結果。全部運行完之后寫入數據。
很多人都知道我有大數據培訓資料,都天真的以為我有全套的大數據開發、hadoop、spark等視頻學習資料。我想說你們是對的,我的確有大數據開發、hadoop、spark的全套視頻資料。
如果你對大數據開發感興趣可以加口群領取免費學習資料: 763835121
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。