Jim*_*ski 7 java hadoop partitioning mapreduce partitioner
我正在使用Hadoop来分析非常不均匀的数据分布.有些键有数千个值,但大多数只有一个.例如,与IP地址相关联的网络流量将具有与少量健谈IP相关联的许多分组以及具有大多数IP的少数分组.另一种说法是基尼指数非常高.
为了有效地处理这个问题,每个减速器应该获得一些高音量键或许多低音量键,以便获得大致均匀的负载.我知道如果我正在编写分区进程,我将如何执行此操作:我将获取keys由映射器生成的排序列表(包括所有重复键)以及减少器的数量N和放置拆分
split[i] = keys[floor(i*len(keys)/N)]
Run Code Online (Sandbox Code Playgroud)
减速i会得到键k,以便split[i] <= k < split[i+1]为0 <= i < N-1与split[i] <= k对i == N-1.
我愿意用Java编写自己的分区器,但Partitioner <KEY,VALUE>类似乎一次只能访问一个键值记录,而不是整个列表.我知道Hadoop会对映射器生成的记录进行排序,因此该列表必须存在于某处.它可能分布在几个分区节点之间,在这种情况下,我会在其中一个子列表上执行拆分过程,并以某种方式将结果传递给所有其他分区节点.(假设所选分区器节点看到一个随机化子集,结果仍然是近似负载平衡的.) 有没有人知道存储密钥的排序列表的位置,以及如何访问它?
我不想写两个map-reduce作业,一个用于查找拆分,另一个用于实际使用它们,因为这看起来很浪费.(地图制作者必须做两次同样的工作.)这似乎是一个普遍的问题:不均匀的分布很常见.
据我所知,MR 处理中没有一个地方存在所有密钥。不仅如此 - 无法保证单台机器可以存储这些数据。我认为这个问题在目前的MR框架中并没有理想的解决方案。我认为是这样,因为要拥有理想的解决方案 - 我们必须等待最后一个映射器的结束,然后才能分析密钥分布并利用这些知识对分区器进行参数化。
这种方法将使系统显着复杂化并增加延迟。
我认为好的近似可能是对数据进行随机采样以获得密钥分布的想法,然后使分区器根据它来工作。
据我了解,Terasort 实现正在做一些非常相似的事情: http: //sortbenchmark.org/YahooHadoop.pdf