MapReducer中数据倾斜,将key设置为随机数的问题

本文探讨了MapReduce中mapper阶段输出三个值的原因,重点解释了首个key在数据分布中的关键作用,及其如何通过随机值结合用户标识实现数据在reducer节点间的均匀分布。文章深入分析了数据倾斜问题,提出了通过定制Partitioner和使用Combiner优化数据处理速度的方法。

问题:为什么在mapper.py阶段输出是三个值,而在reducer阶段却只prink后面的两个值跳过第一个值key了?这第一个key其的作用是什么?能不能用第二个值作为第一个值中key的值?

理解:mapper阶段的第一个key是用来分数据的,第一个key的值,设置为了random组成的(由定义了设置了的key = str(randint(0, 10000)) + '@' + str(self.data[self._fcode_did_hash])组成,),(此处实际的reducer节点设置数为1200个),就是想尽可能随机的均匀分到不同的reducer节点服务器上去。如果key选的不好的话,就容易分的不均匀。比如第一个key如果不是现在的random+did而是用用第二个key的值cremod的话,cremod,这里值只有7个,如果你reducer服务器选了100台,那不就有93台是空的,上面没有数据嘛。这里random的值设置的大小,应该比要设置的服务器的节点数量要大。

就是这个key的值除以节点服务器的数量,key哈希散列之后,除以1200能尽量均匀就好。  后面加一个关于用户的str的,目的是为了分的更散,有些用户行为多,有些用户少,他不是还是会出现那种不均匀的问题吗?后面加这个str他就是为了让这个数据更散一点,就是有一大长串的不同的str,他不就更散了。对这个key的量的话数量的情况就会更大了,所以他这个思想就是用既用random又用dId还写两个并在一起,他不就更随机了,就更散了。

大数据处理怎么提速,一机器多,而是要数据分布比较均匀,数据分布如果不均匀其实后面就没有啥意义了,因为你处理的瓶颈就容易出在数据分布更多的机器上了。

 

在map输出写到缓冲区之前,会进行一个partition操作,即分区操作。MapReduce提供Partitioner接口,它的作用就是根据key或value及reduce的数量来决定当前的这对输出数据最终应该交由哪个reduce task处理。默认对key hash后再以reduce task数量取模。默认的取模方式只是为了平均reduce的处理能力,如果用户自己对Partitioner有需求,可以订制并设置到job上。

待全部的mapper输出均写到磁盘后,map会把这多个临时文件合并,即做merge操作,注意,这里的merge操作只是简单的合并,如果没有在该处设置Combiner,是不会对相同key进行压缩的,所以可能会有相同的key出现。merge操作就是对于同样的key,其value变为list,把多个value放在list中。这种key/value的形式就是reduce的输入数据格式。因此因尽可能的让各个key对应的数据value数据量都差不多大,这样在recducer阶段对,value_lise进行操作时,各个reducer的响应时间不会差别太大,使负载均衡。

 

相关的数据倾斜问题:相同的key是会发到同一个reduce处理。如果相同的key对应的value量级太大确实会导致这个reduce很慢。如果其他的reduce要处理的数据相对较少,就会出现数据倾斜。数据倾斜一般是指某一个partitioner的处理的数据量远大于其他的partitioner,这个在分布式系统中很常见。一般有两种原因:(1)partition算法不够随机,这种情况比较少见,换相对随机的算法就可以。(2)某个key对应的数据非常多,而这个key对应的数据又必须发送到同一个partitioner进行处理。

对于第二种数据倾斜没有一个统一的处理方式,要看具体问题。一般常见的方式可以将key加一个随机扰动量,使得量大的这个key均匀分到不同的reduce中去处理。再起一轮mapreduce处理这次的结果,将key的扰动量去掉,去统计结果。因为第一步reduce处理将key对应的结果大大减少了(题主这个case每个reduce一个key只输出一条记录),所以到第二轮mapreduce这个key对应的数据就很少了。

 

参考:https://www.zhihu.com/question/32054214/answer/148946794

https://blog.youkuaiyun.com/mm_bit/article/details/49736007

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值