10 shuffle調優原理概述 效能優化

2021-08-16 19:10:06 字數 1352 閱讀 3103

什麼的情況下會發生shuffle?

在spark中,最主要是以下幾個運算元:groupbykey,reducebykey,countbykey ,join等

什麼是shuffle?

groupbykey ,把分布在集群各個節點上的資料中,同乙個key,對應的values,都給集中到一塊,集中到集群中的同乙個節點,更嚴密的一點說,就是集中到乙個節點的乙個executor的乙個task中。

然後呢,集中乙個key對應的values之後,才能交給我們來進行處理,>;

reducebykey運算元函式去對values集合進行reduce操作,最後變成乙個value;

countbykey需要在乙個task中,獲取到乙個key對應的所有value,然後進行計數,統計總共有多少個value。

join操作rdd,rdd只要是兩個rdd中,key相同,對應2個value,能到乙個節點的executor的task中,給我們進行處理。

每乙個shuffle的前半部分stage的task,每乙個task都會建立下乙個stage的task數量相同的檔案,比如下乙個stage會有100個task,那麼當前的stage每個task都會建立100份檔案;會將同乙個key對應的values,一定是寫入同乙個檔案中的;不同節點上的task,也一定會將同乙個key對應的values寫入下乙個stage,同乙個task對應的檔案中

shuffle的後半部分stage的task,每個task都會從各個節點上的task寫的屬於自己的那乙份檔案中,拉去key,value對,然後task會有乙個記憶體緩衝區,然後利用hashmap,進行key,value的匯聚,生成(key,value)的對,task會用我們自己定義的聚合函式,比如reducebykey(_+_),把所有的value進行一對一的累加,聚合出來最終的值,完成了shuffle。

shuffle一定是分為兩個stage完成的,因為這其實是乙個逆向過程,不是stage決定shuffle,是shuffle決定stage。

reducebykey(_+_)在某個action觸發job的時候,dagscheduler會負責劃分job為多個stage,劃分的依據就是如果發現會有觸發shuffle操作的運算元,比如reducebykey,就將這個操作的前半部分以及之前所有rdd的transformation操作劃分為乙個stage;shuffle操作的後半部分以及後面的transformation,直到shuffle運算元或者action劃分為另乙個stage。

shuffle前半部分的task在寫入資料到磁碟檔案之前,都會先輸入到記憶體快取中,記憶體快取溢滿之後,在spill溢寫到磁碟檔案中。

2018/03/12 13:31

spark調優 shuffle調優

基於spark1.6 引數可以通過 new sparkcontext set 來設定,也可以通過命令的引數設定 conf spark.shuffle.file.buffer 預設值 32k 引數說明 該引數用於設定shuffle write task的bufferedoutputstream的buf...

spark調優 shuffle調優

每乙個shuffle的前半部分stage的task,每個task都會建立下乙個stage的task數量相同的檔案,比如下乙個stage會有100個task,那麼當前stage每個task都會建立100份檔案,會將同乙個key對應的values,一定是寫入同乙個檔案中的,也一定會將同乙個key對應的v...

七 Spark效能調優 Shuffle 調優

目錄 一 調節 map 端緩衝區大小 二 調節 reduce 端拉取資料緩衝區大小 三 調節 reduce 端拉取資料重試次數 四 調節 reduce 端拉取資料等待間隔 五 調節 sortshuffle 排序操作閾值 val conf new sparkconf set spark.shuffle...