Metrics測量指標
1. Used Resources
Job使用資源的數(shù)量,單位是:GB Hours
計算方式
我們將任務的資源使用定義為:所有mapper任務和所有reducer任務的資源使用的總和性雄。
例如:
有如下的job:
4 mappers with runtime {12, 15, 20, 30} mins.
4 reducers with runtime {10 , 12, 15, 18} mins.
向yarn申請的容器大小為:4 GB
那么,
所有mapper使用的資源: 4 * (( 12 + 15 + 20 + 30 ) / 60 ) GB Hours = 5.133 GB Hours
所有reducer使用的資源: 4 * (( 10 + 12 + 15 + 18 ) / 60 ) GB Hours = 3.666 GB Hours
Job使用的總資源= 5.133 + 3.6666 = 8.799 GB Hours
2.Wasted Resources
資源浪費就是指資源浪費的數(shù)量奶镶,我們通過GB
hours或者百分比方式展示job浪費資源的數(shù)量。
計算方式
為了計算資源的浪費情況骑脱,我們需要先計算下面的指標:
1)Map和reduce任務中浪費的最小的內(nèi)存大小
2)Map和reduce任務的運行時間
任務浪費的最小的內(nèi)存大小= 申請的yarn容器的大小- 所有的任務中最大使用的內(nèi)存大小
任務浪費的資源= 任務浪費的最小內(nèi)存大小* 任務運行的時間,
job總的資源浪費 = 所有的任務浪費的資源總和
對于每一個任務我們定義如下:
peak_memory_used := task使用的內(nèi)存上界
runtime := task運行時長
通過所有task中的最大使用的物理內(nèi)存(max_physical_memory)和虛擬內(nèi)存(virtual_memory)可以計算出任意task的peak_memory_used苍糠,又由于每個任務的上界通過max_physical_memory來確定叁丧,因此我們可以說每個任務的peak_memory_used可以通過下面的公式計算出來:
peak_memory_used = Max(max_physical_memory, virtual_memory/2.1)
其中2.1是集群的內(nèi)存因子(該參數(shù)yarn.nodemanager.vmem-pmem-ratio對應的值)
每個task的最小內(nèi)存浪費可以通過下面的公式計算:
wasted_memory = container_size - peak_memory_used
每個任務的最小資源浪費可以通過下面的公式計算:
wasted_resource = wasted_memory * runtime
總的資源的浪費情況就等于所有任務的wasted_resource的總和
3.Runtime
運行時間指標展示作業(yè)總的運行時間。
計算方式
Job的運行時間是通過job的完成時間減去job提交到y(tǒng)arn的資源管理器的時間計算出來的岳瞭。
例如:
Job的開始時間是:1461837302868 ms
Job的完成時間是:1461840952182 ms
Job的運行時間是:1461840952182 - 1461837302868= 3649314 ms or 1.01 hours
4.Wait time
Job的等待時間是指job運行中花費在等待狀態(tài)總的時間拥娄。
計算方式
對于每一個job我們定義如下的名詞:
ideal_start_time := 所有任務都應該完成啟動的理想的時間
finish_time := 任務完成時間
task_runtime := 任務運行時間
- Map tasks
對于map任務,我們定義如下:
ideal_start_time := job的開始時間
我們找出所有map任務中最長運行時間(task_runtime_max)和最后的完成時間( finish_time_last ),那么job中mapper的總的等待時間就可以通過如下的公式計算出來:
mapper_wait_time = finish_time_last - (ideal_start_time + task_runtime_max)
- Reduce tasks
對于reducer任務寝优,我們定義如下:
ideal_start_time := 通過獲取的reducer慢開始的百分比(mapreduce.job.reduce.slowstart.completedmaps:這個參數(shù)的含義是条舔,當Map Task完成的比例達到該值后才會為Reduce Task申請資源,默認是0.05)并找到map任務完成之后最先開始的那個reducer乏矾,就可以計算出該參數(shù)
我們找到reducer任務最大運行時間( task_runtime_max)和最后完成的時間( finish_time_last )
那么job的reducer任務的總等待時間就可以使用如下公式計算出來:
reducer_wait_time =finish_time_last - (ideal_start_time + task_runtime_max)
total_wait_time = mapper_wait_time + reducer_wait_time
例如:
如上圖:
對于map任務:
ideal_start_time = t1
task_runtime_max = Map_1對應的運行時間
finish_time_last = t4
mapper_wait_time = t4 – Map_1對應的運行時間– t1
對于reduce任務:
ideal_start_time = t2
task_runtime_max = Reduce_3對應的運行時間
finish_time_last = t6
reducer_wait_time = t6 -
Reduce_3對應的運行時間- t2
總的等待時間:
total_wait_time =mapper_wait_time + reducer_wait_time
MapReduce算法分析
1.Mapper數(shù)據(jù)傾斜
數(shù)據(jù)進入到Mapper作業(yè)中后孟抗,有可能會發(fā)生數(shù)據(jù)的傾斜,這種數(shù)據(jù)傾斜主要是考慮到HDFS文件大小差別太大導致的钻心。
1)判斷依據(jù)
根據(jù)每個map task運行的時間和數(shù)據(jù)量兩個指標進行判定凄硼。
2)原理
Mapper數(shù)據(jù)傾斜啟發(fā)式算法(mapper
data skew heuristic)會將所有的Mapper分成兩部分,其中一部分的所有作業(yè)(task)的平均數(shù)據(jù)量會大于另一部分的平均數(shù)據(jù)量捷沸,之后根據(jù)這兩個組的平均數(shù)據(jù)量的差值的絕對值/這兩組數(shù)據(jù)中平均數(shù)據(jù)量的最小值來判斷數(shù)據(jù)傾斜程度摊沉。時間方面的傾斜程度算法一樣。
此圖中的A和B兩組的平均數(shù)據(jù)量和平均運行時間都差不多痒给,沒有發(fā)生數(shù)據(jù)傾斜
此圖中A和B兩組的平均運行時間差不多说墨,但是平均數(shù)據(jù)量差別很大,最終導致嚴重程度為Critical苍柏,這說明該作業(yè)讀取的hdfs中的數(shù)據(jù)文件大小差別太大尼斧,1)可能是有很多小文件, 2)也可能是文件大小超過block大小的10%以上一點试吁,導致超出的部分又占用了一個block
3)計算步驟
(1)遞歸的計算作業(yè)輸入數(shù)據(jù)量的平均值棺棵,然后根據(jù)作業(yè)的輸入量平均值將所有的作業(yè)分成兩組Group_A 和Group_B。
(2)計算各組的平均值熄捍,并求出數(shù)據(jù)量小的組的平均值(minAvg)和兩組平均值之差的絕對值(diffAvgAbs)
(3)求出誤差( diffAvgAbs/ minAvg )烛恤,根據(jù)誤差和給定的誤差級別(比如:{2, 4, 8, 16})計算嚴重程度severity
(4)計算出數(shù)據(jù)量小的那組的的task數(shù)量,并根據(jù)配置的task數(shù)量級別(比如:{10, 50, 100, 200})計算出task數(shù)量的嚴重程度taskSeverity
(5)取數(shù)據(jù)量大的那組的平均數(shù)據(jù)量余耽,并根據(jù)配置的文件大小級別(比如:{1d / 8, 1d / 4, 1d / 2, 1d}其中的每個值需要乘以block的大懈堪亍)計算出task數(shù)據(jù)量的嚴重程度fileSeverity
(6)求出上面計算出來的嚴重程度的最小值作為map 數(shù)據(jù)傾斜程度的結(jié)果。
2.Mapper GC
Mapper GC會分析任務的GC效率宾添。它會計算出所有mapper的平均GC時間占平均CPU時間的比例船惨。避免打擾用戶柜裸,該算法在代碼中設置了很寬松的范圍(觀察線上跑的結(jié)果發(fā)現(xiàn)確實沒有GC報警的情況),但是如果分析的結(jié)果仍然報警的話粱锐,說明你的代碼確實需要優(yōu)化了疙挺。
1)判斷依據(jù)
平均GC時間占平均CPU時間的比例,比例越高怜浅,嚴重程度越大铐然,通常來說代碼需要優(yōu)化。
2)原理
計算出所有作業(yè)的平均的CPU使用時間恶座、平均運行時間以及平均GC的時間搀暑。我們要計算Mapper GC嚴重度的最小值,這個值可以通過平均運行時間和平均垃圾回收時間占平均CPU總消耗時間的比例來計算跨琳。
3)計算步驟
(1)計算出平均CPU使用時間(avgCPU)自点、平均運行時間(avgRuntime)、平均GC時間(avgGC)脉让。
(2)計算出平均GC時間占平均CPU時間的比例(gcRatio)
(3)使用gcRatio和誤差級別(比如:{0.01d, 0.02d, 0.03d, 0.04d})計算嚴重程度gcSeverity
(4)使用平均運行時間和運行時間的級別(比如:{5, 10, 12, 15} 單位:分鐘數(shù))計算運行時間的嚴重程度runtimeSeverity
(5)取上面兩個嚴重程度的最小值作為gc的嚴重程度桂敛。
3.Mapper的內(nèi)存消耗
分析每個Mapper實際內(nèi)存的消耗,并檢查作業(yè)消耗的內(nèi)存比例以及向yarn申請的容器的總內(nèi)存溅潜,該指標用于分析用戶申請的容器內(nèi)存是否合理术唬,比如:你申請了10G的yarn容器的內(nèi)存,但是實際消耗內(nèi)存卻只有1G滚澜,說明你的任務浪費了很多內(nèi)存資源粗仓,此時就會顯示嚴重級別為critical,說明你需要減少每個mapper向yarn容器申請的內(nèi)存資源的大小设捐。
1)判斷依據(jù)
task任務平均使用內(nèi)存占向yarn容器所申請的內(nèi)存的比例借浊。比例越低說明內(nèi)存資源浪費程度越高,需要優(yōu)化萝招,反之則說明資源利用率越高越好巴碗。
2)原理
計算平均內(nèi)存消耗占用向yarn資源容器申請的內(nèi)存大小比率,使用該比率結(jié)合設置的內(nèi)存利用率級別判斷mapper對內(nèi)存的消耗是否合理即寒。
此圖對內(nèi)存的消耗就不合理,因為申請的內(nèi)存高達24G召噩,但是實際使用的內(nèi)存最大卻只有6G左右母赵,平均內(nèi)存使用才3.7G左右,嚴重浪費內(nèi)存資源具滴。
3)計算步驟
(1)計算所有task的平均物理內(nèi)存消耗(avgPhysicalMemory)凹嘲、平均虛擬內(nèi)存消耗(avgVirtualMemory)、平均運行時間(avgRuntime)构韵,并從該應用的配置文件中獲取向yarn容器申請的內(nèi)存大兄懿洹(containerMemory)
(2)計算平均物理內(nèi)存消耗(avgPhysicalMemory)和向yarn容器申請的內(nèi)存大星魉摇(containerMemory)的比值(ratio)。
(3)使用上面的比值(ratio)結(jié)合內(nèi)存利用率級別(比如:{0.6d, 0.5d, 0.4d, 0.3d})凶朗,計算出嚴重程度severity瓷胧。
(4)再使用向yarn容器申請的內(nèi)存大小(containerMemory)與容器級別(比如:{1.1d,
1.5d, 2.0d, 2.5d} 中的每一個值需要乘以yarn的配置文件中配置的默認的容器大信锓摺)計算出申請的容器的嚴重程度containerSeverity
(5)計算出上面兩個嚴重級別的最小值作為內(nèi)存消耗的嚴重級別
4.Mapper的運行速度
分析Mapper代碼的運行效率搓萧。通過這些分析可以知道m(xù)apper屬于CPU消耗型的,或者是mapper處理的數(shù)據(jù)量過大宛畦。通過這個能夠分析出mapper運行速度快慢和處理的數(shù)據(jù)量大小之間的關(guān)系瘸洛。
1)判斷依據(jù)
???????? 所有task的運行速度的中值作為判斷mapper運行速度的依據(jù),而運行速度是通過每個task的輸入數(shù)據(jù)/運行時長得到的次和。
2)原理
???????? 通過計算每個task的運行速度的中值反肋,結(jié)合配置的磁盤的讀取速度,判斷出mapper任務的執(zhí)行速度踏施,但是需要排除運行時間過短導致的錯誤的結(jié)果石蔗。
此任務運行速度就太慢了,也可以推斷出該任務是CPU消耗型任務读规。
3)計算步驟
(1)計算出運行速度的中值(medianSpeed)抓督、運行時間的中值(medianRuntime)、輸入數(shù)據(jù)量的中值(medianDataSize)
(2)使用運行速度中值(medianSpeed)結(jié)合運行速度的級別(比如:{1d / 2, 1d / 4, 1d / 8, 1d / 32} 每個值需要乘以磁盤的讀取速度束亏,默認100M/s)計算出嚴重級別speedSeverity铃在。
(3)再使用運行時間的中值(medianRuntime)結(jié)合運行時間級別(比如:{5, 10, 15, 30})計算出運行時間的嚴重程度runtimeSeverity
(4)取speedSeverity和runtimeSeverity兩個嚴重級別的較小者作為運行速度的嚴重級別。
5.Mapper溢出
該算法從磁盤IO的角度去評測mapper的性能碍遍。mapper溢出比例(溢出的記錄數(shù)/總輸出的記錄數(shù))是衡量mapper性能的一個重要指標:如果這個值接近2定铜,表示幾乎每個記錄都溢出了,并臨時寫到磁盤兩次(其中一次發(fā)生在內(nèi)存排序緩存溢出時怕敬,另一次發(fā)生在歸并排序所有溢出的切換時)揣炕。當這些發(fā)生時表明mapper輸入輸出的數(shù)據(jù)量過大了。
1)判斷依據(jù)
總的溢出記錄數(shù)和總的輸出記錄數(shù)的比值东跪。
2)原理
計算出所有task的溢出記錄數(shù)和所有task的輸出記錄數(shù)的比值畸陡,使用該比值進行mapper溢出嚴重程度的判斷,該比值越大說明輸入輸出的數(shù)據(jù)量過大虽填,需要進行優(yōu)化以提高運行速度丁恭。
3)計算步驟
(1)計算出所有task的總的溢出記錄數(shù)(totalSpillRecords)、總的輸出記錄數(shù)(totalOutputRecords)斋日,并計算出其比值(ratioSpill)
(2)使用上面計算的比值結(jié)合配置的溢出級別(比如:{2.01d, 2.2d, 2.5d, 3.0d})計算出溢出的嚴重程度spillSeverity牲览。
(3)根據(jù)task的數(shù)量計算出任務數(shù)的嚴重程度taskNumberSeverity
(4)取上面兩個小的嚴重程度作為溢出嚴重程度。
6.Mapper運行時間
這部分分析mappers的數(shù)量是否合適恶守。通過分析結(jié)果第献,我們可以更好的優(yōu)化任務中mapper的數(shù)量這個參數(shù)的設置贡必。有以下兩種情況發(fā)生時,這個參數(shù)的優(yōu)化就顯得很迫切了:
1)Mapper的運行時間很短庸毫,可能的原因如下:
mapper的數(shù)量過多
mapper的平均運行時間很短
文件尺寸太小
2)Mapper的運行時間很長仔拟,可能的原因包括:
mapper的數(shù)量很少
mapper的平均運行時間很長
文件的大小過大(個別文件是GB級別)
1)判斷依據(jù)
???????? 根據(jù)所有task運行的平均時長進行嚴重程度的判斷
2)原理
???????? 首先計算出所有task的平均運行時間,之后根據(jù)該平均運行時間計算出最短和最長的任務運行時長嚴重級別岔绸,取兩個嚴重級別中較大的作為運行時長的嚴重級別理逊。
3)計算步驟
(1)計算出所有task的平均輸入大小(avgInputSize)盒揉、平均運行時長(avgRuntime)(2)根據(jù)平均運行時長(avgRuntime)結(jié)合短運行時長級別(比如:{10, 4, 2, 1} 其中的每個值代表的是分鐘數(shù))計算出短運行時長的嚴重級別shortSeverity
(3)根據(jù)任務數(shù)結(jié)合任務數(shù)的級別(比如:{50, 101, 500, 1000})計算出任務數(shù)的嚴重程度taskNumberSeverity
(4)取上面shortSeverity和taskNumberSeverity的較小值作為短運行時長的嚴重級別realShortSeverity
(5)根據(jù)平均運行時長(avgRuntime)結(jié)合長運行時長級別(比如:{15, 30, 60, 120} 其中的每個值代表的是分鐘數(shù))計算出長運行時長的嚴重級別longSeverity
(6)取realShortSeverity和longSeverity總的較大則作為運行時長的嚴重級別
7.Reducer數(shù)據(jù)傾斜
分析進入到每個Reduce中的數(shù)據(jù)是否有傾斜晋被。該分析能夠發(fā)現(xiàn)Reducer中是否存在這種情況,將Reduce分為兩部分刚盈,其中一部分的輸入數(shù)據(jù)量明顯大于另一部分的輸入數(shù)據(jù)量羡洛。
1)判斷依據(jù)
根據(jù)每個reduce task運行的時間和數(shù)據(jù)量兩個指標進行判定。
2)原理
Mapper數(shù)據(jù)傾斜啟發(fā)式算法(reducer
data skew heuristic)會將所有的Reducer分成兩部分藕漱,其中一部分的所有作業(yè)(task)的平均數(shù)據(jù)量會大于另一部分的平均數(shù)據(jù)量欲侮,之后根據(jù)這兩個組的平均數(shù)據(jù)量的差值/這兩組數(shù)據(jù)中平均數(shù)據(jù)量的最小值來判斷數(shù)據(jù)傾斜程度。時間方面的傾斜程度算法一樣肋联。
3)計算步驟
(1)遞歸的計算作業(yè)輸入數(shù)據(jù)量的平均值威蕉,然后根據(jù)作業(yè)的輸入量平均值將所有的作業(yè)分成兩組Group_A 和Group_B。
(2)計算各組的平均值橄仍,并求出數(shù)據(jù)量小的組的平均值(minAvg)和兩組平均值之差的絕對值(diffAvgAbs)
(3)求出誤差( diffAvgAbs/ minAvg )韧涨,根據(jù)誤差和給定的誤差級別(比如:{2, 4, 8, 16})計算嚴重程度severity
(4)計算出數(shù)據(jù)量小的那組的的task數(shù)量,并根據(jù)配置的task數(shù)量級別(比如:{10, 50, 100, 200})計算出task數(shù)量的嚴重程度taskSeverity
(5)取數(shù)據(jù)量大的那組的平均數(shù)據(jù)量侮繁,并根據(jù)配置的文件大小級別(比如:{1d / 8, 1d / 4, 1d / 2, 1d}其中的每個值需要乘以block的大新侵唷)計算出task數(shù)據(jù)量的嚴重程度fileSeverity
(6)求出上面計算出來的嚴重程度的最小值作為map 數(shù)據(jù)傾斜程度的結(jié)果。
8.Reducer GC
Reduce GC用于分析任務的GC效率宪哩,能夠計算并告訴我們GC時間占所用CPU時間的比例娩贷。該算法在代碼中設置了很寬松的范圍,避免打擾用戶锁孟,但是如果分析的結(jié)果任然報警的話彬祖,說明你的代碼確實需要優(yōu)化了。
1)判斷依據(jù)
平均GC時間占平均CPU時間的比例品抽,比例越高涧至,嚴重程度越大,通常來說代碼需要優(yōu)化桑包。
2)原理
首先,會計算出所有任務的平均CPU消耗時間纺非、平均運行時間以及平均垃圾回收所消耗的時間哑了。然后赘方,算法會根據(jù)平均運行時間以及垃圾回收時間占平均CPU時間的比值來計算出最低的嚴重度。
3)計算步驟
(1)計算出平均CPU使用時間(avgCPU)弱左、平均運行時間(avgRuntime)窄陡、平均GC時間(avgGC)。
(2)計算出平均GC時間占平均CPU時間的比例(gcRatio)
(3)使用gcRatio和誤差級別(比如:{0.01d, 0.02d, 0.03d, 0.04d})計算嚴重程度gcSeverity
(4)使用平均運行時間和運行時間的級別(比如:{5, 10, 12, 15} 單位:分鐘數(shù))計算運行時間的嚴重程度runtimeSeverity
(5)取上面兩個嚴重程度的最小值作為gc的嚴重程度拆火。
9.Reducer內(nèi)存消耗
分析每個Reducer實際內(nèi)存的消耗跳夭,并檢查作業(yè)消耗的內(nèi)存比例以及向yarn申請的容器的總內(nèi)存,該指標用于分析用戶申請的容器內(nèi)存是否合理们镜,比如:你申請了10G的yarn容器的內(nèi)存币叹,但是實際消耗內(nèi)存卻只有1G,說明你的任務浪費了很多內(nèi)存資源模狭,此時就會顯示嚴重級別為critical颈抚,說明你需要減少每個Reducer向yarn容器申請的內(nèi)存資源的大小。
1)判斷依據(jù)
task任務平均使用內(nèi)存占向yarn容器所申請的內(nèi)存的比例嚼鹉。比例越低說明內(nèi)存資源浪費程度越高贩汉,需要優(yōu)化,反之則說明資源利用率越高越好锚赤。
2)原理
計算平均內(nèi)存消耗占用向yarn資源容器申請的內(nèi)存大小比率匹舞,使用該比率結(jié)合設置的內(nèi)存利用率級別判斷reducer對內(nèi)存的消耗是否合理。
此圖對內(nèi)存的消耗就不合理线脚,因為申請的內(nèi)存高達24G赐稽,但是實際使用的內(nèi)存最大卻只有6G左右,平均內(nèi)存使用才3.7G左右酒贬,嚴重浪費內(nèi)存資源又憨。
3)計算步驟
(1)計算所有task的平均物理內(nèi)存消耗(avgPhysicalMemory)、平均虛擬內(nèi)存消耗(avgVirtualMemory)锭吨、平均運行時間(avgRuntime)蠢莺,并從該應用的配置文件中獲取向yarn容器申請的內(nèi)存大小(containerMemory)零如。
(2)計算平均物理內(nèi)存消耗(avgPhysicalMemory)和向yarn容器申請的內(nèi)存大絮锝(containerMemory)的比值(ratio)。
(3)使用上面的比值(ratio)結(jié)合內(nèi)存利用率級別(比如:{0.6d, 0.5d, 0.4d, 0.3d})考蕾,計算出嚴重程度severity祸憋。
(4)再使用向yarn容器申請的內(nèi)存大小(containerMemory)與容器級別(比如:{1.1d,
1.5d, 2.0d, 2.5d} 中的每一個值需要乘以yarn的配置文件中配置的默認的容器大行の浴)計算出申請的容器的嚴重程度containerSeverity 蚯窥。
(5)計算出上面兩個嚴重級別的最小值作為內(nèi)存消耗的嚴重級別。
10.Reducer時間
這部分分析Reducer的執(zhí)行效率,可以幫助我們更好的配置任務中reducer的數(shù)量拦赠;當出現(xiàn)以下兩種情況時巍沙,說明Reducer的數(shù)量需要進行調(diào)優(yōu):
1)Reducer過多,hadoop任務可能的表現(xiàn)是:
Reducer數(shù)量過多
Reducer的運行時間很短
2)Reducer過少荷鼠,hadoop任務可能的表現(xiàn)是:
Reducer數(shù)量過少
Reducer運行時間很長
1)判斷依據(jù)
???????? 根據(jù)所有task運行的平均時長進行嚴重程度的判斷
2)原理
???????? 首先計算出所有task的平均運行時間句携,之后根據(jù)該平均運行時間計算出最短和最長的任務運行時長嚴重級別,取兩個嚴重級別中較大的作為運行時長的嚴重級別允乐。
任務數(shù)多矮嫉,運行時長過短,屬于嚴重級別的
運行時長計算:屬于嚴重級別的
任務數(shù)方面計算:屬于None級別的
取上面兩個級別的較小者None級別作為最終的嚴重級別牍疏。
3)計算步驟
(1)計算出所有task的最大運行時長(minRuntime)蠢笋、最小運行時長(maxRuntime)、平均運行時長(avgRuntime)(2)根據(jù)平均運行時長(avgRuntime)結(jié)合短運行時長級別(比如:{10, 4, 2, 1} 單位:分鐘)計算出短運行時長的嚴重級別shortSeverity
(3)根據(jù)任務數(shù)結(jié)合任務數(shù)的級別(比如:{50, 101, 500, 1000})計算出任務數(shù)的嚴重程度taskNumberSeverity
(4)取上面shortSeverity和taskNumberSeverity的較小值作為短運行時長的嚴重級別realShortSeverity
(5)根據(jù)平均運行時長(avgRuntime)結(jié)合長運行時長級別(比如:{15, 30, 60, 120}單位:分鐘數(shù))計算出長運行時長的嚴重級別longSeverity
(6)取realShortSeverity和longSeverity總的較大則作為運行時長的嚴重級別
11.洗牌和排序
分析reducer消耗的總時間以及reducer在進行洗牌和排序時消耗的時間麸澜,通過這些分析挺尿,可以判斷reducer的執(zhí)行效率。
1)判斷依據(jù)
???????? 所有task的平均shuffle時長和平均sort時長進行判斷的炊邦,取兩者中較大的作為洗牌和排序的嚴重級別
2)原理
???????? 首先計算出所有的task的平均shuffle時長和平均sort時長编矾,之后再分別與平均執(zhí)行時長(totalTime - shuffleTime - sortTime)進行相除,計算出shuffle和sort的嚴重級別馁害,取兩者中較大的作為洗牌和排序的嚴重級別窄俏。
其中后面的X代表倍數(shù)的意思,計算方式是:avgShuffleTime / avgCodeTime 和avgSortTime /
avgCodeTime碘菜。
此圖顯示shuffle的時間很長凹蜈,但是sort的時間很短,說明你需要調(diào)整slowstart參數(shù)"mapreduce.job.reduce.slowstart.completedmaps"從0.90 調(diào)大一些忍啸,要小于1.0仰坦。但是需要注意的是,調(diào)整此參數(shù)可以降低shuffle的時間计雌,但是可能會增加整個job的運行時間悄晃。?
3)計算步驟
(1)計算出所有task的平均執(zhí)行時長(avgExecuteTime)、平均shuffle時長(avgShuffleTime)凿滤、平均sort時長(avgSortTime)
(2)將平均shuffle時長結(jié)合運行時長的級別(比如:{1, 5, 10, 30} 單位:分鐘數(shù))計算出shuffle的嚴重級別shuffleSeverity
(3)計算shuffleRatio?= avgShuffleTime* 2 / avgExecuteTime妈橄,之后使用shuffleRatio結(jié)合運行比率級別(比如:{1, 2, 4, 8})計算出shuffle運行比率級別shuffleRatioSeverity
(4)取shuffleSeverity 和shuffleRatioSeverity的較小者作為真正的shuffle嚴重級別realShuffleSeverity
(5)將平均sort時長(avgSortTime)結(jié)合運行時長的級別(比如:{1, 5, 10, 30}單位:分鐘數(shù))計算出sort的嚴重級別sortSeverity
(6)計算sortRatio?= avgSortTime * 2 /avgExecuteTime,之后使用sortRatio結(jié)合運行比率級別(比如:{1, 2, 4, 8})計算出sort運行比率級別sortRatioSeverity
(7)取sortSeverity和sortRatioSeverity的最小值作為真正的shuffle嚴重級別realSortSeverity
(8)取realShuffleSeverity和realSortSeverity中較大者作為洗牌和排序的嚴重級別
參考文獻:
1. CSDN一位大牛寫的文章:
https://zhuanlan.zhihu.com/p/20855271?refer=dr-elephant
2. Dr-elephant官方文檔:
https://github.com/linkedin/dr-elephant/wiki/Metrics-and-Heuristics