HiveSQL运行优化参数配置
?
HiveSQL運行優(yōu)化參數(shù)配置
HiveSQL常用數(shù)據(jù)處理語句
HiveSQL中復(fù)雜數(shù)據(jù)類型操作
?
? ? ? ?我們平時在使用hive執(zhí)行一些SQL任務(wù)時。經(jīng)常會遇到執(zhí)行速度很慢,數(shù)據(jù)傾斜,資源不夠用等問題。那是因為我們沒有合理的使用hive。hive 的主要配置文件為conf中hive-site.xml,里面包含許多配置參數(shù),靈活的根據(jù)業(yè)務(wù)進行相關(guān)的參數(shù)配置,可以解決以上問題。下面將介紹hive的全部參數(shù)的意義以及如何配置。
目錄
常規(guī)優(yōu)化配置
Map的任務(wù)數(shù)配置
Reduce的任務(wù)數(shù)配置
其他可選配置
常規(guī)優(yōu)化配置
--hive任務(wù)配置參數(shù) set mapreduce.job.queuename=default; set mapred.job.name=one_big_job;set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions=1000000; SET hive.exec.max.dynamic.partitions.pernode=1000000; set hive.exec.max.created.files=6553500;set mapred.max.split.size=202400000; set mapred.min.split.size.per.node=202400000; set mapred.min.split.size.per.rack=202400000;set mapred.reduce.tasks=200; set hive.exec.reducers.max=200;set hive.exec.parallel=true; set hive.exec.parallel.thread.number=24;set hive.groupby.skewindata=true; set hive.map.aggr=true;以上參數(shù)可以直接配置使用,詳細的參數(shù)解釋及最優(yōu)數(shù)值大小參考如下。
?
Map的任務(wù)數(shù)配置
執(zhí)行任務(wù)時Map的任務(wù)數(shù)配置,即執(zhí)行任務(wù)時,上圖標紅的,number of mappers: 1 的數(shù)量。
map的個數(shù)設(shè)置其實對執(zhí)行效率有很大的影響:
- 如果mappers數(shù)量過多,map任務(wù)啟動和初始化的時間遠遠大于邏輯處理的時間,就會造成很大的資源浪費。而且,同時可執(zhí)行的map數(shù)是受限的;
- 如果mappers數(shù)量過少,Hadoop的計算資源沒有充分的利用,計算緩慢;
map的個數(shù)主要的決定因素有: input的文件總個數(shù),input的文件大小,集群設(shè)置的文件塊大小(默認為128M)
map個數(shù)的計算公式如下:splitsize=max(minimumsize,min(maximumsize,blocksize))
如果沒有設(shè)置minimumsize和maximumsize,splitsize的大小默認等于blocksize
計算過程可以簡化為如下的公式,詳細算法可以參照FileInputSplit類中的getSplits方法
total_split ;
for(file :輸入目錄中的每個文件)
{
file_split = 1;
if(file.size>splitsize)
{
file_split=file_size/splitsize;
}
total_split+=file_split;
}
由于mapreduce中沒有辦法直接控制map數(shù)量,所以只能通過設(shè)置每個map中處理的數(shù)據(jù)量進行設(shè)置;reduce是可以直接設(shè)置的
set mapred.max.split.size = 256000000;? (200M = 200 * 1000 * 1000)
-----決定每個map處理的最大的文件大小,單位為B
?
set mapred.min.split.size.per.node = 256000000; ? ? ? ??
-----節(jié)點中可以處理的最小的文件大小
set mapred.min.split.size.per.rack = 256000000; ? ? ? ??
-----機架中可以處理的最小的文件大小
Reduce的任務(wù)數(shù)配置
執(zhí)行任務(wù)時 reducers 的任務(wù)數(shù)配置,即執(zhí)行任務(wù)時,上圖標紅的,number of reducers: 159 的數(shù)量。
影響:reduce的個數(shù)設(shè)置其實對執(zhí)行效率有很大的影響:
- 如果reduce太少,如果數(shù)據(jù)量很大,會導(dǎo)致這個reduce異常的慢,從而導(dǎo)致這個任務(wù)不能結(jié)束,也有可能會OOM;
- 如果reduce太多,產(chǎn)生的小文件太多,合并起來代價太高,namenode的內(nèi)存占用也會增大;
reduce個數(shù)可以由以下三個參數(shù)直接決定:
set mapred.reduce.tasks=200;
-----這個參數(shù)如果指定了,hive就不會用它的estimation函數(shù)來自動計算reduce的個數(shù),而是用這個參數(shù)來啟動reducer。默認是-1,根據(jù)計算數(shù)量的大小來設(shè)定,一般設(shè)置為200,執(zhí)行任務(wù)是reduce任務(wù)數(shù)即為200;
set hive.exec.reducers.bytes.per.reducer =?500000000;(500M = 500 * 1000?* 1000)
-----默認是1G,輸入文件如果是10G,那么就會起10個reducer,,單位為B;
set hive.exec.reducers.max=200;
-----這個參數(shù)控制最大的reducer的數(shù)量,如果輸入文件大小/hive.exec.reducers.bytes.per.reducer 所得出的大小?max ?則會啟動這個參數(shù)所指定的reduce個數(shù);?這個并不會影響mapre.reduce.tasks參數(shù)的設(shè)置,默認的max是999;
其他可選配置
常規(guī)配置
set mapreduce.job.queuename=default;
-----設(shè)置任務(wù)運行隊列,同一個Hadoop集群不同的隊列資源的相互隔離的,避免因大任務(wù)計算導(dǎo)致資源耗竭;
set mapred.job.name=one_big_job;
------設(shè)置任務(wù)運行任務(wù)名稱,在yarn的任務(wù)日志頁面可以現(xiàn)在此 Jobname;
set mapreduce.task.timeout = 60000
-----mr程序的task執(zhí)行情況匯報過期時間,默認60000(10分鐘),設(shè)置為0表示不進行該值的判斷。
set hive.cli.print.current.db=true;
-----讓提示符顯示當前庫
set hive.cli.print.header=true;
-----顯示查詢結(jié)果時顯示字段名稱:
?
動態(tài)分區(qū)插入數(shù)據(jù)參數(shù)配置
set hive.exec.dynamic.partition=true;
-----是開啟動態(tài)分區(qū),即動態(tài)插入分區(qū),可以根據(jù)數(shù)據(jù)計算結(jié)果值為分區(qū);
set hive.exec.dynamic.partition.mode=nonstrict;
-----這個屬性默認值是strict,就是要求分區(qū)字段必須有一個是靜態(tài)的分區(qū)值;
set hive.exec.max.dynamic.partitions=1000000;
-----每一個mapreduce job允許創(chuàng)建的分區(qū)的最大數(shù)量,如果超過了這個數(shù)量就會報錯,缺省值100;
set hive.exec.max.dynamic.partitions.pernode=1000000;
-----一個dml語句允許創(chuàng)建的所有分區(qū)的最大數(shù)量,缺省值1000;
set hive.exec.max.created.files=6553500;
-----所有的mapreduce job允許創(chuàng)建的文件的最大數(shù)量,缺省值100000;
?
作業(yè)有多個可并行的job時,設(shè)置任務(wù)并行及并行個數(shù):
set hive.exec.parallel=true;
-----開啟任務(wù)并行執(zhí)行
set hive.exec.parallel.thread.number=8;
-----同一個sql允許并行任務(wù)的最大線程數(shù)?
針對一條HiveSQL中存在的查詢操作無直接關(guān)聯(lián),可以并行執(zhí)行,如union all操作,可以開啟并行執(zhí)行;left join類的操作則語句配置失效,本身不能進行并行執(zhí)行,存在依賴;
多條獨立HiveSQL需要并行執(zhí)行,可以同時提交任務(wù),與HvieSQL這里的配置沒有關(guān)系;
?
配置任務(wù)執(zhí)行引擎
set hive.execution.engine=mr; (默認)
set hive.execution.engine=tez;(需要Hadoop集群安裝/支持)
set hive.execution.engine=spark;
如果設(shè)置執(zhí)行引擎為mr,那么就會調(diào)用Hadoop的maprecude來運行需要執(zhí)行job的程序;
如果設(shè)置執(zhí)行引擎為spark,那么就會調(diào)用spark來執(zhí)行任務(wù)。有條件的話,就設(shè)置執(zhí)行引擎為Spark,運行的比Hadoop的MapReduce快了很多。
如果設(shè)置執(zhí)行引擎為tez,Tez是一個Hive的運行引擎(需要先安裝Tez),性能優(yōu)于MR,Tez基于內(nèi)存的計算使得hive可以有更高的運算效率。
?
小表數(shù)據(jù)關(guān)聯(lián)計算使用mapjoin
set hive.auto.convert.join = true;
-----是否自動轉(zhuǎn)換為mapjoin
set hive.mapjoin.smalltable.filesize=50000000;
-----小表的最大文件大小,默認為25*000*000,即25M
set hive.auto.convert.join.noconditionaltask = true;
-----是否將多個mapjoin合并為一個
set hive.auto.convert.join.noconditionaltask.size = 10000000; (10*1000*1000)
-----多個mapjoin轉(zhuǎn)換為1個時,所有小表的文件大小總和的最大值。
MapJoin顧名思義,就是在Map階段進行表之間的連接。而不需要進入到Reduce階段才進行連接。這樣就節(jié)省了在Shuffle階段時要進行的大量數(shù)據(jù)傳輸。從而起到了優(yōu)化作業(yè)的作用。
MapJoin適用的場景:mapjoin的適用場景如關(guān)聯(lián)操作中有一張表非常小,.不等值的鏈接操作。通過上面分析你會發(fā)現(xiàn),并不是所有的場景都適合用MapJoin. 它通常會用在如下的一些情景:在二個要連接的表中,有一個很大,有一個很小,這個小表可以存放在內(nèi)存中而不影響性能。這樣我們就把小表文件復(fù)制到每一個Map任務(wù)的本地,再讓Map把文件讀到內(nèi)存中待用。
?
數(shù)據(jù)傾斜
set hive.groupby.skewindata=true;
-----有數(shù)據(jù)傾斜的時候進行負載均衡,當選項設(shè)定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結(jié)果集合會隨機分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group By Key 有可能被分發(fā)到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group By Key 分布到 Reduce 中(這個過程可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作。
set hive.map.aggr=true;
-----在map中會做部分聚集操作,效率更高但需要更多的內(nèi)存。
如果以上不管用,可以對傾斜的數(shù)據(jù)進行單獨的sql處理。
?
內(nèi)存溢出優(yōu)化
Hadoop處理數(shù)據(jù)時,出現(xiàn)內(nèi)存溢出的處理方法(內(nèi)存調(diào)優(yōu)),Mapper/Reducer階段JVM內(nèi)存溢出,堆內(nèi)存不足時,一般會拋出如下幾種異常:
java.lang.OutOfMemoryError:” GC overhead limit exceeded
Error: Java heapspace
running beyondphysical memory limits.Current usage: 4.3 GB of 4.3 GBphysical memoryused; 7.4 GB of 13.2 GB virtual memory used. Killing container
Exception: java.lang.OutOfMemoryError thrown from theUncaughtExceptionHandler in thread
Socket Reader #1 for port 30703
Halting due to Out Of Memory Error...
Halting due to Out Of Memory Error...
Halting due to Out Of Memory Error...
java.lang.OutOfMemoryError:Direct buffffer memory
目前MapReduce主要通過兩個組參數(shù)去控制內(nèi)存:(將如下參數(shù)調(diào)大)
mapreduce.map.java.opts=-Xmx2048m
-----默認參數(shù),表示jvm堆內(nèi)存,注意是mapreduce不是mapred
mapreduce.map.memory.mb=2304
-----container的內(nèi)存
mapreduce.reduce.java.opts=-Xmx2048m
-----默認參數(shù),表示jvm堆內(nèi)存
mapreduce.reduce.memory.mb=2304
-----container的內(nèi)存
?
HiveSQL執(zhí)行命令
hive -e 'select * from area where code=202020' >> /root/files/a.csv
hive -f ?sqlfile.sql >> ? /files/result.csv
hive -hiveconf day=2015 -f sqlfile.sql >> ?/files/result.csv
-----傳入一個參數(shù)
hive -hiveconf year=2015 -hiveconf month=09 -hiveconf day=11 ?-f sqlfile.sql >> ?/files/result.csv
-----傳入多個參數(shù)
nohub???hive??-f??sqlfile.sh??>>??result.csv??2>&1 &
-----后臺執(zhí)行
?
Hive中引入外部包
hive默認的函數(shù)并不是太完整,以后我們使用的使用肯定需要自己補充一些自定義函數(shù)的。
ADD jar hdfs://ip:9000/user/hadoop/share/HiveUdf.jar;
-----在hive中添加包
delete?jar?hdfs://ip:9000/user/hadoop/share/HiveUdf.jar;
-----在hive中刪除包
CREATE TEMPORARY FUNCTION tmp_fun as 'com.hive.udf.Encry';
-----在hive中創(chuàng)建函數(shù)
select tmp_fun('123');
-----在hive中使用函數(shù)
?
Hive中數(shù)據(jù)壓縮
中間壓縮處理hive查詢的多個job之間的數(shù)據(jù),對于中間壓縮,最好選擇一個節(jié)省cpu耗時的壓縮方式
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
-----按塊壓縮,而不是記錄?
最終輸出壓縮(選擇壓縮效果好的,減少儲存空間)?
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec;
set mapred.output.compression.type=BLOCK;
-----按塊壓縮,而不是記錄?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的HiveSQL运行优化参数配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树-缺失值和连续值处理及属性划分
- 下一篇: HiveSQL常用数据处理语句