在我的Hadoop项目中,我正在阅读每行的多个名称的文本行文件。第一个名称代表我的用户名,其余的是朋友列表。 然后我在map函数中创建(用户名,朋友)对,每对都有一个键“Key [name1] [name2]”,其中name1,2是用户名,朋友名字按字母顺序排序。 通常,在读取userA的行和userB的行之后,他们都在他们的朋友列表中互相拥有,我会得到2个具有不同值的identic键,在这种情况下是:KeyUserAUserB:“UserA,UserB”和KeyUserAUserB: “用户B,用户A”。 我期望在reduce函数中,将KeyUserAUserB作为一个键,将一对“UserA,UserB”,“UserB,UserA”作为值。所以值迭代器将有2个元素。 但是,在reducer函数中,我得到两次KeyUserAUserB和一个值。这不是我对Hadoop的期待......
我还注意到在我的用户日志中,我有4个“m”文件夹,在前两个文件夹中,我有日志帮助我识别上述内容。在两个“m”日志中,map函数的输出(System.out)与reduce函数的输出交织在一起。我不知道这是否与我的异常有关,但我希望减少输出保留在“r”文件夹中。 另外,对于上面的例子,KeyUserAUserB的一个日志打印在一个“m”日志文件中,另一个KeyUserAUserB打印在另一个中......虽然在某些情况下,KeyUserAUserB会发送到两个值的reducer,我发现至少有一种情况,它从来没有两个值(以及那些具有相同密钥的2对键值驻留在不同的“m”日志文件中)。
我注意到另一件事,Reduce函数的输出收集不会直接将值发送到输出文件,而是再次传递它们作为同一Reduce函数的输入......
您如何看待这种行为,可能的原因是什么?
答案 0 :(得分:0)
最后。整个意想不到的行为是因为我使用的是组合器类= reducer类。在评论该行后,一切都按预期工作。