Hive參數

  1. Map相關參數
set mapred.max.split.size = 256000000 ; //最大分割
set mapred.min.split.size=1 ; //最小分割
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; //Map端輸入、合併文件以後按照block的大小分割(默認)
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat; //Map端輸入,不合並 一個文件起一個Map
set hive.mapjoin.maxsize=1000000; //Map Join 所處理的最大的行數。超過此行數,Map Join進程會異常退出  
set hive.merge.mapfiles = true ;//是否開啓合併 Map 端輸出小文件
set hive.merge.mapredfiles = false ;//是否開啓合併 Map/Reduce 端輸出小文件

  2. Reduce參數配置node

set mapred.reduce.tasks=-1 ; //設置Reduce的個數,-1爲默認,表示由hive自動分配管理

  3. 並行計算參數算法

set hive.exec.parallel=true;  //無關的計算能夠並行調起JOB  
set hive.exec.parallel.thread.number=8 ; //併發提交時的併發線程的個數

  4. group by 相關sql

set hive.groupby.skewindata=false ;//決定 group by 操做是否支持傾斜的數據。注意:只能對單個字段聚合

  5. 自動分區apache

set hive.exec.dynamic.partition = false ; // 是否打開動態分區。 
set hive.exec.dynamic.partition.mode = strict ;//打開動態分區後,動態分區的模式,有 strict 和 nonstrict 兩個值可選,strict 要求至少包含一個靜態分區列,nonstrict 則無此要求。 
set hive.exec.max.dynamic.partitions = 1000; // 所容許的最大的動態分區的個數。 
set hive.exec.max.dynamic.partitions.pernode = 100; //單個 reduce 結點所容許的最大的動態分區的個數。 
set hive.exec.default.partition.name = '__HIVE_DEFAULT_PARTITION__';//默認的動態分區的名稱,當動態分區列爲''或者null時,使用此名稱。''

  6. 笛卡爾積Join併發

set hive.mapred.mode = strict ;//阻止笛卡爾積    
set hive.mapred.mode = nostrict ;//容許笛卡爾積

  7. Map-Side Joinide

set hive.auto.convert.join = true ; //將小表刷入內存中  
set hive.mapjoin.smalltable.filesize = 2500000 ;//刷入內存表的大小(字節)  
Map Join 的計算步驟分兩步,將小表的數據變成hashtable廣播到全部的map 端,將大表的數據進行合理的切分,而後在map 階段的時候用大表的數據一行一行的去探測(probe) 小表的hashtable. 若是join key 相等,就寫入HDFS.
map join 之因此叫作map join 是由於它全部的工做都在map 端進行計算.

hive 在map join 上作了幾個優化:
hive 0.6 的時候默認認爲寫在select 後面的是大表,前面的是小表, 或者使用 /*+mapjoin(map_table) */ 提示進行設定. 
hive 0.7 的時候這個計算是自動化的,它首先會自動判斷哪一個是小表,哪一個是大表,這個參數由(hive.auto.convert.join=true)來控制. 而後控制小表的大小由(hive.smalltable.filesize=25000000L)參數控制(默認是25M),當小表超過這個大小,hive 會默認轉化成common join. 
你能夠查看HIVE-1642.首先小表的Map 階段它會將本身轉化成MapReduce Local Task ,而後從HDFS 取小表的全部數據,將本身轉化成Hashtable file 並壓縮打包放入DistributedCache 裏面.
目前hive 的map join 有幾個限制,一個是它打算用BloomFilter 來實現hashtable , BloomFilter 大概比hashtable 省8-10倍的內存, 可是BloomFilter 的大小比較難控制.
如今DistributedCache 裏面hashtable默認的複製是3份,對於一個有1000個map 的大表來講,這個數字過小,大多數map 操做都等着DistributedCache 複製.

  8. Skew Joinoop

真實數據中數據傾斜是必定的, hadoop 中默認是使用
hive.exec.reducers.bytes.per.reducer = 1000000000

也就是每一個節點的reduce 默認是處理1G大小的數據,若是你的join 操做也產生了數據傾斜,那麼你能夠在hive 中設定
set hive.optimize.skewjoin = true;
set hive.skewjoin.key = skew_key_threshold (default = 100000)

hive 在運行的時候沒有辦法判斷哪一個key 會產生多大的傾斜,因此使用這個參數控制傾斜的閾值,若是超過這個值,新的值會發送給那些尚未達到的reduce, 通常能夠設置成你(處理的總記錄數/reduce個數)的2-4倍均可以接受.  
傾斜是常常會存在的,通常select 的層數超過2層,翻譯成執行計劃多於3個以上的mapreduce job 都很容易產生傾斜,建議每次運行比較複雜的sql 以前均可以設一下這個參數. 若是你不知道設置多少,能夠就按官方默認的1個reduce 只處理1G 的算法,那麼  skew_key_threshold  = 1G/平均行長. 或者默認直接設成250000000 (差很少算平均行長4個字節)
相關文章
相關標籤/搜索