91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何控制hive任務的reduce數

發布時間:2021-12-10 10:59:40 來源:億速云 閱讀:320 作者:小新 欄目:云計算

這篇文章主要介紹如何控制hive任務的reduce數,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

1. Hive自己如何確定reduce數:
reduce個數的設定極大影響任務執行效率,不指定reduce個數的情況下,Hive會猜測確定一個reduce個數,基于以下兩個設定:
hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的數據量,默認為1000^3=1G)
hive.exec.reducers.max(每個任務最大的reduce數,默認為999)
計算reducer數的公式很簡單N=min(參數2,總輸入數據量/參數1)
即,如果reduce的輸入(map的輸出)總大小不超過1G,那么只會有一個reduce任務;
如:select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;
/group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04 總大小為9G多,因此這句有10個reduce

2. 調整reduce個數方法一:
調整hive.exec.reducers.bytes.per.reducer參數的值;
set hive.exec.reducers.bytes.per.reducer=500000000; (500M)
select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 這次有20個reduce

3. 調整reduce個數方法二;
set mapred.reduce.tasks = 15;
select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt;這次有15個reduce

4. reduce個數并不是越多越好;
同map一樣,啟動和初始化reduce也會消耗時間和資源;
另外,有多少個reduce,就會有多少個輸出文件,如果生成了很多個小文件,那么如果這些小文件作為下一個任務的輸入,則也會出現小文件過多的問題;

5. 什么情況下只有一個reduce;
很多時候你會發現任務中不管數據量多大,不管你有沒有設置調整reduce個數的參數,任務中一直都只有一個reduce任務;
其實只有一個reduce任務的情況,除了數據量小于hive.exec.reducers.bytes.per.reducer參數值的情況外,還有以下原因:
a) 沒有group by的匯總,比如把select pt,count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04' group by pt; 寫成 select count(1) from popt_tbaccountcopy_mes where pt = '2012-07-04';
這點非常常見,希望大家盡量改寫。
b) 用了Order by
c) 有笛卡爾積
通常這些情況下,除了找辦法來變通和避免,我暫時沒有什么好的辦法,因為這些操作都是全局的,所以hadoop不得不用一個reduce去完成;

同樣的,在設置reduce個數的時候也需要考慮這兩個原則:使大數據量利用合適的reduce數;使單個reduce任務處理合適的數據量;

Hive是將符合SQL語法的字符串解析生成可以在Hadoop上執行的MapReduce的工具。

使用Hive盡量按照分布式計算的一些特點來設計sql,和傳統關系型數據庫有區別,

所以需要去掉原有關系型數據庫下開發的一些固有思維。

基本原則:

1:盡量盡早地過濾數據,減少每個階段的數據量,對于分區表要加分區,同時只選擇需要使用到的字段

select ... from A

join B

on A.key = B.key

where A.userid>10

and B.userid<10

and A.dt='20120417'

and B.dt='20120417';

應該改寫為:

select .... from (select .... from A

where dt='201200417'

and userid>10

) a

join ( select .... from B

where dt='201200417'

and userid < 10

) b

on a.key = b.key;

2:盡量原子化操作,盡量避免一個SQL包含復雜邏輯

可以使用中間表來完成復雜的邏輯

drop table if exists tmp_table_1;

create table if not exists tmp_table_1 as

select ......;

drop table if exists tmp_table_2;

create table if not exists tmp_table_2 as

select ......;

drop table if exists result_table;

create table if not exists result_table as

select ......;

drop table if exists tmp_table_1;

drop table if exists tmp_table_2;

3:單個SQL所起的JOB個數盡量控制在5個以下

4:慎重使用mapjoin,一般行數小于2000行,大小小于1M(擴容后可以適當放大)的表才能使用,小表要注意放在join的左邊(目前TCL里面很多都小表放在join的右邊)。

否則會引起磁盤和內存的大量消耗

5:寫SQL要先了解數據本身的特點,如果有join ,group操作的話,要注意是否會有數據傾斜

如果出現數據傾斜,應當做如下處理:

set hive.exec.reducers.max=200;

set mapred.reduce.tasks= 200;---增大Reduce個數

set hive.groupby.mapaggr.checkinterval=100000 ;--這個是group的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體數據量設置

set hive.groupby.skewindata=true; --如果是group by過程出現傾斜 應該設置為true

set hive.skewjoin.key=100000; --這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體數據量設置

set hive.optimize.skewjoin=true;--如果是join 過程出現傾斜 應該設置為true

6:如果union all的部分個數大于2,或者每個union部分數據量大,應該拆成多個insert into 語句,實際測試過程中,執行時間能提升50%

insert overwite table tablename partition (dt= ....)

select ..... from (

select ... from A

union all

select ... from B

union all

select ... from C

) R

where ...;

可以改寫為:

insert into table tablename partition (dt= ....)

select .... from A

WHERE ...;

insert into table tablename partition (dt= ....)

select .... from B

WHERE ...;

insert into table tablename partition (dt= ....)

select .... from C

WHERE ...;

以上是“如何控制hive任務的reduce數”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湟中县| 志丹县| 兴海县| 舞钢市| 大连市| 虞城县| 宜春市| 宁德市| 靖宇县| 左权县| 平定县| 柯坪县| 阳城县| 青海省| 甘孜县| 邹城市| 龙里县| 略阳县| 祁门县| 扶沟县| 郎溪县| 玉田县| 洪洞县| 分宜县| 八宿县| 潼关县| 桦川县| 呼和浩特市| 罗江县| 永和县| 武强县| 景谷| 宣武区| 磴口县| 米脂县| 屯昌县| 石嘴山市| 宣威市| 南部县| 陇川县| 陕西省|