Hive學習(九) 參數設置(調優)

Hive的參數設置方式

一、配置文件 (全局有效)node

二、命令行參數(對 hive 啓動實例有效)apache

三、參數聲明 (對 hive 的鏈接 session 有效)緩存

 

(1)配置文件

Hive 的配置文件包括:session

  A. 用戶自定義配置文件:$HIVE_CONF_DIR/hive-site.xmlapp

  B. 默認配置文件:$HIVE_CONF_DIR/hive-default.xml負載均衡

用戶自定義配置會覆蓋默認配置。oop

另外,Hive 也會讀入 Hadoop 的配置,由於 Hive 是做爲 Hadoop 的客戶端啓動的,Hive 的配 置會覆蓋 Hadoop 的配置。優化

配置文件的設定對本機啓動的全部 Hive 進程都有效。spa

 

(2)命令行參數

啓動 Hive(客戶端或 Server 方式)時,能夠在命令行添加-hiveconf param=value 來設定參數,這一設定對本次啓動的 session(對於 server 方式啓動,則是全部請求的 session)有效。命令行

bin/hive -hiveconf hive.root.logger=INFO,console

 

(3)參數聲明 

能夠在 HQL 中使用 SET 關鍵字設定參數

使用動態分區

set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict;

並行計算

set hive.exec.parallel=true; set hive.exec.parallel.thread.number=8;

數據傾斜(map join)

map join 概念:將其中作鏈接的小表(全量數據)分發到全部 MapTask 端進行 Join,從 而避免了 reduceTask,前提要求是內存足以裝下該全量數據

set hive.auto.convert.join=true; //設置 MapJoin 優化自動開啓
set hive.mapjoin.smalltable.filesize=25000000 //設置小表不超過多大時開啓 mapjoin 優化

 適當加大map

set mapreduce.input.fileinputformat.split.maxsize=20000000; set mapreduce.input.fileinputformat.split.minsize.per.node=10000000; set mapreduce.input.fileinputformat.split.minsize.per.rack=10000000;

 JOIN優化

1). 將大表放後頭
Hive假定查詢中最後的一個表是大表。它會將其它表緩存起來,而後掃描最後那個表。
所以一般須要將小表放前面,或者標記哪張表是大表:/*streamtable(table_name) */
2). 使用相同的鏈接鍵
當對3個或者更多個表進行join鏈接時,若是每一個on子句都使用相同的鏈接鍵的話,那麼只會產生一個MapReduce job。
3). 儘可能儘早地過濾數據
減小每一個階段的數據量,對於分區表要加分區,同時只選擇須要使用到的字段。
4). 儘可能原子化操做
儘可能避免一個SQL包含複雜邏輯,可使用中間表來完成複雜的邏輯

Limit快速出結果

通常狀況下,Limit語句仍是須要執行整個查詢語句,而後再返回部分結果。
有一個配置屬性能夠開啓,避免這種狀況---對數據源進行抽樣

hive.limit.optimize.enable=true --- 開啓對數據源進行採樣的功能 hive.limit.row.max.size --- 設置最小的採樣容量 hive.limit.optimize.limit.file --- 設置最大的採樣樣本數

 


set mapreduce.job.name=${fileName}_0; --做業名稱
set mapreduce.job.priorite=NORMAL; --做業優先級
set mapreduce.job.queuename=default; --做業隊列

--負載均衡
set hive.map.aggr = true; --是否在map端聚合
set hive.groupby.skewindata=true; --不支持多列剔重
set hive.groupby.mapaggr.checkinterval=100000; --在 Map 端進行聚合操做的條目數目

--壓縮設置
set mapred.compress.map.output = true; --對map任務輸出進行壓縮
set mapred.output.compress = true; --壓縮輸出
set hive.exec.compress.output = true; --控制hive的查詢結果輸出是否進行壓縮

--中間過程壓縮設置
set hive.exec.compress.intermediate=true; --控制hive的查詢中間結果是否進行壓縮,同上條配置,默認不壓縮false;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

--輸入設置
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --表示執行前進行小文件合併
set mapred.max.split.size = 256000000; --決定每一個map處理的最大的文件大小,單位爲B
set mapred.min.split.size.per.node = 256000000; --節點中能夠處理的最小的文件大小
set mapred.min.split.size.per.rack = 256000000; --機架中能夠處理的最小的文件大小

--輸出設置
set hive.merge.mapfiles = true; --合併map端輸出的結果
set hive.merge.mapredfiles = true; --合併reduce端輸出的結果
set hive.merge.size.per.task = 256000000; --merge job後每一個文件的目標大小
set hive.merge.smallfiles.avgsize = 256000000;

--reduce數量
set mapred.reduce.tasks= 300;
set hive.exec.reducers.bytes.per.reducer = 5120000000;

--並行設置
set hive.exec.parallel = true;
set hive.exec.parallel.thread.number = 8;

--內存相關設置
set mapreduce.map.memory.mb=8096;
set mapreduce.reduce.memory.mb=10144;

--開啓動態分區功能
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.created.files=10000;
set hive.exec.max.dynamic.partitions=10000;
set hive.exec.max.dynamic.partitions.pernode=10000;

--mapjoin設置
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask=true;
set hive.auto.convert.join.noconditionaltask.size=10000000;

set hive.mapjoin.smalltable.filesize = 10240000;

-- 開啓嚴格模式set hive.marped.mode=strict;

相關文章
相關標籤/搜索