我是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
文件中大约有2万行,大约有1.5万个不同的数字。而且将有大约2.5g不同的数字对需要计数。
stright-forward伪代码类似于:为文档中的每一行调用map
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)
}
但这种方法需要2米的绘图机和2.5克的减速机。这是一个可行的方法吗?计划在azure上尝试hadoop。
2条答案
按热度按时间v440hwme1#
简而言之,我不是Maven,但我会这么做@thomas jungblut的观点很重要-Map器会为每个文件的每个块启动(大小是可配置的,并且最大值),所以你不会有你认为的那么多Map器,此外-在某种程度上,使用hadoop这样的平台的目的是让它解决问题。你的逻辑是正确的。
bvuwiixz2#
但这种方法需要2米的绘图机和2.5克的减速机。这是一个可行的方法吗?计划在azure上尝试hadoop。
这种假设是不正确的。
fileinputformat的Map器数等于输入拆分数。输入分割可以Map到hdfs中的一个块,默认值为64mb。因此,如果输入文件是1024MB,那么将启动16个Map任务。
可以使用mapred.reduce.tasks参数(默认值为1)配置减速器的数量。另外,请注意,可以使用组合器使作业更快地完成。
我建议您阅读hadoop,这是更好地理解mapreduce和hadoop的权威指南。