如何解决 MapReduce 数据倾斜的问题?
前言
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
正文
什么是数据倾斜?
数据倾斜是数据中的常见情况。
数据中不可避免地会出现离群值(outlier),并导致数据倾斜。
这些离群值会显著地拖慢 MapReduce 的执行。
常见的数据倾斜有以下几类
- 数据频率倾斜——某一个区域的数据量要远远大于其他区域。
- 数据大小倾斜——部分记录的大小远远大于平均值。
MapReduce 数据倾斜可能的原因
在 map 端和 reduce 端都有可能发生数据倾斜。
在 map 端的数据倾斜会让多样化的数据集的处理效率更低。
在 reduce 端的数据倾斜常常来源于 MapReduce 的默认分区器。
MapReduce 数据倾斜可能导致的后果
数据倾斜会导致 map 和 reduce 的任务执行时间大为延长,也会让需要缓存数据集的操作消耗更多的内存资源。
如何诊断是否存在数据倾斜
在 reduce 方法中加入记录 map 输出键的详细情况的功能
在发现了倾斜数据的存在之后,就很有必要诊断造成数据倾斜的那些键。
有一个简便方法就是在代码里实现追踪每个键的最大值。为了减少追踪量,可以设置数据量阀值,只追踪那些数据量大于阀值的键,并输出到日志中。实现代码如下
package com.shockang.study.bigdata.mapreduce;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.util.Iterator;public class WordCountReducerWithDataSkew extends Reducer<Text, IntWritable, Text, IntWritable> {public static final String MAX_VALUES = "skew.maxvalues";private int maxValueThreshold;@Overrideprotected void setup(Context context) throws IOException, InterruptedException {Configuration conf = context.getConfiguration();maxValueThreshold = Integer.parseInt(conf.get(MAX_VALUES));}/*key: hellovalue: List(1, 1, ...)*/protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {int i = 0;for (IntWritable value : values) {System.out.println(value);i++;}if (++i > maxValueThreshold) {System.out.println("Received " + i + " values for key " + key);}}
}
运行作业后就可以从日志中判断发生倾斜的键以及倾斜程度
跟踪倾斜数据是了解数据的重要一步,也是设计 MapReduce 作业的重要基础
减缓 Reduce 端数据倾斜的常规手段
- 抽样和范围分区
Hadoop 默认的分区器是基于 map 输出键的哈希值分区。这仅在数据分布比较均匀时比较好。在有数据倾斜时就很有问题。
使用分区器需要首先了解数据的特性。可以通过对原始数据进行抽样得到的结果集来预设分区边界值。范围分区器可以通过预设的分区边界值进行分区。因此它也可以很好地用在矫正数据中的部分键的数据倾斜问题。 - 自定义分区
另一个抽样和范围分区的替代方案是基于输出键的背景知识进行自定义分区。例如,如果map输出键的单词来源于一本书。其中大部分必然是省略词(stopword)。
那么就可以将自定义分区将这部分省略词发送给固定的一部分 reduce 实例。而将其他的都发送给剩余的 reduce 实例。 - Combine
使用 Combine 可以大量地减小数据频率倾斜和数据大小倾斜。在可能的情况下,combine 的目的就是聚合并精简数据。 - Map 端连接和半连接
尽可能在 map 端就进行数据关联,避免进行 Shuffle。 - 数据大小倾斜的自定义策略
- 设置 mapred.linerecordreader.maxlength 来限制 RecordReader 读取的最大长度。RecordReader 在 TextInputFormat 和 KeyValueTextInputFormat 类中使用。默认长度没有上限。
- 通过 org.apache.hadoop.contrib.utils.join 设置缓存的数据集的记录数上限。在 reduce 中默认的缓存记录数上限是 100 条。
- 考虑使用有损数据结构压缩数据,如Bloom过滤器。
如何解决 MapReduce 数据倾斜的问题?相关推荐
- MapReduce 数据倾斜以及解决思路
MapReduce 数据倾斜以及解决思路 1.小背景 在mapreduce的分布式解决框架中,数据处理主要分为2个步骤,map阶段和reduce阶段 map阶段主要是数据转换,也就是按照预期把输入的数 ...
- hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数 ...
- 解决Spark数据倾斜(Data Skew)的 N 种姿势 与 问题定位
Spark性能优化之道--解决Spark数据倾斜(Data Skew)的N种姿势 本文结合实例详细阐明了Spark数据倾斜的问题定位和几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自 ...
- 如何解决mysql数据倾斜_什么是数据倾斜?如何解决数据倾斜?
原标题:什么是数据倾斜?如何解决数据倾斜? 导读 相信很多接触MapReduce的朋友对'数据倾斜'这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么 ...
- MapReduce数据倾斜解决方案——将key打散
wordcount为例 以MR程序的WC为例 如果处理的数据只有四个单词 a b c d a 和 c 出现的次数特别多 (a/c.hashCode%2=1)–>分区 1 多 b 和 d 出现的次 ...
- Spark性能优化--如何解决数据倾斜
1 Data Skew 数据倾斜 1.1 数据倾斜概念 对Hive.Spark.Flink等大数据计算框架来讲,数据量大并不可怕,可怕的是数据倾斜. 数据倾斜是指并行处理的数据集中某一部分的数据显著多 ...
- Spark数据倾斜的完美解决
数据倾斜解决方案 数据倾斜的解决,跟之前讲解的性能调优,有一点异曲同工之妙. 性能调优中最有效最直接最简单的方式就是加资源加并行度,并注意RDD架构(复用同一个RDD,加上cache缓存).相对于前面 ...
- 解决数据倾斜一:RDD执行reduceByKey或则Spark SQL中使用group by语句导致的数据倾斜
一:概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...
- 数据倾斜原理及解决方案
导读 相信很多接触MapReduce的朋友对'数据倾斜'这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念 ...
最新文章
- 微信小程序获取用户收货地址 完整代码
- 4fsk调制matlab_数字调制解调技术的MATLAB与FPGA实现
- 英特尔:5G将释放云的潜力,为垂直行业带来巨大商机
- 模式设计趣解——追MM篇
- GridSearchCV( )参数详情
- python pywinauto 自动控制微信, 关键字回复、收款、定时任务, 代替人工成为微信客服
- Mangos魔兽世界服务端初探(1)--游戏服务端主体结构与消息分发
- cropperjs裁剪头像功能实现总结
- 高数笔记(十四):多元复合函数的求导法则,隐函数的偏导数,多元微分在几何上的应用
- cocos creator后台切入切出
- Linux查看mpp数据库地址,linux下打开.mpp文件(微软project)._操作系统_rainysia的专栏-CSDN博客...
- maxima matlab,为什么大家不用Octave等代替Matlab,Maxima代替Maple?
- C#绘制GPS星空图
- springboot项目接入天猫精灵
- vue及rect面试点(更新中) - 面试篇
- 水花: java特点及配置环境
- iOS 大型项目开发漫谈
- python正则表达式试题,003:Python正则表达式讲解及习题练习
- 介绍胶囊网络 capsule networks
- jade无法导入PDF卡片(Note: PDF index files can be created only by the***)