我有大量的输入数据(这就是为什么我使用Hadoop),有多个任务可以通过各种MapReduce步骤解决,其中第一个mapper需要所有数据作为输入。
我的目标:尽快计算完成这些不同的任务。
我目前让它们顺序运行,每个任务都会读取所有数据。我认为当组合任务并仅执行其相似部分(例如只将所有数据提供给Mapper)一次时,速度会更快。
我想知道如何以及如何将这些任务组合起来。对于每个输入键/值对,Mapper可以发出包括任务ID和任务特定键数据以及值的"超级键"。这样,Reducer将获得用于任务和任务特定键的键/值对,并且在看到"超级键"时可以决定对包含的键和值执行哪个任务。
伪代码如下:
map(key, value):
emit(SuperKey("Task 1", IncludedKey), value)
emit(SuperKey("Task 2", AnotherIncludedKey), value)
reduce(key, values):
if key.taskid == "Task 1":
for value in values:
// do stuff with key.includedkey and value
else:
// do something else
这个关键字可以是一个WritableComparable
,其中包含了所有必要的信息。
注意:伪代码建议的架构很糟糕,肯定有更聪明的方法。
我的问题是:
- 这是一个明智的方法吗?
- 是否有更好的替代方案?
- 它有一些可怕的缺点吗?
- 我需要为这种方法使用自定义的
Partitioner
类吗?
上下文:数据由数百万个RDF四元组组成,任务是计算聚类、统计和相似性。一些任务可以在Reducer中仅使用Hadoop计数器轻松解决,但有些任务需要多个MapReduce步骤。
计算最终将在Amazon的Elastic MapReduce上进行。所有任务都要在整个数据集上尽可能快地完成。