Hive 调优-参数篇


图片来源网络,点赞

工作中常用的 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阶段)

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

```sql # 数据先过滤后使用

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;

<a name="Sh0TB"></a>
## 数据倾斜```sql
# 是否启用倾斜连接优化
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的内存设置同理。

```sql # 设置环形缓冲区的大小,经过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


<a name="CiUaN"></a>
## 磁盘优化
> 磁盘的频繁IO也是一种不小的消耗,所以可以通过配置一些参数来减少磁盘的IO```sql
# 默认代表进行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

关注

欢迎关注我的公众号:大数据每日哔哔

Hive ETL 任务调优(参数篇)相关推荐

  1. hive的一些调优参数

    hive的一些调优参数 set hive.exec.dynamic.partition.mode=nonstrict; 使用动态分区 set hive.exec.max.dynamic.partiti ...

  2. JVM常用调优参数 ——JVM篇

    JVM常用性能调优参数详解 ​ 在学习完整个JVM内容后,其实目标不仅是学习了解整个JVM的基础知识,而是为了进行JVM性能调优做准备,所以以下的内容就是来说说JVM性能调优的知识. 一.性能调优 ​ ...

  3. 开发人员MySQL调优-实战篇2-让SQL使用索引详解

    2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...

  4. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  5. GC 调优(实战篇) - GC参考手册

    说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间内分配的量; 同理, Promotion Rate 翻译为 提升速率; 您应该已经阅读了前面的章 ...

  6. JVM优化系列-详解常用的虚拟机调优参数

    导语   需要对虚拟机进行诊断,首先需要了解如何进行虚拟机的配合和跟踪,这里就来说说有那些虚拟机配置参数,通过它们来对虚拟机进行跟踪和配置. 文章目录 虚拟机跟踪调试参数 如何读懂虚拟机日志 GC基本 ...

  7. 《GC篇》七、GC 调优(实战篇)

    7. GC 调优(实战篇) 高分配速率(High Allocation Rate) 如何测量分配速率? 分配速率的意义 示例 高分配速率对JVM的影响 解决方案 过早提升(Premature Prom ...

  8. 7. GC 调优(实战篇) - GC参考手册

    本章介绍导致GC性能问题的典型情况.相关示例都来源于生产环境, 为演示需要做了一定程度的精简. 说明: Allocation Rate, 翻译为分配速率, 而不是分配率; 因为不是百分比,而是单位时间 ...

  9. 6. GC 调优(工具篇) - GC参考手册

    进行GC性能调优时, 需要明确了解, 当前的GC行为对系统和用户有多大的影响.有多种监控GC的工具和方法, 本章将逐一介绍常用的工具. 您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 J ...

最新文章

  1. 国产光刻设备第一股:从官司缠身到国产希望?
  2. java中final使用
  3. JS 对象(Object)和字符串(String)互转
  4. 阿里云容器服务发布 Knative 托管服务
  5. ASP.NET MVC 5 学习教程:添加查询
  6. 2019 嵌入式智能国际大会圆满落幕,7 大专场精彩瞬间释出!
  7. Xavier Initialization 的理解与推导(及实现)
  8. [序列化] SerializeHelper--序列化操作帮助类 (转载)
  9. 服务器更新升级BIOS操作步骤
  10. 服务端渲染(SSR)
  11. 编程数学读书笔记 -- 第二章逻辑
  12. 华为 MA5800设备防盗
  13. 安卓编程用什么软件_如何用手机进行编程?有哪些值得推荐的软件?
  14. C++与C#相比,哪个更适合开发大型游戏?
  15. android 逆向ida,浅谈安卓逆向协议(四)- ida pro - 小红书
  16. python2.7开发photoshop一些经验
  17. WMS 原型详解 | 产品经理最讨厌的系统
  18. 大商创x支持mysql版本_【大商创安装】大商创X宝塔面板安装配置简述
  19. 批量下载图片的插件-免费自动下载图片的插件
  20. 关于 微信扫二维码下载apk 的方法

热门文章

  1. MBA已经全面***“中国式教育”!
  2. backup1:开始数据库备份
  3. 在 远程桌面 权限不足无法控制 UAC 提示时,可使用 计划任务 绕开系统的 UAC 提示...
  4. 国内最全最详细的hadoop2.2.0集群的HA高可靠的最简单配置
  5. 极度丝滑!CentOS/Unbuntu系统下快速设置虚拟内存,一行命令快速搞定!!!
  6. 容器编排技术 -- Kubernetes kubectl patch 命令详解
  7. 分布式面试 - 为什么要进行系统拆分?
  8. ZooKeeper--分层仲裁简介
  9. Java项目案例大全
  10. 「Flink」使用Managed Keyed State实现计数窗口功能