Hive任务优化参数整理

Hive本身是个基于hdfs的结构化数据管理工具,虽然在后面的发展中允许底层接入其他的数据源,比如第三方数据服务这种基础架构,但是它从立意上来说,它不适合用来做高性能查询引擎,反而在传统离线数据仓库中它有着自身的优势

1.当你的查询数据量较大,此时spark等其他计算引擎会因为自身复杂的执行计划导致计算量很大,再加上计算中的硬性资源消耗,导致需要的资源使你无法接受,此时如果你可以接受较长时间的运行等待,建议使用hive,因为hive底层用的mr,任务分割截止到一次mr,没有那么大的消耗需求,你可以通俗的理解为hive只需要有你数据量大小和跑数据需要的进程类开销既可,它没有spark那种复杂的执行计划,因此它的使用成本是目前大数据计算引擎中最低的一个,效率也是最慢的,不过对于大任务的处理,更稳定
2.查询逻辑复杂,任务消耗资源较大,任务容易失败的情况下,建议使用hive,不过hive优势在于处理大数据,对于处理小数据没有优势,因为hive的执行延迟比较高。

1、hive任务的内存类调整

AM:

bash 复制代码
yarn.app.mapreduce.am.resource.mb=1536   #AM的可用内存大小,用来负责该任务的资源分配以及进度监控。建议值10240
yarn.app.mapreduce.am.command-opts=-Xmx1221m  #AM的jvm参数,建议值-Xmx8000m,也就是上面的70-80%,这个比例不要随便改,不然会造成内存溢出

Map:

bash 复制代码
mapreduce.map.memory.mb=1024   #单个map占用的内存大小,建议5120
mapreduce.map.java.opts=-Xmx864m    #单个map的jvm参数,建议-Xmx4800m,建议范围比例也是和AM一样的

Reduce:

bash 复制代码
mapreduce.reduce.memory.mb=2048    #单个reduce占用的内存大小,建议值10240
mapreduce.reduce.java.opts=-Xmx1638m   #同上

内存参数都是成对的,配置的时候也必须是成对配置,不然内存使用极容易出问题,opts结尾的是JVM参数,一般为对应内存的70%-80%,两者同步调整。

AM的内存需要根据任务的map和reduce数量来相应提高,该值太小会导致任务一直在重试,浪费资源且无法运行成功。建议totalmap超过1w+map以上的任务,AM内存大小设置为5G。部分任务高达15w个map,建议配置成10G。

map和reduce的 内存大小要根据任务的map并行度弹性调整,尽量不要超过报警阈值,并行度下面会说。

2、map和reduce并行度,允许同时运行的最大map/reduce数量,即并发度

bash 复制代码
mapreduce.job.running.map.limit=1000   #尽量不要上4000,2000左右就差不多了
mapreduce.job.running.reduce.limit=200   #一般是500左右

配置并行度的时候要考虑的时候,一定要考虑好,下面的公式是博主在工作中总结的上限,过了这个上限,任务就会出现读写吃力等问题,就不稳定了

bash 复制代码
任务并行reduce的总内存=${mapreduce.job.running.reduce.limit}*${mapreduce.reduce.memory.mb}任务reduce的总内存 <=5TB
任务并行map的总内存=${mapreduce.job.running.map.limit}*${mapreduce.map.memory.mb}
任务map的总内存 <=10TB

3、task数量,默认情况下,hive会根据map输入的数据总量,自动计算出合适的reduce数若,有需求,如需要生成几个结果文件等,可自行指定。hive中map数量无法向写代码那样直接指定数量,但是可以根据合并小文件的方式达到目的(见下条)

bash 复制代码
mapred.reduce.tasks

4、小文件合并,这个配置基本是你有需求用hive时,必带参数,因为数据量大的时候,基于磁盘计算一定会生成巨量的小文件,尤其是通常hive用的是tez,虽然会整合执行计划,但小文件该有还是有,很早之前博主刚入行的时候,想过既然能更改底层引擎,改成spark不就好了,对小文件的预防有好处,但是干的时间长了,发现能用spark了谁用hive呀

