MapReduce 数据倾斜以及解决思路

MapReduce 数据倾斜以及解决思路

1.小背景

  1. 在mapreduce的分布式解决框架中,数据处理主要分为2个步骤,map阶段和reduce阶段
  2. map阶段主要是数据转换,也就是按照预期把输入的数据进行转换,变为中间数据
  3. 中间数据再分发给reduce阶段作为输入数据源进行处理。
  4. 在这个过程中,由于数据本身按照设计的key规则划分时就不均匀,再加上使用默认的分区规则进行对key进行计算时,也有产生数据倾斜的可能(key.hashcode() % numberOfReduceTasks)

2.大背景

  1. 为了解决传统计算机处理数据受限于单台计算机性能上限的问题,新的数据处理思路,分布式计算被提出来。
  2. 单台计算机处理,提升处理效率主要就是从硬件和软件上提升。硬件提升如单CPU多核心、多CPU多核心、内存容量增加例如部分服务器主板可以加内存到521GB甚至1TB、硬盘改为高速硬盘甚至固态硬盘,硬盘Raid技术等等。
  3. 分布式计算则换一种思路,打破单台计算机处理性能上限的问题。程序=数据+逻辑(算法/代码),如果能够让数据做切分,让代码也做切分,让后把切分后的数据和代码同时让多台计算机处理,这样就可以做到以往一台计算机需要处理十小时的任务,使用100台计算机可能几分钟就出结果的效果。
  4. 但分布式计算有一个大前提,需要针对分布式计算的特点,对程序要处理的数据和程序执行代码做处理,方便让程序和数据分发到计算机集群中进行并行执行。

3.MapReduce简介

  1. Hadoop的mapreduce处理框架,结合hadoop自带的hdfs,就可以做到数据分布式存储,程序分布式计算的目标。
  2. mapreduce是一种编程框架,也可以看作是一种编程思路。就是把问题分成2个大的步骤,第一步,map阶段,就是把输入数据进行转换。转换后的数据称之为中间数据。第二步,reduce阶段,就是把map阶段产生的中间数据进行聚合处理,最后得出结果。
  3. 这里面有几个关键点,hdfs可以把数据进行分布式存储,例如一个200MB文件,默认就会分为0–128MB,128MB–200MB 2个数据块存储到hdfs文件系统中。每个数据块会有3个备份来保证数据安全性。这样就隐形带来一个好处,数据被切块了。
  4. map task处理任务,如果能够让集群中计算机分别处理一个文件的不同数据块,这样就可做到集群分布式并行计算。hdfs已经做到让数据分布式存储。剩下的就是怎样让程序分别处理不同的数据块。
  5. 其实很简单,就是安排一个协调者,指定某台计算机就只处理分布式文件系统中的某一块数据即可。
  6. map task阶段结束后,也会产生中间结果数据,这个数据没错,也是会存到分布式文件系统中的。这时候执行reduce task的计算机,也一样,处理对应数据块的数据即可。最后进行结果汇总就是最后的结果。

4.数据倾斜

  1. 简单示意图如下:
    在这里插入图片描述
  2. 如图所示,数据倾斜主要就是在中间数据阶段,由于对数据分区处理不均匀,导致有些文件中数据量会非常大,有些文件数据量会少很多。这样一来,后续进行reduce task的计算机节点的任务量就会有很大差异。旱涝不同,雨露不均。

5.解决思路

  1. 加内存和提升CPU性能,数据倾斜导致最明显一个问题就是个别或者部分计算机节点数据量处理过大,导致整体处理速度变慢。提升集群中计算机硬件水平,可以缓解这个问题,就是比较费钱。。。
  2. 提升并行度,可以看到,我们如果让中间数据文件数量增多,这样数据就会分不到更多文件,对于单个文件数据量过大问题就能得到较好缓解。hadoop中的中间文件数量默认和reduce task数量一致,所以增加reduce task数量可以缓解数据倾斜问题。不过增加并行度其实也受限于集群中计算机节点数量,除非愿意增加计算机物理节点数,这又回到费钱的方式上
  3. 既然数据倾斜是由中间数据分区导致的,那就干脆不执行reduce阶段,直接把数据输出到文件中,这样就不需要进行中间的数据分区操作。实际业务场景就是,启动一个mapreduce,但只是利用map阶段针对数据做清洗和转换。
  4. 既然中间文件数量受限于reduce task任务数,如果设置为1,文件就一个,也不存在数据倾斜问题,数据都写入到一个文件中去了。但这样不符合分布式计算的准则,会极大降低处理效率。
  5. 既然分区是由针对key的处理而产生的,我让key变得均匀散布,也就是把key打散。常见操作就是加一个随机数前缀或者后缀,这样一来,以往相同的key,由于新增了随机数前后缀,变得不一样,中间数据分区时,自然而然就会分到不同文件中去,数据倾斜就被很大缓解了。不过带来另外一个问题,需要对key打散后reduce聚合后数据再做一次mapreduce操作来得到最后数据。这时候可能还会有数据倾斜,但由于已经聚合过一次,数据量会降低很多,数据倾斜也会由较大缓解。
  6. 自定义shuffle分区算法,也就是换一种算法。既然默认的分区算法有问题,那我换一个算法来对数据分区即可。生活中类比来看就是,如果某方面大家都一样,那我就换一个标准和角度来重新划分,一定可以把物品相对均匀的分成相同多份。

6.代码演示

6.1输入数据源:

a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 
a b a b a c hu jn jgh op a a a a b  c c c c a a a a a a a c c c c c c c c c c c a a a a 

6.2不做key打散的mapreduce代码

  1. 代码
package com.doit.hadoop.skew;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

import java.io.IOException;

/**
 * @author hulc
 * @slogan: just do it
 * @date 2020/8/20 22:48
 */

public class DataSkewDriver {
   
    public static void main(String[] args) {
   

        // 配置文件
        Configuration conf = new Configuration();
        conf.set("mapreduce.framework.name", "local")
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MapReduce数据倾斜是指在MapReduce任务中,某些Map任务处理的数据量远远超过其他Map任务,导致整个任务的效率降低。数据倾斜问题是MapReduce中常见的性能瓶颈之一。以下是解决MapReduce数据倾斜问题的几种方法: 1. 均匀划分数据:在MapReduce任务中,数据均匀划分是防止数据倾斜的最有效的方法之一。可以通过对数据进行采样,来确定数据均匀划分的划分点。 2. Combiner函数:Combiner函数可以在Map阶段对数据进行合并处理,减少Map输出数据量,从而降低Reduce任务的负担。可以在Combiner函数中对于一些key进行合并处理,减少数据倾斜。 3. 调整Reduce任务数量:当Reduce任务的数量过少时,会导致某些Reduce任务的数据处理量过大,从而产生数据倾斜。可以通过增加Reduce任务的数量来解决这个问题。 4. 增加Map任务数量:增加Map任务的数量,可以将数据均匀地分散到更多的Map任务中去,从而减少数据倾斜。 5. 动态调整Map任务输入数据:可以根据Map任务处理的数据量来动态调整数据的输入,将处理量较大的数据均匀分散到多个Map任务中。可以通过自定义InputFormat来实现这个功能。 6. 使用随机数进行分桶:将数据随机分配到多个桶中,通过增加桶的数量来增加Map任务的数量,从而将数据均匀分散到多个Map任务中。这个方法需要保证随机数分配的均匀性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值