廣告作業單行1000萬數據量處理超時分析

以下是分析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);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章