您好,登錄后才能下訂單哦!
set hive.fetch.task.conversion=more(默認)
1
Fetch 抓取是指,Hive 中對某些情況的查詢可以不必使用 MapReduce 計算。
該屬性設置為 more 以后,在全局查找、字段查找、limit 查找等都不走 MapReduce。 設置為none后所有類型的查找語句都要走MapReduce;
set hive.exec.mode.local.auto=true(開啟本地模式)
1
Hive 可以通過本地模式在單臺機器上 處理所有的任務。對于小數據集,執行時間可以明顯被縮短
1.開啟本地模式后需要設置local mr的最大輸入數據量,當數據量小于這個值時采用local mr的方式
set hive.exec.mode.local.auto.inputbytes.max=134217728(默認)
1
2.開啟本地模式后需要設置local mr的最大輸入文件個數,當數據量小于這個值時采用local mr的方式
set hive.exec.mode.local.auto.input.files.max=4(默認)
1
注: 新版的 hive 已經對小表 JOIN 大表和大表 JOIN 小表進行了優化。小表放在左邊和右邊已經沒有明顯區別
當一個表內有許多空值時會導致MapReduce過程中,空成為一個key值,對應的會有大量的value值, 而一個key的value會一起到達reduce造成內存不足;所以要想辦法過濾這些空值.
1.通過查詢所有不為空的結果
insert overwrite table jointable select n.* from
(select * from nullidtable where id is not null ) n left join ori o on n.id = o.id;
12
2.查詢出空值并給其賦上隨機數,避免了key值為空
insert overwrite table jointable
select n.* from nullidtable n full join ori o on
case when n.id is null then concat('hive', rand()) else n.id end = o.id;
123
注:此方法可以解決數據傾斜的問題
如果不指定 MapJoin 或者不符合 MapJoin 的條件,那么 Hive 解析器會將 Join 操作轉換成 Common Join,即:在 Reduce 階段完成 join。容易發生數據傾斜。可以用 MapJoin 把小 表全部加載到內存在 map 端進行 join,避免 reducer 處理。
設置MapJoin
set hive.auto.convert.join = true(默認)
1
大表小表的閥門值設置(默認25M以下認為是小表):
set hive.mapjoin.smalltable.filesize=25000000;
1
默認情況下,Map 階段同一 Key 數據分發給一個 reduce,當一個 key 數據過大時就傾斜了并不是所有聚合都在reduce端完成,很多聚合操作都可以現在Map端進行部分聚合,最后在Reduce段得到結果
開啟Map端聚合參數設置
是否在Map段進行聚合,默認為true
hive.map.aggr = true
1
在Map端進行聚合操作的條目數
hive.groupby.mapaggr.checkinterval = 100000
1
有數據傾斜的時候進行負載均衡(默認是false)
hive.groupby.skewindata = true
1
注: 當選項設定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分布到 Reduce 中(這個過程可以 保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。
Count Distinct是使用了一個mapreduce ,當數據較少時無影響當數據較大時 只使用一個MapReduce將很難完成job。這是需要用到分組 Group BY 會使用2個MapReduce完成因為設置了 set mapreduce.job.reduces = 5; 所以第一個MapReduce的過程是通過一個map和5個reduce來完成這樣減輕了reduce的負載, 雖然會多用一個 Job 來完成,但在數據量大的情況下,這個絕對是值得的。
實例:
1.測試先關聯兩張表,再用 where 條件過濾
hive (default)> select o.id from bigtable bjoin ori o on o.id = b.idwhere o.id <= 10;
1
2.通過子查詢后,再關聯表
hive (default)> select b.id from bigtable b join (select id from ori where id <= 10 ) o on b.id = o.id;
1
關系型數據庫中,對分區表 Insert 數據時候,數據庫自動會根據分區字段的值,將數據插入到相應的分區中,Hive 中也提供了類似的機制,即動態分區(Dynamic Partition),只不過,使用 Hive 的動態分區,需要進行相應的配置。
首先要設置的屬性
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;
123456
模擬動態分區
insert overwrite table ori_partitioned_target partition (p_time)
select id, time, uid, keyword, url_rank, click_num, click_url, p_time from ori_partitioned;
12
設置切片值
set mapreduce.input.fileinputformat.split.maxsize=???
1
在 map 執行前合并小文件,減少 map 數:CombineHiveInputFormat 具有對小文件進行
合并的功能(系統默認的格式)。HiveInputFormat 沒有對小文件合并功能。
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
1
set mapreduce.job.maps =???
1
1.調整reduce的個數方法一
每個Reduce處理的數據默認是256MB
hive.exec.reducers.bytes.per.reducer=256000000
1
每個任務最大的reduce數,默認為1009
hive.exec.reducers.max=1009
1
計算reduce數的公式
N=min(參數2,總輸入數據量/參數1)
1
2.調整reduce個數的方法二
set mapreduce.job.reduces=???
1
3.reduce個數不是越多越好
通過設置參數 hive.exec.parallel 值為 true,就可以開啟并發執行。不過,在共享集群中,需要注意下,如果 job 中并行階段增多,那么集群利用率就會增加。
set hive.exec.parallel=true; //打開任務并行執行
set hive.exec.parallel.thread.number=16; //同一個 sql 允許最大并行度,默認為 8。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。