bash 复制代码
hive.merge.mapfiles=false    #在map-only job后合并文件,默认false
hive.merge.mapredfiles=false   #在map-reduce job后合并文件,默认false
hive.merge.smallfiles.avgsize=16000000     #单位字节,平均文件大小,是决定是否执行合并操作的阈值,建议64000000
hive.merge.size.per.task=256000000      #合并后每个文件的大小,默认单位字节,建议256000000
hive.merge.tezfiles=false   #如果使用的是tez引擎,可以在任务结束后合并文件,会新启动一个任务
mapreduce.input.fileinputformat.split.maxsize=256000000   #数据块被分割的最大值,单位字节,但是一般不改
mapreduce.input.fileinputformat.split.minsize=1   #数据块被分割的最小值,同上
mapreduce.input.fileinputformat.split.minsize.per.node=1     #一个节点上split的至少的大小 ,决定了多个data node上的文件是否需要合并,建议128000000,单位字节
mapreduce.input.fileinputformat.split.minsize.per.rack=1       #一个交换机下split的至少的大小,决定了多个交换机上的文件是否需要合并,建议值同上

5、推测执行,识别那些跑的比较慢的任务,然后它会产生另一个等效的任务作为备份,并使用首先完成的那个任务的结果,此时另外一个任务则会被要求停止执行,一般下面的三个开关保证默认的false

bash 复制代码
mapreduce.map.speculative
mapreduce.reduce.speculative
hive.mapred.reduce.tasks.speculative.execution

6、结果压缩

bash 复制代码
hive.exec.compress.output=true
mapreduce.output.fileoutputformat.compress=true
mapreduce.output.fileoutputformat.compress.type=RECORD   #默认RECORD,可选NONE、RECORD或者BLOCK
mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.DefaultCodec     #压缩格式

7、数据倾斜切分,hive的数据倾斜分为两种不同的情况

如果你是在join上发生了数据倾斜,既小表join了大表,用下面的切分任务数据

bash 复制代码
hive.auto.convert.join=false    #是否切分数据倾斜,默认false
hive.mapjoin.smalltable.filesize=25600000   #切分的大小,单位字节,建议100000000   

如果你发生了数据热点问题,比如某个key很大,就要开启下面的两个

bash 复制代码
hive.map.aggr=true     #启动combine聚合
hive.groupby.skewindata=true    #有一套加盐的执行计划会生效,将job拆成两个mr job,第一个job做部分聚合,第二个再全量聚合

8、任务超时,任务较大频繁GC ,或存在死循环,计算节点崩溃,都可能会造成

time out,导致任务 failed。遇到的话,将参数置位0即可规避,就是不检查超时

bash 复制代码
mapred.task.timeout=600000
相关推荐
maray10 分钟前
ETL 学习
数据仓库·学习·etl
Freedom℡35 分钟前
Spark,连接MySQL数据库,添加数据,读取数据
数据库·hadoop·spark
.又是新的一天.4 小时前
02_Servlet
hive·hadoop·servlet
wuli玉shell4 小时前
Bitmap原理及Hive去重方式对比
数据仓库·hive·hadoop
SelectDB技术团队6 小时前
永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!
数据仓库·apache·doris·数据可视化·日志数据
Hello World......8 小时前
Java求职面试揭秘:从Spring到微服务的技术挑战
大数据·hadoop·spring boot·微服务·spark·java面试·互联网大厂
RestCloud14 小时前
国产ETL数据集成软件和Informatica 相比如何
数据仓库·etl·数据集成工具·集成平台·informatica
尘客.15 小时前
DataX从Mysql导数据到Hive分区表案例
数据库·hive·mysql
yyywoaini~18 小时前
序列化和反序列化hadoop实现
hadoop·eclipse·php
薇晶晶18 小时前
hadoop中spark基本介绍
hadoop