distribute by rand的风险:
distribute by rand这样的使用场景,使用不带随机种子的函数,在mapreduce框架下这种使用方式存在一定风险,可能导致部分数据丢失或者重复;
具体原理如下:
部分reduce shuffle失败导致上游个别map task重新生成数据,如果shuffle分片逻辑包含随机因子,会导致新生成的数据shuffle分片与之前不完全一致,进而导致部分数据重复读取或者数据丢失
reduce task从每个map task的结果文件中拉取对应分区的数据。数据在map阶段已经是分好区了,并且会有一个额外的索引文件记录每个分区的起始偏移量。所以reducetask取数的时候直接根据偏移量去拉取数据。
新生成的shuffle分片内数据会漏数据也会包含分发到其他reducer的数据。
重要!!!建议使用rand(int seed)设置随机种子
distribute by pmod(hash(1000*rand(1)), 80)
pmod(hash(1000*rand(1)), 80)是个稳定的随机数序列而不是固定的数值,从table列的角度来说,每一列都是不一样,所以会重分区到80个,而不是1个。
原文:https://zhuanlan.zhihu.com/p/252776975