Hive優化--關鍵參數及HQL案例

 

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完成指標彙總的所有功能)。

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