Hive数仓-数据倾斜优化

2022-05-15  本文已影响0人  Eqo

背景现象

原因

image.png

通用解决方案

在hive中的场景

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

-- 解决方案

  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)进行处理,保证相同的分布到一起,最终聚合得到结果.

Hive默认启动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相比其余两种格式具有较明显的优势

上一篇 下一篇

猜你喜欢

热点阅读