1. 程式人生 > >【Hive】優化策略

【Hive】優化策略

nap set 進行 類型 命令 part ado http 計劃

Hive對於表的操作大部分都是轉換為MR作業的形式,為了提高OLAP[online analysis process 在線分析處理]的效率,Hive自身給出了很多的優化策略

1. explain[解釋執行計劃]

通過explain命令,可以查看Hive語句的操作情況,是否為慢查詢,是否走索引,一目了然

explain select sum(...) from table_name;

2. 動態分區調整

hive.exec.dynamic.partition.mode = strict       // 默認是strict

3. bucket表

4. 索引

5. 文件格式優化

TEXTFILE, SEQUENCEFILE, RCFILE[可切分], ORC[增強的RCFILE], 和 PARQUET

6. 壓縮

SET hive.exec.compress.intermediate=true        // 設置MR中間數據可以進行壓縮,默認是false
SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec   // 設置MR中間數據壓縮算法
SET hive.exec.compress.output=true              // 設置MR輸出數據可以進行壓縮,默認是false
SET mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec   //
設置MR輸出數據壓縮算法,Hadoop的配置

7. 設置本地模式,在當臺機器上處理所有任務

適用於小數據情況
hive.exec.mode.local.auto = true // 默認false
mapreduce.framework.name = local
運行本地模式的job需要滿足的條件
  job的輸入總大小要小於hive.exec.mode.local.auto.inputbytes.max // 默認是134217728
  map任務的數量要小於hive.exec.mode.local.auto.input.files.max // 默認是4


  reduce任務的數量要是1或者是0

8. JVM重用

SET mapreduce.job.jvm.numtasks=5;               // 每個JVM能運行的任務數,默認是1,即為每一個任務開一個JVM,如果設為-1,則沒有限制

9. 並行執行

如果Job之間沒有依賴,可以並行執行

hive.exec.parallel = true                       // 默認是false
SET hive.exec.parallel.thread.number=16         // 默認是8,能夠並行執行的job數

10. 啟動limit調優,避免全表掃描,使用抽樣機制

select * from ... limit 1,2
hive.limit.optimize.enable = true               // 默認是false

11. JOIN

動態mapjoin使用(/*+ streamtable(table_name)*/)
連接查詢表的大小從左到右依次增長
默認是true
SET hive.auto.convert.join=true // 默認是true
SET hive.mapjoin.smalltable.filesize=600000000 // 默認是25000000,mapjoin的閥值,如果小表小於該值,則會將普通join[reduce join]轉為mapjoin

可以參考mapjoin的MR實現

12. 嚴格模式

啟用嚴格模式:hive.mapred.mode = strict // Deprecated
hive.strict.checks.large.query = true
該設置會禁用:1. 不指定分頁的orderby
       2. 對分區表不指定分區進行查詢
       3. 和數據量無關,只是一個查詢模式

hive.strict.checks.type.safety = true
嚴格類型安全,該屬性不允許以下操作:1. bigint和string之間的比較
                  2. bigint和double之間的比較

hive.strict.checks.cartesian.product = true
該屬性不允許笛卡爾積操作

13. 調整Mapper和Reducer的個數

hive.exec.reducers.bytes.per.reducer = 256000000    // 每個reduce任務的字節數,256M
hive.exec.reducers.max = 1009                       // reduce task的最大值,屬性為負數時,會使用該屬性

14. 推測執行[hadoop]

讓多個map/reduce多個實例並發執行

mapreduce.map.speculative = true                    // 默認是true
mapreduce.reduce.speculative = true                 // 默認是true

15. 多個分組優化

hive.multigroupby.singlereducer = true              // 默認是true

若多個groupby使用的是一個公用的字段,則這些groupby可以生成一個MR

16. 虛擬列

hive.exec.rowoffset = true                          // 默認是false

【Hive】優化策略