2012-07-31 64 views
6

我是新来的hadoop在这里。目前尚不清楚为什么我们需要在使用hadoop mapreduce的同时按键排序?在映射阶段之后,我们需要将与每个唯一键相对应的数据分配给一定数量的缩减器。这可以在不需要对其进行排序的情况下完成?MapReduce阶段中使用的Sort是什么,为什么?

回答

14

它在那里,因为排序是一个巧妙的组合你的密钥。当然,如果你的工作或算法不需要你的密钥的任何顺序,那么通过一些散列技巧你可以更快地进行分组。

在Hadoop本身,已经有一个JIRA提交了多年以来(source)。 Hadoop之上的其他几个发行版已经具备了这些功能,例如Hanborq(他们称之为排序避免)。 (source

您的实际问题(为什么),MapReduce的是本质上来自谷歌(source)一个文件,其中规定如下:

我们保证给定的分区中,中间的键/值 对按照递增的按键顺序进行处理。这种排序保证 可以很容易地生成每个分区排序的输出文件,当输出文件格式需要通过关键支持高效随机 访问查询,或用户输出的发现可以方便地 有这 有用数据排序。

所以这是一个更方便的决定,以支持排序,但不是固有的只允许排序组键。

+0

感谢Matt对源代码的编辑。 – 2012-07-31 19:18:02

+0

谢谢Thomas!这解释了它! – user428900 2012-07-31 20:48:17

+0

在我看来,hadoop确实在地图输出被分散到磁盘中时开始初始排序(排序发生在将记录移动到溢出之前)随后它会合并排序(成本相对较低),并且从开始键排序也有助于组合器被调用,排序键有助于调用reducer,因此排序是一个好主意。 – Kalai 2016-04-01 12:39:42

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缩减功能接收单个单词,并因此添加所有被查看的时间,从而创建精确的单词计数。

因此,密钥的聚合是允许“地图”阶段独立分布在多个机器上的。如果没有将键集合到同一个缩减器中,在单词计数示例中,我们可能会针对给定单词获得几个单词计数,因为没有一个单独的缩减器会从所有文件接收所有单词计数。

又如:

现在...让我们说我们有社会安全号码作为ID和我们要输出的个人数据的集合。可以说我们有2个大文件。

ssn->名称

ssn-> shoe_size

在这种情况下,我们可以利用关键组的功率,使得个人名字和鞋子尺寸都发送到相同的降低作用。

减速机(2)将在这里得到2个记录:

ssn->名称,shoe_size

这里的想法是,写地图时/ reduce作业,你必须编码你的 “元组” 是以减少阶段以有意义的方式将它们连接在一起的方式输出。任何分布式计算环境在某些时候都可能需要合并在不同节点中计算的记录。 Keys为我们提供了一个方便可扩展的方法。

因此 - 我们确信SAME键进入SAME reducer功能的事实证明,针对此特定社会安全号码的EACH减速器将接收与该号码关联的所有数据,从而允许我们加入并输出数据记录其中包括ssn,名称和鞋号。

结论

没有以这样的方式通过键分配,接合数据将需要涉及某种中间数据存储/缓存的痛苦复杂的逻辑。 Hadoop简单地概括和抽象了通过使用熟悉的pardigm:键和值来“并入”来自并行计算的数据结果的常见需求。

相关问题