我是新来的hadoop。目前尚不清楚为什么我们需要能够在使用hadoop mapreduce时按键排序?在映射阶段之后,我们需要将对应于每个唯一键的数据分发到一些数量的reducer。这可以在不需要对其进行排序的情况下完成吗?
答案 0 :(得分:14)
它就在那里,因为排序是分组键的巧妙技巧。当然,如果你的工作或算法不需要你的任何键盘顺序,那么你可以更快地通过一些散列技巧进行分组。
在Hadoop本身,已有多年的JIRA申请(source)。 在Hadoop之上的其他几个发行版已经具备了这些功能,例如Hanborq(他们称之为避免排序)。 (source)
对于您的实际问题(为什么),MapReduce本来就是Google的一篇论文(source),其中说明了以下内容:
我们保证在给定分区内,中间键/值 以增加的键顺序处理对。这种订购保证 可以轻松地为每个分区生成一个已排序的输出文件,就是这样 当输出文件格式需要支持高效随机时很有用 按键访问查找,或输出的用户发现它很方便 将数据排序。
因此,支持排序更方便,但不是本身只允许对组进行排序。
答案 1 :(得分:1)
如果我们通过向不同的计算机发送不同的密钥来考虑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,我们希望输出个人数据的汇总。假设我们有2个大文件。
ssn->名称
ssn-> shoe_size
在这种情况下,我们可以利用密钥分组的功能,以便将个人姓名和鞋子大小同时发送到SAME减少功能。
reducer(2)将在此处收到2条记录:
ssn->名称,shoe_size
这里的想法是,在编写map / reduce作业时,你必须对你的“元组”进行编码,这些“元组”的输出方式可以在减少阶段以有意义的方式连接在一起。在某些时候,任何分布式计算环境都可能需要组合在不同节点中计算的记录。 Keys为我们提供了一种方便且可扩展的方法。
所以 - 我们保证SAME密钥转到SAME reducer功能的事实证实,这个特定社交secuirty数字的EACH减速器将接收与该数字相关的所有数据,允许我们加入和输出数据记录包括ssn,名称和鞋码。
<强>结论强>
如果不按密钥分发,以这种方式连接数据将需要涉及某种中间数据存储/缓存的痛苦复杂的逻辑。 Hadoop通过使用熟悉的pardigm:键和值,简单地概括和抽象了通过并行计算“连接”数据结果的常见需求。