Hive中map與reduce數量控制

2021-10-25 20:00:52 字數 2416 閱讀 5925

1. 控制hive任務中的map數和reduce數

map數量

1.多少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; 這個引數表示執行前進行小檔案合併

什麼時候需要增加map數量?

當乙個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的輸入

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;

什麼時候設定reduce個數不會生效?

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....