刚刚开始写hadoop,乔布斯先生。希望我们能很快切换到spark,但我们现在只能做mr了。
我想将记录按其值的散列进行分组。但我想用一些完全不相关的东西对它们进行排序——它们值中的时间戳。我不知道怎样才能做到最好。我看到两种选择:
1) 首先有一个mr作业,它为Map器中的每个值计算散列,然后将该散列的所有记录按它所希望的方式减少到相同的值(实际上,我现在有这么多工作,就像我们现在需要的那样)。然后链接第二个mr作业,该作业根据值中的时间戳对上述reducer的输出进行重新排序。效率低下?
2) 我读过一些关于如何使用复合键的博客/帖子,所以也许我可以一步完成这一切?我会创建某种复合键,它既有用于分组的哈希,也有用于在Map器中排序的时间戳。但我不清楚这是否可能。如果排序与分组完全无关,它还能正确分组吗?也不确定我需要实现什么接口,需要创建什么类,或者如何配置它。
我不是说第二种。我不关心迭代器中每个reduce调用的对象顺序。我关心的是从reducer中发出东西的顺序,需要按时间戳进行全局排序。
这样做的推荐方法是什么?
1条答案
按热度按时间rekjcdws1#
如果在reduce之前有一个封装分组和排序属性的复合键,那么这是绝对可能的。
假设您需要一个包含int哈希代码和长时间戳的密钥。然后需要实现一个可写元组(比如intlongpair),在这里可以定义用例所需的各种比较器和分区器。
所以您将您的工作设置为这样(稍后我将返回到可能的intlongpair实现):
我
以下是您可以使用的intlongpair: