我是hadoop的新手。目前还不清楚为什么我们在使用hadoopmapreduce时需要能够按键排序?在映射阶段之后,我们需要将对应于每个唯一密钥的数据分发给一些减少器。这可以在不需要分类的情况下完成?
它就在那里,因为排序是对键进行分组的一个巧妙技巧。当然,如果你的工作或算法不需要任何密钥顺序,那么你会更快地通过一些哈希技巧进行分组。
在Hadoop本身,多年来就已经有一个JIRA申请了(来源)。Hadoop之上的其他几个发行版已经具备了这些功能,例如Hanborq(他们称之为排序避免)。(来源)
对于你的实际问题(为什么),MapReduce本质上是一篇来自谷歌的论文(来源),其中陈述了以下内容:
我们保证在给定的分区中,中间键/值以递增的密钥顺序处理对。此订购保证使按分区生成排序输出文件变得容易,当输出文件格式需要支持高效随机时有用按键访问查找,或者输出的用户觉得很方便对数据进行排序
因此,支持sort更为方便,而不是本质上只允许sort对键进行分组。
如果我们考虑到hadoop DISTRIBUTES通过向不同的机器发送不同的密钥来为您进行处理,那么"按密钥排序"就最好理解了。这个想法的基本(简化)版本是:
The reducer which a (k,v) pair is sent to = k.hashCode()%num_of_machines.
因此,例如,如果我的密钥的哈希码是10,并且我有2台机器,那么密钥将被发送到机器#0。
因此,密钥将(首先)为我们提供一种分配计算的简单方法。
除了简化计算分布之外,键还为我们提供了一种将不同数据文件中的记录连接到单个集群中的方法。例如,这就是我们可以做word_count之类的事情的方法。
事实上,如果你发现你不需要密钥——你可能也不需要hadoop!
经典示例(字数):
在hadoop"单词计数"示例中,我们发出带有值的键(一个键=一个单词)(该单词在一段文本中出现的次数)。这允许SINGLE reduce函数接收一个SINGLE单词,从而添加它被看到的所有时间,从而创建准确的单词计数。
因此,密钥的聚合使"映射"阶段能够独立地分布在多台机器上。如果不将密钥聚合到同一个reducer,在单词计数示例中,我们可能会为给定的单词获得多个单词计数,因为不存在单个reducer会从所有文件接收所有单词计数的假设。
另一个例子:
现在。。。假设我们有社会安全号码作为id,并且我们想要输出个人数据的集合。假设我们有两个巨大的文件。
ssn->名称
ssn->鞋尺寸
在这种情况下,我们可以利用密钥分组的功能,这样个人姓名和鞋码都会发送到相同的reduce函数。
减速器(2)将在此处接收2条记录:
ssn->名称,鞋大小
这里的想法是,在编写map/reduce作业时,必须对输出的"元组"进行编码,以便在reduce阶段以有意义的方式将它们连接在一起。在某个时刻,任何分布式计算环境都可能需要组合在不同节点中计算的记录。密钥为我们提供了一种方便且可扩展的方法。
因此,事实上,我们被告知SAME密钥指向SAME reducer函数,这证实了这个特定社会安全号码的每个reducer将接收与该号码相关的所有数据,使我们能够连接和输出数据记录,包括ssn、姓名和鞋码。
结论
如果不按密钥分发,以这种方式连接数据将需要涉及某种中间数据存储/缓存的复杂逻辑。Hadoop简单地概括和抽象了通过使用熟悉的pardigm(键和值)"连接"并行计算的数据结果的常见需求。