天天看點

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核數。

至于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

繼續閱讀