1. 控制hive任務中的map數和reduce數
map數量
1.多少map數量合適:什麼需要減少map數?遵循兩個原則: 使大資料量利用合適的map數;使單個map任務處理合適的資料量;
2.主要決定因素:
hdfs block-- input的檔案總個數,input的檔案大小,集群設定的檔案塊大小(預設128m)
inputformat在預設情況下會根據hadoop集群的dfs塊大小進行分 片,每乙個分片會由乙個map任務來進行處理,當然使用者還是可以通過引數mapred.min.split.size引數在作業提交客戶端進行自定義設 置
當有很多小檔案的時候, 每個小檔案也會被當做乙個塊,用乙個map任務來完。怎樣減少map數?乙個map任務啟動和初始化的時間遠遠大於邏輯處理的時間,就會造成很大的資源浪費。
這個時候就需要合併小檔案:(注:這個引數也可以用來增加map的數量)什麼時候需要增加map數量?set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set hive.input.format=org.apache.hadoop.hive.ql.io.combinehiveinputformat;
前面三個引數確定合併檔案塊的大小,大於檔案塊大小128m的,按照128m來分隔,小於128m,大於100m的,按照100m來分隔,把那些小於100m的(包括小檔案和分隔大檔案剩下的),
進行合併。
set hive.input.format=org.apache.hadoop.hive.ql.io.combinehiveinputformat; 這個引數表示執行前進行小檔案合併
當乙個127m的檔案 ,正常會用乙個map去完成,但這個檔案只有乙個或者兩個小字段,卻有幾千萬的記錄,如果map處理的邏輯比較複雜,用乙個map任務去做,肯定也比較耗時。怎樣增加map數?因此還和 每一條資料的大小有關。(我們每次可以預估一下資料大小來預估 )
1.
set mapred.reduce.tasks=10;
select
*from a
distribute by rand(23)
;
[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-oun75cas-1615966867826)(…//hive/distribute_by.png)]
我們可以看出他是通過增加reduce 輸出多份檔案作為多個檔案作為下乙個job的輸入reduce數量2.set mapred.map.tasks=10
這個引數設定的map數量僅僅是乙個提示,只有當inputformat 決定了map任務的個數比mapred.map.tasks值小時才起作用
原則: 使大資料量利用合適的reduce數;使單個reduce任務處理合適的資料量;如何設定reduce的個數?hive自己如何確定reduce數:
當不設定reduce個數的情況下,hive會猜測確定乙個reduce個數,基於以下:
hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的資料量,預設為1000^3=1g)
hive.exec.reducers.max(每個任務最大的reduce數,預設為999)
即,如果reduce的輸入(map的輸出)總大小不超過1g,那麼只會有乙個reduce任務;
有多少個reduce 就會生成多少個檔案
第一種方式: 上面說reduce個數的決定是每個 reduce 處理的資料量, 因此可以通過設定什麼時候設定reduce個數不會生效?set hive.exec.reducers.bytes.per.reducer=500000000; (500m)
第二種方式:
set mapred.reduce.tasks = 15;
1.資料量小於hive.exec.reducers.bytes.per.reducer引數值2.沒有group by的彙總。 例如: select count(1) from aa
3.用了order by。 全域性排序 只能在 乙個reduce中進行
4.有笛卡爾積
Hive中開啟Map端和Reduce端的壓縮
1 開啟hive中間傳輸資料壓縮功能 set hive.exec.compress.intermediate true 2 開啟mapreduce中map的壓縮功能 set mapreduce.map.output.compress true 3 設定mapreduce中map輸出資料的壓縮方式 s...
Hive 設定map 和 reduce 的個數
一 控制hive任務中的map數 1.通常情況下,作業會通過input的目錄產生乙個或者多個map任務。主要的決定因素有 input的檔案總個數,input的檔案大小,集群設定的檔案塊大小 目前為128m,可在hive中通過set dfs.block.size 命令檢視到,該引數不能自定義修改 2....
Hive 設定map 和 reduce 的個數
一 控制hive任務中的map數 1.通常情況下,作業會通過input的目錄產生乙個或者多個map任務。主要的決定因素有 input的檔案總個數,input的檔案大小,集群設定的檔案塊大小 目前為128m,可在hive中通過set dfs.block.size 命令檢視到,該引數不能自定義修改 2....