我是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行,大约有1.5M不同的数字。并且将有大约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。
答案 0 :(得分:3)
但这种方法需要2M映射器和2.5G缩减器。这是一种看似合理的方式吗?计划在Azure上尝试Hadoop。
这个假设不正确。
FileInputFormat的映射器数量等于Input Splits的数量。输入拆分可以映射到HDFS中的块,默认为64MB。因此,如果输入文件是1024 MB,那么将启动16个地图任务。
减少器的数量可以使用mapred.reduce.tasks参数进行配置,默认值为1.此外,请注意combiner可用于使作业更快完成。
建议通过Hadoop - The Definitive Guide来更好地理解MapReduce和Hadoop。
答案 1 :(得分:0)
简而言之,我不是专家,但我会这样做。 @Thomas Jungblut的观点非常重要 - 每个文件的每个块都会触发一个映射器(大小可配置,最多可以),所以你不会拥有你想象的那么多的映射器 - 除此之外 - 使用像平台这样的平台在某种程度上,Hadoop是让它弄明白的。你的逻辑是正确的。