亿万级数据规模下倾斜调优

9 篇文章 0 订阅
8 篇文章 0 订阅

本文摘录自 腾讯OMG广告平台产品技术黑板报 王浙明  
  数据倾斜是海量数据处理的一个常见而又棘手的问题,如果在大的数据处理过程中出现了数据倾斜,会大大造成了资源的浪费和降低了效率,而有时候数据倾斜又是隐性,往往没有对数据进行分析就进行处理的话很容易掉入数据倾斜的陷阱里。
  那么什么是数据倾斜,我们简单去概述一下。比如说在某个数据处理的过程中,有1000个task去执行,而998个task在5分钟执行完成,而还有2个在半小时以后才执行完毕,那么,这2个task中处理的数据就远高于其他task,这就是数据倾斜显式的表现。如果我们通过HadoopSpark中监控页查看到task执行时间的情况,就能发现这个问题。

造成数据倾斜的原因:

Map端:
  在MR中数据倾斜大部分出现在reduce中,但是map中同样会出现数据倾斜。大家都知道MR是属于分布式计算的,但是如果处理的文件中有一个文件是不支持切片(也就是不支持splittable),换句话说就是该文件不支持被多个map同时读取,那么分布式计算就很难进行。
那么让我们认识一下不能被splittable支持的文件格式:
在这里插入图片描述
Reduce端:
  在前面的文章已经讲过shuffle的过程,那么在进行shuffle的操作是,各个节点reducetask节点上相同的key通过shuffle将抓取的key放到某个reducetask处理,那么这就是关键的一点,如果某一个key值是其他key值的很多很多倍,这样这些数据就会到一个task上去处理,这个reducetask的任务量就会使其他reducetask任务量的很多很多倍,这样就造成了数据倾斜,而作业的总的时间使根据最后一个task完成任务而决定的,所以,就拖长了整个任务完成的时间
 在这里插入图片描述
那么下面我们就讲一下怎么去解决数据倾斜的问题

Reduce任务数据倾斜的解决方案:

GroupBy算子的倾斜:
  GroupBy算子的倾斜本质解决方法:两阶段聚合。
  第一阶段:修改聚合key进行局部的聚合
将GroupBy(key)转换为GroupBy(key,randomNum),randomNum是一个随机数,这个随机数的范围设置为(0,n),n是由数据倾斜的程度来定的,也就是说,如果数据倾斜的比较严重,那么n的值就会相应的变大,这样分到不同的reduce中就越散布。
完成局部聚合一致,阶段1的输出格式为(key,aggreate)
  第二阶段:按照原始key进行全局聚合
  可以看出,经过第一阶段,第二阶段相同key值已经可以平均散布在不同的reduce进行处理,此时再执行GorupBy(key)就可以顺利完成了。
  在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值