01.18 优化 Hive ETL 任务(参数篇)


优化 Hive ETL 任务(参数篇)


优化 Hive ETL 任务(参数篇)


工作中常用的 hive 参数调优,整理如下。

通过查看线上日志的任务日志,可以获取任务运行每个阶段的耗时情况,结合集群的资源、任务的逻辑,可以从下面这几个角度优化我们的任务。

有时候,并不需要调整任务的参数,可能只需要调整任务的定时即可,大任务错峰执行,也可以优化单个任务的运行时长。

原则:

  • 最少数据
  • 最少字段
  • 最少Job数
  • 最少读取次数
  • 避免数据倾斜
  • 整体最优而不是局部最优
  • JVM 内存


(以上,最优解组合不一定是整体最优,要视情况而定。)

文件大小合理切分

这里需要结合集群的资源来合理的设置切片大小。

# 文件分割大小

set mapreduce.input.fileinputformat.split.maxsize=536870912;

# 节点文件分割大小

set mapreduce.input.fileinputformat.split.minsize.per.node=536870912;

# 机架文件分割大小

set mapreduce.input.fileinputformat.split.minsize.per.rack=536870912;

# Reduce 文件分割大小

set hive.exec.reducers.bytes.per.reducer=536870912;

# 输入合并

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

# 在Map-only的任务结束时合并小文件

set hive.merge.mapfiles=true;

# 在Map-reduce结束时合并小文件,(注:如果文件压缩格式不一致必须设置为false)

set hive.merge.mapredfiles=true;

# 合并文件的大小(默认)

set hive.merge.size.per.task=104857600;

# 当输出文件的平均大小小于该值时,启动一个独立的map-reduce任务进行文件merge(默认)

set hive.merge.smallfiles.avgsize=104857600;

最小数据

最小数据原则:(map阶段,shuffle阶段,reduce阶段)

网络开销:map端在写磁盘的时候采用压缩的方式将map的输出结果进行压缩是一个减少网络开销很有效的方法

数据集大小

# 数据先过滤后使用

# Shuffle操作

# Hive Group By查询中是否在Map端先进行聚合

set hive.map.aggr=true;

# Spill、Meger文件进行压缩

set mapreduce.map.output.compress=true;

# 压缩编解码器的类名

set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

数据倾斜

# 是否启用倾斜连接优化

set hive.optimize.skewjoin=true;

开启并行

# 开启任务并行执行

set hive.exec.parallel=true;

# 允许并行任务的最大线程数

set hive.exec.parallel.thread.number=16;

# 默认情况下,当整个MapReduce作业的所有已执行完成的Map Task任务数超过Map

# Task总数的 mapreduce.job.reduce.slowstart.completedmaps (默认为0.05) 后,ApplicationMaster便会开始调度执行Reduce Task任务。

set mapreduce.job.reduce.slowstart.completedmaps=0.05

# 个MapOutputCopier线程到已完成的Map Task任务节点上分别copy一份属于自己的数据。

# 这些copy的数据会首先保存的内存缓冲区中,当内冲缓冲区的使用率达到一定阀值后,则写到磁盘上。

set mapred.reduce.parallel.copies=5

内存优化

1.JVM进程跑在 container 中,mapreduce.map.java.opts 能够通过Xmx设置JVM最大的heap的使用,一般设置为 0.75 倍的 mapreduce.map.memory.mb ,因为需要为 Java code,非JVM内存使用等预留些空间;reduce的内存设置同理。


# 设置环形缓冲区的大小,经过map处理后的键值对,不会立马写入磁盘,

# 而是暂时保存在内存中的MapOutputBuffe内部的环形数据缓冲区

set mapreduce.task.io.sort.mb=1024

# 开始 spill 的百分比

set mapreduce.map.sort.spill.percent=0.8

# 设置 Map 的内存大小以及 JVM Heap

set mapreduce.map.memory.mb=4096

set mapreduce.map.java.opts=-Xmx3072M

# 设置 Reduce 的内存大小以及 JVM Heap

set mapreduce.reduce.memory.mb=4096

set mapreduce.reduce.java.opts=-Xmx3072M

# shuffile在reduce内存中的数据最多使用内存量

mapred.job.shuffle.input.buffer.percent=0.7

磁盘优化

磁盘的频繁IO也是一种不小的消耗,所以可以通过配置一些参数来减少磁盘的IO


# 默认代表进行merge的时候最多能同时merge多少spill

# 如果有100个spill个文件,此时就无法一次完成整个merge的过程

# 这个时候需要调大来减少merge的次数,从而减少磁盘的操作;

set mapreduce.task.io.sort.factor=10

# Combiner存在的时候,此时会根据Combiner定义的函数对map的结果进行合并,什么时候进行Combiner操作呢???

# 和Map在一个JVM中,是由min.num.spill.for.combine的参数决定的,默认是3,

# 也就是说spill的文件数在默认情况下由三个的时候就要进行combine操作,最终减少磁盘数据;

set min.num.spill.for.combine=3

# 减少磁盘IO和网络IO还可以进行:压缩,对spill,merge文件都可以进行压缩。

# 中间结果非常的大,IO成为瓶颈的时候压缩就非常有用,可以通过mapreduce.map.output.compress(default:false)设置为true进行压缩,

# 数据会被压缩写入磁盘,读数据读的是压缩数据需要解压,在实际经验中Hive在Hadoop的运行的瓶颈一般都是IO而不是CPU,压缩一般可以10倍的减少IO操作,

# 压缩的方式Gzip,Lzo,BZip2,Lzma等,其中Lzo是一种比较平衡选择,mapreduce.map.output.compress.codec(default:org.apache.hadoop.io.compress.DefaultCodec)参数设置。

# 但这个过程会消耗CPU,适合IO瓶颈比较大。

set mapreduce.map.output.compress=true

mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec

资源参数

# 指定资源队列,root.urgent

set mapred.job.queue.name=root.default;

# 最小可申请内存量

set yarn.scheduler.minimum-allocation-mb=1024;

# 最大可申请内存量

set yarn.scheduler.maximum-allocation-mb=32768;

# 最小可申请CPU数

set yarn.scheduler.minimum-allocation-vcores=1;

# 最大可申请CPU数

set yarn.scheduler.maximum-allocation-vcores=16;

# AM Container Heap内存大小

set yarn.app.mapreduce.am.command-opts=-Xmx2048M;

# AM Container内存大小

set yarn.app.mapreduce.am.resource.mb=4096;

# NodeManger可用内存大小

set yarn.nodemanager.resource.memory-mb=57344;

# NodeManger可用CPU数

set yarn.nodemanager.resource.cpu-vcores=16;

参考

  • MapReduce之Shuffle过程详述
  • HQL内存溢出的参数调优
  • Yarn 虚拟内存详解
  • MapReduce过程详解及其性能优化
  • https://www.cnblogs.com/edisonchou/p/4298423.html


分享到:


相關文章: