第九章 Hive企業級調優之動態分割槽調整

2021-09-29 10:41:55 字數 3121 閱讀 4563

關係型資料庫中,對分割槽表insert資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,hive中也提供了類似的機制,即動態分割槽(dynamic partition),只不過,使用hive的動態分割槽,需要進行相應的配置。

1.開啟動態分割槽引數設定

(1)開啟動態分割槽功能(預設true,開啟)

hive.

exec

.dynamic.

partition

=true

(2)設定為非嚴格模式(動態分割槽的模式,預設strict,表示必須指定至少乙個分割槽為靜態分割槽,nonstrict模式表示允許所有的分割槽欄位都可以使用動態分割槽。)

hive.

exec

.dynamic.

partition

.mode

=nonstrict

(3)在所有執行mr的節點上,最大一共可以建立多少個動態分割槽。

hive.

exec

.max.dynamic.partitions=

1000

(4)在每個執行mr的節點上,最大可以建立多少個動態分割槽。該引數需要根據實際的資料來設定。比如:源資料中包含了一年的資料,即day欄位有365個值,那麼該引數就需要設定成大於365,如果使用預設值100,則會報錯。
hive.

exec

.max.dynamic.partitions.pernode=

100

(5)整個mr job中,最大可以建立多少個hdfs檔案。

hive.

exec

.max.created.files=

100000

(6)當有空分割槽生成時,是否丟擲異常。一般不需要設定。

hive.error.

on.empty.

partition

=false

2.案例實操

需求:將ori中的資料按照時間(如:20111230000008),插入到目標表ori_partitioned_target的相應分割槽中。

(1)建立分割槽表

create

table ori_partitioned(id bigint

,time

bigint

, uid string, keyword string,

url_rank int

, click_num int

, click_url string)

partitioned by

(p_time bigint

)row format delimited fields

terminated

by'\t'

;

(2)載入資料到分割槽表中

hive (

default

)>

load

data

local inpath '/home/wyh/ds1'

into

table

ori_partitioned partition

(p_time=

'20111230000010');

hive (

default

)>

load

data

local inpath '/home/wyh/ds2'

into

table ori_partitioned partition

(p_time=

'20111230000011'

);

(3)建立目標分割槽表

create

table ori_partitioned_target(id bigint

,time

bigint

, uid string,

keyword string, url_rank int

, click_num int

, click_url string) partitioned by

(p_time string)

row format delimited fields

terminated

by'\t'

;

(4)設定動態分割槽

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

;hive (

default

)>

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;

(5)檢視目標分割槽表的分割槽情況

hive (

default

)>

show partitions ori_partitioned_target;

第九章 Hive企業級調優之小表 大表Join

將key相對分散,並且資料量小的表放在join的左邊,這樣可以有效減少記憶體溢位錯誤發生的機率 再進一步,可以使用map join讓小的維度表 1000條以下的記錄條數 先進記憶體。在map端完成reduce。實際測試發現 新版的hive已經對小表join大表和大表join小表進行了優化。小表放在左...

第九章 Hive企業級優化之推測執行

在分布式集群環境下,因為程式bug 包括hadoop本身的bug 負載不均衡或者資源分布不均等原因,會造成同乙個作業的多個任務之間執行速度不一致,有些任務的執行速度可能明顯慢於其他任務 比如乙個作業的某個任務進度只有50 而其他所有任務已經執行完畢 則這些任務會拖慢作業的整體執行進度。為了避免這種情...

第九章 Hive企業級優化之並行執行

hive會將乙個查詢轉化成乙個或者多個階段。這樣的階段可以是mapreduce階段 抽樣階段 合併階段 limit階段。或者hive執行過程中可能需要的其他階段。預設情況下,hive一次只會執行乙個階段。不過,某個特定的job可能包含眾多的階段,而這些階段可能並非完全互相依賴的,也就是說有些階段是可...