我有一个hadoop MapReduce程序,它不均匀地分配密钥。 一些减速器最终有两个键,一些有一个键,有些没有。 如何强制hadoop将具有某个键的每个分区分配给单独的reducer。我有九个独特的表格形式:
0,0
0,1
0,2
1,0
1,1
1,2
2,0
2,1
2,2
我设置了job.setNumReduceTasks(9); 但是hashpartitioner似乎将两个键哈希到同一个哈希码,导致重叠键被发送到同一个reducer并使一些reducer空闲。
随机分区程序是否解决此问题?它会将每个唯一键发送给随机减速器,保证每个减速器都能收到一个键。如何启用它并替换默认值?
编辑:
有人可以解释为什么我的输出看起来像
-rw-r--r-- 1 user supergroup 0 2018-04-19 18:58 outbin9/_SUCCESS
drwxr-xr-x - user supergroup 0 2018-04-19 18:57 outbin9/_logs
-rw-r--r-- 1 user supergroup 869 2018-04-19 18:57 outbin9/part-r-00000
-rw-r--r-- 1 user supergroup 1562 2018-04-19 18:57 outbin9/part-r-00001
-rw-r--r-- 1 user supergroup 913 2018-04-19 18:58 outbin9/part-r-00002
-rw-r--r-- 1 user supergroup 1771 2018-04-19 18:58 outbin9/part-r-00003
-rw-r--r-- 1 user supergroup 979 2018-04-19 18:58 outbin9/part-r-00004
-rw-r--r-- 1 user supergroup 880 2018-04-19 18:58 outbin9/part-r-00005
-rw-r--r-- 1 user supergroup 0 2018-04-19 18:58 outbin9/part-r-00006
-rw-r--r-- 1 user supergroup 0 2018-04-19 18:58 outbin9/part-r-00007
-rw-r--r-- 1 user supergroup 726 2018-04-19 18:58 outbin9/part-r-00008
较大的组-r-00001和part-r-00003分别获得了密钥1,0和2,2 / 0,0和1,2。请注意,部分-r-00006和部分-r-00007是空的。
答案 0 :(得分:0)
HashPartitioner
是Hadoop中的默认分区程序,它为每个唯一的“密钥”创建一个Reduce任务。只需调用reduce函数,所有具有相同键的值将转到reducer的同一实例。
如果用户有兴趣将特定结果组存储在不同的reducer中,则用户可以编写自己的分区器实现。它可以是通用的,也可以是您希望在用户应用程序中使用的特定数据类型或值。
Custom Partitioner
是一个允许您根据用户条件将结果存储在不同Reducer中的过程。通过按键将分区设置为分区,我们可以保证,同一个键的记录将转到同一个reducer。分区程序确保只有一个reducer接收该特定键的所有记录。