日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

HiveSQL运行优化参数配置

發(fā)布時間:2025/3/21 数据库 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HiveSQL运行优化参数配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日射日日干 | 欧美在线亚洲 | 日日碰日日摸 | 国产自产在线 | freesex性hd公交车上 | 国产成人在线视频免费观看 | 亲嘴脱内衣内裤 | 国产精彩视频在线观看 | 亚洲精品18 | 爱情岛亚洲论坛入口福利 | 成人a视频在线观看 | 国产成人亚洲综合a∨婷婷 台湾a级片 | 国产激情视频一区二区三区 | 黄色视屏在线看 | 黑人一区二区三区四区五区 | 性色av一区二区三区 | 性久久久久久久久 | 外国一级片 | 久久久久久国产精品日本 | 新版红楼梦在线高清免费观看 | 秋霞精品一区二区三区 | 波多野结衣中文在线 | www日韩在线| 七七久久 | 欧美丰满熟妇xxxx | 成人av动漫在线观看 | www日本com| 青青色在线视频 | 超碰青草 | 亚洲精品福利网站 | 夜夜草天天干 | 日韩av线上 | 亚洲免费色视频 | 亚洲妇熟xx妇色黄蜜桃 | 午夜影院美女 | 女人的av| 成人免费毛片日本片视频 | 99自拍视频在线观看 | 91亚洲精华国产精华精华液 | 国产精品久久久久久亚洲影视 | 五月婷婷影院 | 欧美aaaa视频 | 538国产精品一区二区 | 亚洲国产欧美日韩在线 | 美女又爽又黄 | 欧美极品少妇xxxxⅹ猛交 | 美国一区二区 | 1级黄色大片儿 | 电影一区二区三区 | 国产精品三级久久久久久电影 | 粉嫩aⅴ一区二区三区四区五区 | 久久久免费观看视频 | 国产在线视频不卡 | 国产原创精品 | 国产成人综合在线观看 | 亚洲色图国产精品 | 热久久精品免费视频 | 久久爱一区 | 天天曰天天爽 | 国产精品亲子伦对白 | 激情视频亚洲 | 久久这里只有精品99 | 爱情岛论坛成人 | 乐播av一区二区三区 | 国产一级在线免费观看 | 九九精品视频免费 | 他趴在我两腿中间添得好爽在线看 | 131mm少妇做爰视频 | 五月av在线| 操丝袜美女视频 | 午夜视频免费在线观看 | 极品少妇xxxx精品少妇 | 色吊丝网站 | 国产白嫩美女无套久久 | 伊人婷婷综合 | zzji欧美大片 | 欧美性视频一区二区 | 手机天堂网 | 国产欧美一区二区精品性色99 | av一区二区三区免费观看 | 欧美激情999 | 姑娘第5集在线观看免费好剧 | 都市激情第一页 | 亚洲午夜影视 | 俄罗斯精品一区二区三区 | 我们的2018在线观看免费高清 | 中文字幕一区二区三区波野结 | 秘密基地免费观看完整版中文 | 大尺度做爰啪啪床戏 | 99久久精品国产一区色 | 中文字幕在线免费看线人 | 阿的白色内裤hd中文 | 国产盗摄视频在线观看 | 成人免费毛片足控 | 欧美特级黄色 | 乱色欧美| 日本一级淫片免费放 | 亚欧激情| 色资源av |