Hive调优

先记录了这么多,日后如果有遇到,再补充。

fetch模式

<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, minimal, more].
Some select queries can be converted to single FETCH task minimizing latency.
Currently the query should be single sourced not having any subquery and should not have
any aggregations or distincts (which incurs RS), lateral views and joins.
0. none : disable hive.fetch.task.conversion
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
</description>
</property>

抓取模式:

  • more:默认的模式:表示全局查找,字段查找,limit查找都不启用MR;

  • minimal:分区中的filter,limit都不启用;

  • none:所有程序都走MR;

hive (default)> set hive.fetch.task.conversion;
hive.fetch.task.conversion=more

本地模式

<property>
<name>hive.exec.mode.local.auto</name>
<value>false</value> <!-- 默认关闭本地模式 -->
</property>
<property>
<name>hive.exec.mode.local.auto.inputbytes.max</name>
<value>134217728</value><!-- 文件超过此值,自动关闭本地模式 -->
</property>
<property>
<name>hive.exec.mode.local.auto.input.files.max</name>
<value>4</value><!-- 文件数量大于4,自动关闭本地模式 -->
</property>

在单台机器上处理所有任务,对于小数据集,文件数量少的任务,执行时间可以被明显缩短;

  • 开启本地模式

    hive (default)> set hive.exec.mode.local.auto=true;
  • 设置本地模式的数据集大小,文件数量:

    hive (default)> set hive.exec.mode.local.auto.inputbytes.max=134217728;
    hive (default)> set hive.exec.mode.local.auto.input.files.max=4;

表优化

大表小表Join

数据量小的表,放在join的左边,可以减少内存溢出发生的几率;

新版的hive,已经默认打开此优化(MapJoin优化),小表放左右,已经没有明显区别了;

大表 Join 大表

  1. 空Key过滤

    提前对空Key,进行过滤

    where id is not null
  2. 空Key造成数据倾斜

    给空字段,赋随机字符串(不要与非空key相同)+随机值,让这些空字段,不会进到同一个Reduce中,避免数据倾斜;

    on case when n.id is null then concat('hive',rand()) else n.id = 0.id;

MapJoin—内存换时间

将小表加载进内存,进行map;

<property>
<name>hive.auto.convert.join</name>
<value>true</value><!-- 默认开启MapJoin -->
</property>
<property>
<name>hive.mapjoin.smalltable.filesize</name>
<value>25000000</value><!-- 小表加载进内存的大小 -->
</property>

MapJoin是Hive的一种优化操作,其适用于小表JOIN大表的场景,进行自动优化;

Hive中的Join可分为

  • Common Join:Reduce阶段完成join

  • Map Join:Map阶段完成join,不需要进入到Reduce阶段才进行连接,节省了在Shuffle阶段时要进行的大量数据传输;

使用场景:

并不是所有场景都适合MapJoin,适合的场景如下:

  • 小表 Join 大表:小表会被放入内存中,不影响性能;

  • 不等值的链接操作;

Group By 优化

Map阶段后,会将同一个Key,发给同一个Reduce,如果group by的某一部分过大,就会发生数据倾斜;

数据倾斜之后,在Reduce端进行聚合就会造成资源浪费;

所以:并不是所有的聚合操作,都需要在Reduce端进行操作,很多聚合操作都可以在Map端进行。

开启Map端聚合:

