【博学谷学习记录】超强总结,用心分享 | 数据倾斜

【博学谷IT技术支持】

什么是数据倾斜?

这个概念在百度百科中解释为在分布式缓存的集群中,不同节点负责处理一定范围的缓存数据。如果缓存数据分散度不够,导致大量的缓存数据集中到一台或者几台服务节点上,称为数据倾斜。一般来说数据倾斜是由于负载均衡实施的效果不好引起的。

简单的讲就是单个计算节点的计算量远远大于其他节点,造成该节点计算压力过大,导致计算效率下降或者计算溢出。

hive的数据倾斜

导致的原因

执行SQL语句会被翻译成MapReduce,MapReduce中会存在多个MapTask和ReduceTask,当某个Reduce拿到的数据远远超过其他Reduce时就产生了数据倾斜。

哪些情况容易产生数据倾斜?

  • JON:

    • 在reduce中,一个或者多个分组k2对应的value过多,从而引起数据倾斜
    • 大表与大表jon,但分桶的判断字段0值或者空值多,计算空值的这个reducec就会比较慢
  • group by:

    • group维度过小单独一个值的数量过多
  • Count Distinct

    • 特殊值过多

解决方式

join的处理

解决方式

  • mapJoin: 当前方式需要要注意join的表需要是小表。
  • 当不确定哪些是造成倾斜的kye时:
在执行MR时设置闸阀,动态统计数值,当超过闸阀就将该值踢出去,单独一个MR来处理
set hive.optimize.skewjoin=true;
set hive.skewjoin.key=数值;
  • 提前知道key值
提前在建表时就配置好,在后续运行的时候,会自动设置的k2单独一个MR来处理

set hive.optimize.skewjoin.compiletime=true;
建表
CREATE TABLE list_bucket_single (key STRING, value STRING)
-- 倾斜的字段和需要拆分的key值
SKEWED BY (key) ON (1,5,6)
--  为倾斜值创建子目录单独存放
[STORED AS DIRECTORIES];

group的处理

在计算的过程中一个reduce接收的数据量比另外一个数据量要多的多

通过combiner解决数据倾斜
set hive.map.aggr=true;
set hive.groupby.skewindata=true;

distinct的处理

先通过group by 进行优化,然后在根据需求处理。

什么是mapJoin?

在map端实现文件合并 重写 setup和map方法 没有reduce。 一般用于小表join大表,小表全部加载到内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map端是进行了join操作,省去了reduce 运行的时间。setup方法会在map方法执行之前先执行,而且只会执行一次,主要用来做初始化工作。

combiner?

规约属于shuffle阶段,是MR的优化手段,提前对Map的数据进行聚合,减少map和reduce端网络传输的数据量。

posted @ 2023-06-01 09:58  牛牛牛牛牛牛牛牛  阅读(11)  评论(0编辑  收藏  举报