-1

我是 MapReduce 新手,希望您对以下任务的最佳 MapReduce 方法提出意见。

我有一个格式为的大文档

1 2 3
2
2 3 4 5

每行都有一个数字列表。我想在任何行中列出每个可能的(对)数字组合。我想要包含每个给定对的行数。

结果会像

element1 element2 occurrences
1        1        1
1        2        1
1        3        1
2        2        3
2        3        2
3        3        2
3        4        1
3        5        1

文档中有大约 2M 行,大约有 150 万个不同的数字。并且将有大约 2.5G 不同的数字对进行统计。

直截了当的伪代码如下:为文档中的每一行调用映射

Map(int lineId, list<int> elements)
{
  for each pair of integers in elements
    emit(pair, 1)
}

Reduce((int, int) pair, list<int> counts)
{
  return sum(counts)
}

但是这种方法需要 2M 的映射器和 2.5G 的减速器。这是一个可行的方法吗?计划在 Azure 上试用 Hadoop。

4

2 回答 2

3

但是这种方法需要 2M 的映射器和 2.5G 的减速器。这是一个可行的方法吗?计划在 Azure 上试用 Hadoop。

这个假设是不正确的。

FileInputFormat的映射器数量等于输入拆分的数量。Input Split 可以映射到 HDFS 中的一个块,默认为 64MB。因此,如果输入文件为 1024 MB,则将启动 16 个地图任务。

reducer 的数量可以使用默认为 1 的mapred.reduce.tasks参数进行配置。另外,请注意,可以使用组合器来更快地完成作业。

建议阅读Hadoop - The Definitive Guide以更好地了解 MapReduce 和 Hadoop。

于 2012-10-29T13:54:22.007 回答
0

简而言之,我不是专家,但我会这样做。@Thomas Jungblut 的观点很重要——每个文件的每个块都会触发一个映射器(大小是可配置的,最多可以配置),所以你不会有你想的那么多的映射器,此外——使用平台之类的点Hadoop,在某种程度上,就是让它自己弄清楚。你的逻辑是正确的。

于 2012-10-29T13:43:56.207 回答