所以我有两个制图器和一个缩小器。从第一个Map器输出的键的形式是“interest1::user”,带有一些值。虽然从第二个Map器输出的键的形式是“interest2::interest”,这里interest1和interest2是变量,“user”和“interest”是字符串文本。我使用的是一个分区器,它将键从“:”上的Map器中拆分,并且只考虑第一次拆分来散列和确定缩减器。
现在从reducer的Angular 来看,它将看到按排序顺序排列的键,这意味着“interest1::interest”将按字母顺序排在“interest1::user”之前。reducer逻辑要求这些键值对由同一reduce任务处理。我使用静态变量来存储所有的兴趣,然后在收集完所有的用户之后输出这些兴趣。
让我们看一个例子。mapper1输出如下
k1::interest -> val1
k2::interest -> val2
k1::interest -> val3
mapper2输出如下:
k2::user -> val5
k2::user -> val8
k1::user -> val9
现在,在通过分区器之后,reducer将看到以下记录。
k1::interest -> val1
k1::interest -> val3
k1::user -> val9
k2::interest -> val2
k2::user -> val5
k2::user -> val8
现在,我的reducer逻辑要求所有带有k1的键值paris都应该转到同一个任务。而带有k2的键值对可以转到另一个任务。hadoop是在同一个分区中启动多个任务,还是可以安全地说每个分区只启动一个任务。在多个任务的情况下,我是否需要担心减速机的输入会导致不均匀的分割。
k1::interest -> val1
k1::interest -> val3
将被一项任务所束缚。
k1::user -> val9
k2::interest -> val2
将由另一个任务处理
k2::user -> val5
k2::user -> val8
将被另一项任务所鼓舞。
我必须在这里使用分组比较器吗?我不需要对值进行排序,只需要将具有特定前缀的键值对最终由同一个任务或同一个输入组中reduce函数的串行调用来处理。
暂无答案!
目前还没有任何答案,快来回答吧!