1. 關鍵參數及HQL案例
1.1. 當輸入數據量較大時減小Map處理的最大數據量
已知表midsrc有1.5億條記錄,如下:
分別設置map處理最大數據量爲1024000000、512000000、256000000、128000000觀察以下語句的執行情況。
統計信息如下:
Map處理的最大數據量 |
Mapper數 |
執行時長(秒) |
1024000000 |
5 |
117.098 |
512000000 |
9 |
67.62 |
256000000 |
17 |
52.739 |
128000000 |
33 |
49.971 |
可以看到:隨着map處理最大數據量變小,map數逐漸增大,整體效率提升。在最大數據量從256000000到128000000時,差別已經不大了。
1.2. 當大量重複數據做去重時減少Reduce數量
已知文本表hugest有9.5億條記錄,如下:
使用Hive默認參數執行以下語句查詢不重複的記錄。
共啓動105個mapper,110個reducer,耗時137.394秒。
最終發現僅有三條不重複記錄,由於map端已聚合,可推測reducer只要一個就夠了,會大大減少reduce階段耗時。
設置以下參數後再次執行語句。
共啓動105個mapper,1個reducer,耗時98.524秒,效果明顯。
1.3. 當大量匹配記錄做關聯時增加Reduce數量
已知表dynhuge和dynhuge1有784萬條記錄,使用Hive默認參數執行以下語句關聯兩表並將數據導入表tmp。
共啓動2個mapper,1個reducer,耗時10個小時左右。
觀察發現由於兩表關聯字段seq存在很多相同值,關聯產生巨大的數據,一個reducer處理起來非常慢,按照當前集羣和租戶的能力,最大可啓動56個container,因此考慮設置reducer個數爲50。
設置以下參數後再次執行語句。
共啓動2個mapper,50個reducer,耗時16分鐘,效果明顯。
1.4. 當出現Join傾斜時打開Join傾斜優化開關
表skewtable有392329條記錄,表unskewtable有129927條記錄。
使用Hive默認參數執行以下語句:
啓動一個MR,耗時215.742秒,同時主要耗費在reduce階段。
經統計,發現表skewtable有記錄A的數量131650,表unskewtable有記錄A的數量449,可知兩表關聯將會出現一定的數據傾斜。
設置join傾斜優化開關,再次執行如下:
啓動了兩個MR,總耗時157.494秒,單獨啓動一個MR處理了傾斜數據後,效率提升了。
1.5. 當Join和Group By的字段一致時打開相關性優化開關
表log有305872條記錄,表logcopy有295825條記錄。
使用Hive默認參數執行以下語句:
啓動了兩個MR,總耗時64.59秒
由於join的字段和group by字段均爲key,可以利用相關性優化,減少MR個數從而提高運行速度。
設置以下參數後,再次執行:
只啓動一個MR,總耗時32.678秒。
1.6. 當Join字段和參與Join的子查詢的Group By的字段一致時打開相關性優化開關
表log有305872條記錄,表logcopy有295825條記錄。
使用Hive默認參數執行以下語句:
啓動了三個MR,總耗時98.714秒。
由於子查詢的group by字段和join字段一致,可以利用相關性優化,減少MR個數從而提高運行速度。
設置以下參數後,再次執行:
只啓動一個MR,耗時33.855秒,效果明顯。
1.7. 對Count(Distinct)優化
ORC表orctbl有78914976條記錄,表大小1.6G。
使用Hive默認參數執行以下語句:
由於是全聚合,只啓動一個MR,總耗時295.997秒。
優化後可以將reduce數增大(測試集羣可啓動的container數爲51),執行如下:
啓動了兩個MR,總耗時198.123秒。
1.8. 使用Mutiple Insert優化
表src有500條記錄。
分別執行插入操作,第一個插入操作如下:
第一個插入操作耗時30.536秒。
第二個插入操作如下:
第二個插入操作總耗時26.257秒。
兩個SQL分別啓動兩個MR,共耗時56.793秒。
優化如下:
只啓動一個MR,耗時27.187秒,效果提升明顯。
1.9. 當大量表參與Join時改用MR
如下場景,需要將用戶信息表USER與INDICT_1、INDICT_2、INDICT_3、INDICT_4、INDICT_5等一定數量的指標表進行關聯,目標是彙總用戶的所有指標到一個新的用戶指標表,一方面SQL比較冗長,另一方面由於多次join性能較低。同時後續還需要加入更多同類型的指標表參與連接,屆時還需要修改SQL才能完成相應功能。
瞭解業務需求後,考慮使用直接編寫MR實現,MAP的輸入爲用戶信息表USER及所有指標表的目錄下的文件,MAP輸出爲用戶ID、指標值,REDUCE輸入爲用戶ID、指標值序列,REDUCE輸出爲用戶ID和按順序排列的指標值,落地成結果文件。MR程序能做到指標可配置(可配置文件目錄名與指標名的映射),擴展性好(不斷新增指標只需改配置文件,無須修改代碼/SQL),效率更高(一個MR完成指標彙總的所有功能)。