如何在MapReduce中的数据节点之间对数据进行分区和分配?

时间:2014-05-22 02:24:55

标签: python 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

谢谢!

3 个答案:

答案 0 :(得分:1)

你的问题有很多,所以我要处理我理解的块。这是:

  

我不知道数据是如何在数据节点之间分配的   基于第一条记录的偏移量?或者大小   分区数据?

数据完全根据文件大小分发。 HDFS不知道您的记录边界,只会将文件分成指定大小的块(默认为64MB)。然后在集群的DataNodes中共享这些块。

  

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

目前有两个主要版本的Hadoop。 1.x系列AKA MapReduce v1和2.x系列AKA YARN。作为一名程序员,您将以类似的方式与这些人进行交互,但在工作中如何完成工作会有所不同。这是混淆的常见原因。特别是,因为大多数教程都是针对MapReduce v1的。

  

也许我在讨论中谈论同样的事情,但就我而言   知道,当时或在讨论期间没有解决方案。是   对吗?

所以这是你的数据集:

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

您有一个行号,一个空格,然后是逗号分隔值。所以看起来你的问题与你在问题中所链接的问题截然不同。或者我不理解数据?

答案 1 :(得分:0)

我认为你正在寻找Partitioner课程。默认值为HashPartitioner

http://hadooptutorial.wikispaces.com/Custom+partitioner

答案 2 :(得分:0)

您无需关心如何跨数据节点分布数据。 Hadoop将负责这一点。您可以像任何Linux文件系统一样对待它。虽然一个巨大的文件被切割成许多块并以分布式方式存储,但是当您在该文件上运行MR作业时,该作业将在与该文件相关的所有块上处理。

例如,input.txt是一个已上传到HDFS的大文件。

hadoop fs mapper.py reducer.py input.txt output.txt

MR基本上会在数据节点上的input.txt块上运行mapper.py,然后将mapper.py(s)的中间结果传递给reducer.py。

您的mapper.py应如下所示:

def mapper():
  for line in sys.stdin:
    data = line.strip().split('.')
    index, items = data

    for item in items:
    print "{0}\t{1}".format(item, index)
# Result will look like:
# Melo  1
# Apple 1
# Orange 1
# Orange  2
# perl  2

我想这可能是你在mapper之后需要的东西。

还在考虑减速机......基本上我对减速机的想法是生产这样的东西:

Apple    1,3
Orange   1,2
Melo     1
perl     2

reducer的结果可用于关联两个项目,这将需要另一个reducer脚本,该脚本将遍历整个列表以查找两个声明的项目,并查看它们是否在第二个字段上具有相同的索引。