<property>
<name>hive.map.aggr</name>
<value>true</value>
</property>
<property>
<name>hive.groupby.mapaggr.checkinterval</name>
<value>100000</value><!-- map端进行聚合的操作数目 -->
</property>
<property>
<name>hive.groupby.skewindata</name>
<value>false</value><!--默认false:-->
<!--有数据倾斜的时候自动进行均衡负载(将Map的结果随机分发给不同的Reduce,不再通过Key分发-->
</property>

动态分区

提前设置好如何分区,在插入数据的时候,Hive根据字段的值,自动进行分区。而不需要每次加载数据手动指定分区;

默认是:开启动态分区,非严格模式;

hive.exec.dynamic.partition=true
hive.exec.dynamic.partition.mode=nonstrict
  • strict(严格模式):必须指定至少一个分区为静态分区;

  • nonstrict(非严格模式):允许所有的分区字段都可以使用动态分区;

在所有的MR的节点上,最大一共可以创建的动态分区数目:

<property>
<name>hive.exec.max.dynamic.partitions</name>
<value>1000</value>
</property>
<property>
<name>hive.exec.max.dynamic.partitions.pernode</name>
<value>100</value><!--每个节点上,最大能创建的动态分区数-->
</property>
<property>
<name>hive.exec.max.created.files</name>
<value>100000</value><!--整个MRjob,最大创建的HDFS文件数-->
</property>
例子:

已有分区表:

create table dept(dname string,loc int)
partitioned by (deptno int)
row format delimited fields terminated by '\t';

在插入数据的时候,指定动态分区列:

insert into table dept partition(deptno)
select dname, loc deptno form dept_table;

MR优化

Map:

在MR层面的优化,主要是针对MapReduce性能的优化

  1. 小文件提前合并

  2. 复杂文件增加map操作数量

Reduce:

Reduce任务个数,默认-1,根据Map阶段输入之前的数据量来定的;

每个Reduce的默认处理数据量为256MB;输入数据1G,就会产生4个reduce;

手动设置Reduce任务数:

set mapreduce.job.reduces=15

Hive调优笔记的更多相关文章

  1. 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化

    数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99 ...

  2. Java性能调优笔记

    Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

  3. 【Hive六】Hive调优小结

    Hive调优 Hive调优 Fetch抓取 本地模式 表的优化 小表.大表Join 大表Join大表 MapJoin Group By Count(Distinct) 去重统计 行列过滤 动态分区调整 ...

  4. (转) hive调优(2)

    hive 调优(二)参数调优汇总 在hive调优(一) 中说了一些常见的调优,但是觉得参数涉及不多,补充如下 1.设置合理solt数 mapred.tasktracker.map.tasks.maxi ...

  5. (转)hive调优(1) coding调优

    hive 调优(一)coding调优 本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不 ...

  6. hive 调优(二)参数调优汇总

    在hive调优(一) 中说了一些常见的调优,但是觉得参数涉及不多,补充如下 1.设置合理solt数 mapred.tasktracker.map.tasks.maximum 每个tasktracker ...

  7. [转]【JVM】调优笔记2-----JVM在JDK1.8以后的新特性以及VisualVM的安装使用

    [From]https://www.cnblogs.com/sxdcgaq8080/p/7156227.html               隔壁的,加个引用做书签! [JVM]调优笔记2-----J ...

  8. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  9. Hive调优相关

    前言 Hive是由Facebook 开源用于解决海量结构化日志的数据统计,是基于Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能. 在资源有限的情况下,提 ...

随机推荐

  1. 【Tomcat】Tomcat 配置开机启动

    参考:[Linux]开机自动启动脚本 环境:Linux环境(CentOS 7.4) 步骤 1.在/etc/rc.d/rc.local文件底部,添加内容: # apache-tomcat- /data/ ...

  2. Qt编写气体安全管理系统2-界面框架

    一.前言 整体框架包括两个部分,一部分是UI界面框架,比如一级二级导航菜单按钮整体布局等,一部分是项目框架,上一篇文章说的是项目框架,这一篇文章来说界面框架,Qt做界面非常快速和高效,尤其是提供了可视 ...

  3. Docker容器(五)——Docker静态化IP

    (1).Docker的四种网络模式 Docker有以下四种模式,通过--net=[参数]选项(现在也可以使用--network [参数])指定: host模式:使用宿主机的IP地址和端口.使用--ne ...

  4. 【超分辨率】—图像超分辨率(Super-Resolution)技术研究

    一.相关概念 1.分辨率 图像分辨率指图像中存储的信息量,是每英寸图像内有多少个像素点,分辨率的单位为PPI(Pixels Per Inch),通常叫做像素每英寸.一般情况下,图像分辨率越高,图像中包 ...

  5. Swift4.0复习访问控制与作用域

    1.访问等级: open: 可以继承,可以重写. public: “public 访问等级能用于修饰所有文件作用域的函数.对象.协议.枚举.结构体.类以及各种类型中的属性与方法.用 public 所修 ...

  6. web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器

    1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...

  7. 编译Cython代码时遇到的问题: fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

    使用python setup.py build_ext --inplace命令编译cython代码, 出现以下错误: Compiling cython_example.pyx because it c ...

  8. js原生导出excel和csv

    ​ 严格意义来说并不是真正的excel文件,只是可以用excel打开查看而已,实际上的格式是逗号分隔文件即csv文件. 这里有几个坑要说一下: 不加Unicode的utf8头部标识excel打开文件会 ...

  9. js获取下拉框的值

      获取select 选中的option的值: $("#ddlRegType").find("option:selected").val(); 获取select ...

  10. python selenium学习

    selenium是一个python模块,具有自动化模拟浏览器的功能 selenium的中文文档地址:http://selenium-python-zh.readthedocs.io/en/latest ...