美文网首页
Hive数仓-数据倾斜优化

Hive数仓-数据倾斜优化

作者: Eqo | 来源:发表于2022-05-15 19:54 被阅读0次

背景现象

  • 数据倾斜的现象是,当提交运行一个程序时,这个程序的大多数的Task都已经运行结束了,只有某一个Task一直在运行,迟迟不能结束,导致整体的进度卡在99%或者100%,这时候就可以判定程序出现了数据倾斜的问题。
  • 当你提交一个MR程序的时候,在yarn上发现程序运行时间过长,且迟迟没有结束,而且日志没有报错,这时候就可以判定是数据倾斜问题.

原因

image.png
  • 数据本身就不平均
  • 分区规则不科学
  • 业务影响 造成数据短期高频波动

通用解决方案

  • 1、有钱 有预警
    增加物理资源 单独处理倾斜的数据
  • 2、没钱 没有预警
    倾斜数据打散 分步执行
    先将倾斜数据打散成多干份
    处理的结果再最终合并

在hive中的场景

首先倾斜一般发生在reduce阶段

  • 场景一:group by 、count(distinct)

-- 解决方案

  1. map端预聚合
    hive.map.aggr=true; map端预聚合.(治标)
    原理 提前在map端预聚合一部分数据,减少shuffle数量和reduce阶段的执行时间,避免每个task数据过大导致倾斜.(万一数据不能预聚合或者聚合后仍然数据量较大)
  1. 随机分区
    select * from table distribute by rand();(治标)
    原理:通过distribute by rand()设置底层根据随机的key 进行分区分组等,通过随机函数 实现随机分区,避免数据倾斜.
  1. 数据倾斜时自动负载均衡(hive自带功能)
    hive.groupby.skewindata=true;
    原理:
    a,开启该参数以后,当前程序会自动通过两个MapReduce来运行
    b,第一个MapReduce自动进行随机分布到Reducer中,每个Reducer做部分聚合操作,输出结果.(相当于把大的数据打散)
    c,第二个MapReduce将上一步聚合的结果再按照业务(group by key)进行处理,保证相同的分布到一起,最终聚合得到结果.
  • 场景二:join

Hive默认启动Map join 优化

  • join操作时,如果两张表比较大无法实现Map join,只能走Reduce join,当关联两表中某一字段的值过多时,仍会导致数据倾斜问题
  • 倾斜是在reduce 阶段发生的,尽量不走reduce join ,优先使用Mapjoin(只要是join我就转换成Map join)
    解决方案

1.提前过滤,将大数据转成小数据,实现map join , 适用于大表join小表
:将数据根据条件进行一部分筛选,筛选出的结果很可能就是小表
Mapjoin 原理:将小表数据 放在每个大表task任务的执行主机的内存当中

  1. 使用Bucket join 桶表join
    原理:如果方案一筛选后仍是大表,就可以对表分桶, 实现Bucket map join 避免数据倾斜
  2. 使用Skew join (外连接不生效)
    Skew Join是Hive中一种专门为了避免数据倾斜而设计的特殊的Join过程
    原理 数据量多的 走map join 数据量小的 继续reduce join

使用:
开启运行过程中skewjoin
set hive.optimize.skewjoin=true;
如果这个key的出现的次数超过这个范围
set hive.skewjoin.key=100000;
在编译时判断是否会产生数据倾斜
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.union.remove=true;
如果Hive的底层走的是MapReduce,必须开启这个属性,才能实现不合并
set mapreduce.input.fileinputformat.input.dir.recursive=true;

  • skew join原理:


    image.png

    1.当A表joinB表时产生了一部分数据量比较大的数据,[a-k1,b-k1],另一部分数据量正常[a-k,b-k2]的继续走rduce处理
    2,Hive 将数据量比较大数据写到HDFS当中
    3,单独运行一个MR程序来计算这部分数据这部分数据
    4.hive再根据其他优化进行map端joun,产生结果,最终和其他结果进行合并合成一个最终结果

当前正在运行的hive任务已经数据倾斜,该如何处理?

如果是查询的语句列如(group, join)可以直接在yarn kill掉
如果是 insert ,,, select 就要权衡 等他跑完

结束后 对sql语句发生数据倾斜的地方进行定位、给出解决方案、测试、变更

如何提前预防数据倾斜

可以要对进行join 或者group by 的字段采样
列如 订单表1000w条数据 商品表100w条数据
a.pid = b.pid

select pid ,count(*) from tb_order group by pid;
查看一下订单表中 商品key的个数
列如商品1 900w条 那么这个数据一定会发生数据倾斜

TextFile、SequenceFile、RCfile 、ORCfile各有什么区别

textfile 文本文件 hdfs 默认存储
SequenceFile 二进制文件 使用二进制字节码存储 存储方式为行存储,其具有使用方便、可分割、
可压缩的特点
RCfile 、
ORCfile 列式存储
行式存储 方便插入 列式存储 方便查询
:相比TEXTFILE和SEQUENCEFILE,RCFILE由于列式存储方式,数据加载时性能消耗较大,但是具有较好
的压缩比和查询响应。
数据仓库的特点是一次写入、多次读取,因此,整体来看,RCFILE相比其余两种格式具有较明显的优势

相关文章

  • Hive数仓-数据倾斜优化

    背景现象 数据倾斜的现象是,当提交运行一个程序时,这个程序的大多数的Task都已经运行结束了,只有某一个Task一...

  • Hive优化

    Hive数据倾斜优化总结 Hive数据倾斜优化分为配置优化和SQL优化 优先原则: 数据不怕多,避免倾斜。 减少J...

  • Hive优化

    Hive HQL优化 Hive优化目标在有限的资源下,执行效率更高 常见问题数据倾斜map数设置reduce数设置...

  • hive 优化-1

    join优化-数据倾斜hive.optimize.skewjoin=true; 【TODO 细节】数据倾斜时启动两...

  • hive 数据倾斜优化

    在一个大表关联小表中遇到数据倾斜的问题,优化方法如下 mapjoin 类似写MR时,将小数据直接放入map缓存,通...

  • Hive优化实践1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关。 Hive的优化分为join相关的优化和join无关的优...

  • 坑合集

    Flume flume细节 Hive 数据倾斜Hive优化 Hive分区表新增字段为null的bug及解决方法 S...

  • 数仓--Hive--面试题准备

    数仓--Hive-面试之Hive与HBase的区别数仓--Hive-面试之Hive架构原理数仓--Hive-面试之...

  • 数据中台和数仓的关系

    传统数仓 传统数仓有几个特点: 数据具有历史性 基于文件存储 以表为形态,自带元数据存储(比如Hive) 在数仓的...

  • Hive的数据倾斜优化

    1.Skew Join When working with data that has a highly unev...

网友评论

      本文标题:Hive数仓-数据倾斜优化

      本文链接:https://www.haomeiwen.com/subject/pheburtx.html