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

被折叠的 条评论
为什么被折叠?



