Hive性能调优(二)----数据倾斜
Hive在分布式运行的时候最害怕的是数据倾斜,这是由于分布式系统的特性决定的,因为分布式系统之所以很快是由于作业平均分配给了不同的节点,不同节点同心协力,从而达到更快处理完作业的目的。
Hive中数据倾斜的原因:
- 数据在分布式节点上分部不均衡
- join时某些key可能特别大(常见null值)
- group by 时某个值可能特别多
- count(distinct key...)时有可能会出现数据倾斜,因为其内部处理会进行group by 操作
- join
join时key最好是分散的,如果一个key的数据量特别大,有可能会出现数据倾斜和OOM。一个核心就是小表join大表,可以在reduce阶段,左侧的小表全部加载到内存,降低OOM的风险
- 大表join大表
数据倾斜,例如null值。解决办法一般是打散null值,例如使用随机数等。
- mapjoin
小表join(超)大表的时候,可以采用mapjoin 的方式把小表全部加载到mapper端的内存中。
不会自动进行mapjoin,需要设置:
set hive.auto.convert.join=true; //hive在进行join的时候会判断左表的大小来决定是否进行mapJoin
set hive.mapjoin.smalltable.filesize=128000000 //hive在进行join的时候会判断左表的大小来决定是否进行mapJoin的大小阈值 字节数
set hive.mapjoin.cache.numrows=1000000 //hive在进行join的时候会判断左表的大小来决定是否进行mapJoin的大小阈值--数据行数上述参数可以根据实际的硬件机器的内存进行调整,对性能有至关重要的影响,因为没有了shuffle,对于mapjoin我们能够使用mapper端JVM中多大的内存?
set hive.mapjoin.followby.gby.localtask.max.memory.usage=0.55 //百分比
set hive.mapjoin.localtask.max.memory.usage=0.9 //百分比 - group by
可以设置在Mapper端进行部门聚合,最后在reduce端进行全局聚合
set hive.map.aggr=true; //默认开启,
set hive.groupby.mapaggr.checkinterval=1000000; //在Map端进行聚合操作的条目数
//防止数据倾斜
set hive.groupby.skewindata=true; //会产生Mapper-Reducer-Reducer的结构生成查询计划时,实际上会生成两个job,第一个job会通过自己的算法打散倾斜的key并进行聚合操作并保留结果,第二个job会完成全部的Group by 操作,相当于Mapper-Reduce-Reduce的结构。(第一个会把Mapper的输出随记分布到Reduce中,每个Reduce做部分聚合并且保存结果,这样导致相同的groupby key分配到不同的Reduce上,一定程度上避免数据倾斜,接下来另外一个Job根据前一个Job预处理数据的结果再进行Group By到Reduce中)
- count(distinct ) 如果某个值特别多,容易产生数据倾斜。
解决思路:
在查询语句中,例如对null值进行过滤,在结果上加1。 count(uid) (uid中去掉了值为null)的记录,所以在最后的结果 cnt 的基础上加1, 即cnt+1
Hive性能调优(二)----数据倾斜的更多相关文章
- Spark学习之路 (九)SparkCore的调优之数据倾斜调优
摘抄自:https://tech.meituan.com/spark-tuning-pro.html 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Sp ...
- Spark学习之路 (九)SparkCore的调优之数据倾斜调优[转]
调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...
- Spark 调优之数据倾斜
什么是数据倾斜? Spark 的计算抽象如下 数据倾斜指的是:并行处理的数据集中,某一部分(如 Spark 或 Kafka 的一个 Partition)的数据显著多于其它部分,从而使得该部分的处理速度 ...
- 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化
数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题.常见的Hive调优的方法:列剪裁.Map Join操作. Group By操作.合并小文件. 一.表现 1.任务进度长度为99 ...
- Hive(十)Hive性能调优总结
一.Fetch抓取 1.理论分析 Fetch抓取是指,Hive中对某些情况的查询可以不必使用MapReduce计算.例如:SELECT * FROM employees;在这种情况下,Hive可以简单 ...
- 【Spark调优】数据倾斜及排查
[数据倾斜及调优概述] 大数据分布式计算中一个常见的棘手问题——数据倾斜: 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或j ...
- HDP Hive性能调优
(官方文档翻译整理及总结) 一.优化数据仓库 ① Hive LLAP 是一项接近实时结果查询的技术,可用于BI工具以及网络看板的应用,能够将数据仓库的查询时间缩短到15秒之内,这样的查询称之为Int ...
- spark性能调优06-数据倾斜处理
1.数据倾斜 1.1 数据倾斜的现象 现象一:大部分的task都能快速执行完,剩下几个task执行非常慢 现象二:大部分的task都能快速执行完,但总是执行到某个task时就会报OOM,JVM out ...
- spark调优篇-数据倾斜(汇总)
数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...
随机推荐
- CSAPP 3 程序的机器级表示
1 本章总述 1) 通过让编译器产生机器级程序的汇编表示, 学习了编译器及其优化能力, 以及机器.数据类型和指令集; 2) 学习了程序如何将数据存储在不同的内存区域中 -- 程序开发人员需要知道一个变 ...
- java 读取 excel 表格内容
一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...
- 使用docker安装eolinker
1.下载docker-enlinker git clone https://github.com/psvmc/eolinker-docker.git 2.进入目录 cd eolinker-docker ...
- ODA: After Apply ODA 12.2.1.2.0 Patch, Unable to Create TableSpace Due to [ORA-15001: diskgroup "DATA" does not exist or is not mounted | ORA-15040: diskgroup is incomplete] (Doc ID 2375553.1)
ODA: After Apply ODA 12.2.1.2.0 Patch, Unable to Create TableSpace Due to [ORA-15001: diskgroup &quo ...
- Python:判断列表中含有字符串且组成新的列表打印输出-Dotest董浩
'''题一:判断列表中含有字符串且组成新的列表打印输出知识点:列表.列表的增删改查.for循环.if判断'''#@Author:Dotest软件测试#@QQ:1274057839names = ['D ...
- python操作队列
进行队列的操作,首先要引入queue这个库 一:设置队列(括号中是队列可容纳数据的多少,如果不设置,则可以一直增加) import queue q = queue.Queue(10) 二:添加/获取元 ...
- AcWing 791. 高精度加法 解题记录
题目地址 https://www.acwing.com/problem/content/description/793/ 题目描述给定两个正整数,计算它们的和. 输入格式共两行,每行包含一个整数. 输 ...
- HDU1075 What Are You Talking About(map)
传送门 题目大意:一个单词对应另一个单词 翻译一段文字 题解:stl map走一波 代码: #include<iostream> #include<map> #include& ...
- 并发编程实战之并发下的socket套接字编程
目录 一.python单线程下实现多个socket并发 1.1 服务端 1.2 客户端 一.python单线程下实现多个socket并发 1.1 服务端 import sys # import soc ...
- Spring中注解方式实现IOC和AOP
1.IOC注解 1.1 IOC和DI的注解 IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Service:用 ...