如何在MapReduce中的数据节点之间分配数据?

时间:2014-05-22 16:20:11

标签: hadoop mapreduce elastic-map-reduce

我是MapReduce的新手,我有处理大数据(记录行)的任务。我应该使用的一件事是我的mapper中特定记录的行号,然后reducer根据映射器处理行号信息。

例如,假设现在我有一个非常大的input.txt,每行看起来像这样:

1. Melo, apple, orange
2. orange, perl
3. apple, banana, car
...
10000. Apple
...

如果我想根据其出现的行号来解决Apple的问题,然后解决这些不同水果之间的关系,例如:

Apple => orange

我可以将键/值对中的值设置为行号列表。但由于我不知道数据如何针对不同的数据节点进行分区,因此原始输入文件的行号信息将丢失。我不知道数据如何在数据节点之间分配,它是基于第一条记录的偏移量吗?或者分区数据的大小?

我查了几个教程,我仍然对mapreduce的确切工作流程感到困惑。此外,我计划使用亚马逊弹性mapreduce并使用Python。

也许我在这次讨论中谈论同样的事情,但据我所知,当时或讨论期间没有解决方案。是不是?

http://lucene.472066.n3.nabble.com/current-line-number-as-key-td2958080.html

谢谢!

1 个答案:

答案 0 :(得分:0)

这是mapreduce的确切工作流程:

输入文件被分成多个块,这些块将由映射器处理, 每个映射器的输出将是(键,值)对。

在将所有这些(键,值)对分配给reducers之前,需要对它们进行混洗并按键排序,以便将与特定键关联的所有值发送到同一个reducer。

因此reducer将作为输入(Key,[value1,value2,value3,..,valuen])。

现在让我们回到你的例子,你可以在地图级别(术语,行号)使用(键,值),所以对于苹果我们将:(apple,2),(apple,3)... (苹果,10000)

减速器将接收(apple,[2,3,...,10000]),然后您可以根据需要进行处理。

相关问题