所以我有两个Mappers和一个Reducer。从第一个映射器输出的密钥的形式为" interest1 :: user"有一些价值。从第二个映射器输出的键的形式为" interest2 :: interest"这里 interest1 和 interest2 是变量,而" user"和"兴趣"是字符串文字。我正在使用一个分区器,它将键分配给#34; ::"并且只考虑第一次拆分以进行散列并确定减速器。
现在从缩减器的角度来看,它将按排序顺序看到键,这意味着" 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函数的串行调用处理。