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

一、表现

1.任务进度长度为99%,在任务监控页面中发现只有几个 reduce 子任务未完成;

2.单一 reduce 记录与平均记录数差异过大(大于3倍),最长时长>>平均时长;

3.job数多的,效率低,多次关联后,产生几个jobs,起码半小时以上才跑完;

二、原因

1.key分布不均;

2.业务数据本身问题;

3.建表有问题;

4.sql语句本身数据倾斜;

数据倾斜问题:

关键词

情形

后果

join

1.小表与大表.其中一表较小,但key集中;

或空值过多;

分发到一个或几个reduce上数据远大于平均值;空值由一个reduce处理,很慢

group by

group by 维度过小,某值数量过多

处理某值的reduce很耗时,解决:用sum() group代替count
(distinct)

count distinct

某特殊值过多

处理此特殊值reduce耗时

三、解决思路

1.好的模型设计事半功倍;

2.解决数据倾斜问题;

3.减少job数;

4.设置合理的map,reduce 的task 数,有效提升性能;

5.自己动手写sql 可以解决数据倾斜;

6.对sum, count不存在数据倾斜问题,自己写;

7.对小文件合并;

8.优化时把握整体,单个作业最优不一定整体最优。

(注:sql相关→(1)倾斜的数据用 map join,不倾斜的数据用
join;

个具有相同列的数据类型的结果放到一起显示,并且不去重;

(3)有几个列参与join就有几个job,不是看独立的语句(eg.select)有几个!)

四、解决方案

 4.1 参数调节

hive.map.aggr = true (map 端部分聚合,当于 combiner)

hive.groupby.skewindata = true (有数据倾斜时负载均衡

 

4.2 sql语句调节

(1) 如何join:关于驱动表的选取,应选分布均匀的作为驱动表;做好列剪裁
filter 操作
,达到两表 join 时,数量变小的效果。

(2) 大小表join:使用map join,让小表先进内存,在 map 端完成reduce 。

(3) 大表 join 大表:把空值 null key变成字符串加上随机数,倾斜数据分到不同 reduce 上。

(4) groupby 维度过小:采用sum() group by 代替count (distinct) 完成计算。

五、典型案例

5.1. 空值产生的数据倾斜:userid为空的表去 join另一表

方法一:为空的userid 不参与关联:select * from a join b on a.userid is not null and a.id = b.id

方法二:赋空值分新的 key值,字符串加上随机数。(比方法一好,io少了,作业job也少了:方法一读取log 为2次,job为2;方法二读取的job 为1)

5.2 不同数据类型关联的数据倾斜:个表中,一个为 string,一个为
int

解决方法:把数值类型转化为 string。

eg. select *from a left join b on (a.id = cast(b.id as string))

5.3 小表 join 大表时,小表很大:一般 map join会有 bug

两个待连接表中,小表可以进内存(小表小于内存装得下),而大表很大。可以将小表复制多份,让每个Map Task 内存中存在一份(比如放到 hash table 中),然后只扫描大表。

对大表中每条记录 key-value,在 hash table中查找是否有相同的 key 记录,如果有,连接后输出即可。(不用 reducer,直接在 map端就可以完成
join)

【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化的更多相关文章

  1. Spark学习之路 (九)SparkCore的调优之数据倾斜调优

    摘抄自:https://tech.meituan.com/spark-tuning-pro.html 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Sp ...

  2. Spark学习之路 (九)SparkCore的调优之数据倾斜调优[转]

    调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...

  3. spark调优篇-数据倾斜(汇总)

    数据倾斜 为什么会数据倾斜 spark 中的数据倾斜并不是说原始数据存在倾斜,原始数据都是一个一个的 block,大小都一样,不存在数据倾斜: 而是指 shuffle 过程中产生的数据倾斜,由于不同的 ...

  4. Spark 调优之数据倾斜

    什么是数据倾斜? Spark 的计算抽象如下 数据倾斜指的是:并行处理的数据集中,某一部分(如 Spark 或 Kafka 的一个 Partition)的数据显著多于其它部分,从而使得该部分的处理速度 ...

  5. 【Spark调优】数据倾斜及排查

    [数据倾斜及调优概述] 大数据分布式计算中一个常见的棘手问题——数据倾斜: 在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或j ...

  6. 《Kafka权威指南》读书笔记-操作系统调优篇

    <Kafka权威指南>读书笔记-操作系统调优篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 大部分Linux发行版默认的内核调优参数配置已经能够满足大多数应用程序的运 ...

  7. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  8. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  9. Hive(十二)【调优】

    目录 1.Fetch抓取 2.本地模式 3.表的优化 3.1大小表join 3.2大表Join大表 3.3map join 3.4group By 3.5 count(distinct) 3.6笛卡尔 ...

随机推荐

  1. Oracle oledb 打包并集成到程序安装包(VC ADO訪问Oracle)

    近期有一个项目和oracle交互,我用的是ADO的方式进行试问操作. 首先把数据库连接的东东记录一下,老了记性不好啊! 操作例如以下: //连接串这么写的话就能够不用配置 tnsnames.ora配置 ...

  2. 内核顶层Makefile相关2

    http://www.groad.net/bbs/simple/?f104.html if  函数 if 函数的语法有两种形式: () $(if <condition>, <then ...

  3. git+jenkins

    开发写代码的演变 一个开发单打独斗,撸代码,开发网站,自由自在 多个开发同时开发一个网站,同时改一份代码.但是同时改一个文件会导致冲突 分支结构,每天上班第一件事克隆代码,下班前最后一件事合并代码 好 ...

  4. Django-extra的用法

    ## select提供简单数据 # SELECT age, (age > 18) as is_adult FROM myapp_person; Person.objects.all().extr ...

  5. python--面向对象—接口

    开放封闭原则依赖导致原则接口隔离原则继承多态抽象类和接口类    编程思想:为子类做规范 归一化设计:几个类都实现了相同的方法 抽象类:最好单继承,且可以简单的实现功能 接口类:可以多继承,且最好不实 ...

  6. caffe搭建以及初步学习--win7-vs2013-gtx650tiboost-cuda8.0-cifar10训练和测试-2-快速解决方案cifar10_quick_solver.prototxt

    首先安装好显卡----已经装好了?喜大普奔!没装好?那就用cpu,也是一样的. 拷贝cudnn v5.0 头文件和库文件以及执行文件到cuda8中 -------------------------- ...

  7. 实现单击列表头对ListView的动态排序

    排序是根据列的类型来的,就ID列来说,int类型的排序结果是3,5,17,而如果你把该列类型改为string,结果就会是17,3,5,如果你定义列的时候不加类型,默认是string,如果是自定义类型, ...

  8. OTL中文乱码 OTL UTF8

    在用unixODBC连接MySQL的时候字符编码是由odbc支持的,不须要C++编译OTL的时候加上什么编译条件. 假设你的数据库使用的编码是UTF-8,你要从这个数据库读数据.并且还要将结果放到这个 ...

  9. 基于EasyDarwin EasyPusher实现Android手机直播推送功能

    EasyPusher直播推送在之前就已经稳定支持了Windows.Linux.ARM上的RTSP直播推送功能,配合EasyDarwin开源流媒体服务器,延时基本在1s以内,这个技术方案经过一年多时间, ...

  10. Struts2基本概念

    一.Struts2体系结构 : 1.Web浏览器请求一个资源. 2.过滤器Dispatcher查找方法,确定适当的Action. 3.拦截器自动对请求应用通用功能,如验证和文件上传操作. 4.Acti ...