當前位置:編程學習大全網 - 源碼下載 - Hive優化的原則參考

Hive優化的原則參考

需要滿足以下條件:

hive.mapred.mode=true,嚴格模式不允許執行以下查詢:

分區表上沒有指定了分區

沒有limit限制的order by語句

笛卡爾積:JOIN時沒有ON語句

兩個聚集函數不能有不同的DISTINCT列,以下表達式是錯誤的:

SELECT語句中只能有GROUP BY的列或者聚集函數。

第壹個MRJob 中,

Map的輸出結果集合會隨機分布到Reduce中,每個Reduce做部分聚合操作,並輸出結果,這樣處理的結果是相同的GroupBy Key

有可能被分發到不同的Reduce中,從而達到負載均衡的目的;第二個MRJob再根據預處理的數據結果按照GroupBy Key分布到

Reduce中(這個過程可以保證相同的GroupBy Key被分布到同壹個Reduce中),最後完成最終的聚合操作。

FROM test

INSERT OVERWRITE TABLE count1

SELECT count(DISTINCT test.dqcode)

GROUP BY test.zipcode

INSERT OVERWRITE TABLE count2

SELECT count(DISTINCT test.dqcode)

GROUP BY test.sfcode;

ORDER BY colName ASC/DESC

hive.mapred.mode=strict時需要跟limit子句

hive.mapred.mode=nonstrict時使用單個reduce完成排序

SORT BY colName ASC/DESC :每個reduce內排序

DISTRIBUTE BY(子查詢情況下使用 ):控制特定行應該到哪個reducer,並不保證reduce內數據的順序

CLUSTER BY :當SORT BY 、DISTRIBUTE BY使用相同的列時。

增加map數目:

當input的文件都很大,任務邏輯復雜,map執行非常慢的時候,可以考慮增加Map數,來使得每個map處理的數據量減少,從而提高任務的執行效率。

假設有這樣壹個任務:

select data_desc, count(1), count(distinct id),sum(case when …),sum(case when ...),sum(…) from a group by data_desc

如果表a只有壹個文件,大小為120M,但包含幾千萬的記錄,如果用1個map去完成這個任務,肯定是比較耗時的,這種情況下,我們要考慮將這壹個文件合理的拆分成多個,這樣就可以用多個map任務去完成。

set mapred.reduce.tasks=10;

create table a_1 as select * from a distribute by rand(123);

這樣會將a表的記錄,隨機的分散到包含10個文件的a_1表中,再用a_1代替上面sql中的a表,則會用10個map任務去完成。每個map任務處理大於12M(幾百萬記錄)的數據,效率肯定會好很多。

reduce數目設置:

參數1:hive.exec.reducers.bytes.per.reducer=1G:每個reduce任務處理的數據量

參數2:hive.exec.reducers.max=999(0.95 TaskTracker數):每個任務最大的reduce數目

reducer數=min(參數2,總輸入數據量/參數1)

set mapred.reduce.tasks:每個任務默認的reduce數目。典型為0.99 reduce槽數,hive將其設置為-1,自動確定reduce數目。

15.使用索引:

hive.optimize.index.filter:自動使用索引

hive.optimize.index.groupby:使用聚合索引優化GROUP BY操作

  • 上一篇:請問:YY直播這個平臺怎麽樣?
  • 下一篇:重慶旅遊除了特色火鍋,還有哪5個必去景點?
  • copyright 2024編程學習大全網