以下是分析ads的單行數據量超過1000萬時,map任務出現600s time out的問題:
1、map函數調用cpu消耗profile
以下是map函數調用cpu消耗profile圖:
以上是用戶代碼函數調用cpu使用總的情況,下圖是上圖中紅圈框出來的更底層函數調用cpu使用情況:
從圖上看出,cpu98%的時間都消耗在getObjectFunction()、getHessian()和getGradient()方法上,進一步分析這三個方法下面的調用情況,這三個方法分別調用第三方math3包下面Gamma類的三個方法,這說明該job比較耗cpu的地方其實都是在調用第三方包的時候。
2、2.4集羣單行數據處理時間統計
單行數據量100萬、300萬、700萬和1000萬分別平均處理時間,以及處理時間柱狀圖:
可以看出,根據數據量的增長,處理時間基本是按線性增長的。
下面重點來看一下單行1000萬數據量處理時間詳細信息,以下是在2.4集羣的gate way分別提交了三次job的情況:
但是在處理part-00027文件時,平均處理時間爲7544s,約2小時5分鐘左右,從上表看出,單行數據量1000萬時,平均處理時間5000s,約1小時20分鐘左右,第一個job處理時間最大花了8696s,約2小時25分鐘左右。
以下看一下處理part-00027文件的map任務內存和cpu使用情況:
(1)、內存使用情況:
根據RM頁面找到對應的NM,在找到對應的container,根據jstat -gcutil命令查看內存使用情況:
可以看出老年代內存使用爲75%,不是因爲內存不足導致頻繁Full GC而出現的問題。
(2)、cpu使用情況:
執行top命令查看cpu使用情況:
由於是單線程處理,cpu使用爲101%,說明該map任務是cpu密集型任務,該任務的瓶頸在計算上。
總結:
既然該job不能從代碼層面進行優化,就只能修改參數了,最好的解決辦法是延長map任務的超時時間爲3小時,既10800000ms,代碼如下:
conf.setInt("mapred.task.timeout", 10800000);