2011-06-12 92 views
4

我有一个关于在Hadoop中为多个映射器配置Map/Side内部连接的问题。 假设我有两个非常大的数据集A和B,我使用相同的分区和排序算法将它们分成更小的部分。对于A,假设我有(1)到(10),对于B我有b(1)到b(10)。确保a(1)和b(1)包含相同的密钥,a(2)和b(2)具有相同的密钥,依此类推。我想设置10个映射器,具体来说,映射器(1)映射器(10)。据我所知,Map/Side连接是mapper之前的一个预处理任务,因此,我想加入一个(1)和b(1)for mapper(1),加入一个(2)和b 2)用于映射器(2),等等。在Hadoop中为多个映射器配置映射端加入Map/Reduce

在阅读了一些参考资料后,我仍不清楚如何配置这10个映射器。据我所知,使用CompositeInputFormat我可以加入两个文件,但似乎只配置一个映射器并在对(连续10个任务)后加入20个文件对。如何在真正的Map/Reduce(并行10个任务)中同时配置所有这10个映射器并加入10对?据我了解,10个映射器需要10个CompositeInputFormat设置,因为要加入的文件都是不同的。我坚信这是实用可行的,但我无法弄清楚我应该使用什么确切的命令。

任何暗示和建议是非常受欢迎和赞赏。


非常感谢您的答复,大卫和托马斯!

我很欣赏你对Map-side Join前提条件的重视。是的,我知道排序,API等等。在阅读你的评论之后,我认为我的实际问题是在CompositeInputFormat中加入两个文件的多个拆分的正确表达式是什么。例如,我有数据A和数据B排序和在2档分别减少:

/A /数据A-R-00000

/A /数据A-R-00001

/B /数据B-R -00000

/B /数据B-R-00001

我现在使用中的表达命令是:

内(TBL(org.apache.hadoop.mapred.KeyValueTextInputFormat,“/ A /数据A -R-00000" ) ,tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,“/ B/dataB-r-00000”))

它可以工作,但正如你所提到的,它只启动两个映射器(因为内部连接可以防止分裂)如果文件很大,可能效率很低。如果我想使用更多的映射器(也就是说另外两个映射器加入dataA-r-00001和dataB-r-00001),我应该如何构造表达式,如下所示:

String joinexpression =“inner(tbl (org.apache.hadoop.mapred.KeyValueTextInputFormat'/ A/dataA-r-00000'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,'/ B/dataB-r-00000'),tbl(org .apache.hadoop.mapred.KeyValueTextInputFormat'/ A/dataA-r-00001'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,'/ B/dataB-r-00001'))“;

但我认为这可能是错误的,因为上面的命令实际上执行四个文件的内部连接(由于文件* r-00000和* r-00001具有不重叠的键,这在我的情况下不会导致任何结果)。

或者我可以只使用两个显示目录作为输入,如:

字符串joinexpression =“内(TBL(org.apache.hadoop.mapred.KeyValueTextInputFormat, '/ A /'),TBL(有机apache.hadoop.mapred.KeyValueTextInputFormat,'/ B /'))“;

内部连接会根据文件结尾自动匹配对,比如说“00000”到“00000”,“00001”到“00001”?我被困在这一点上,因为我需要构造表达式并将它传递给

conf.set(“mapred.join.expr”,joinexpression);

所以总而言之,如果我想要使用更多映射器同时连接多对文件,应该如何构建正确的表达式?

回答

1

我认为你错过了这一点。你不控制mappers的数量。这是您控制的减速器数量。只需从您的映射器发出正确的密钥。然后运行10个减速器。

+0

确定可以控制映射器的数量,您必须将n个文件放入输入目录并作为fileinputformat提交。 – 2011-06-15 15:19:33

4

有地图和减少边连接。 您建议使用地图边连接,该地图边连接在映射器内部执行,而不是在它之前执行。 双方必须具有相同的键和值类型。所以你不能加入LongWritableText,尽管它们可能具有相同的值。

有微妙的更多的事情需要注意:

  • 输入文件进行排序,所以它有可能是减速机的输出
  • 你可以控制你的加入-MAP-映射器的数量通过设置在作业减速器的数量阶段应该已经排序的数据集

整个过程基本上是这样的:你有数据集A和集B,二者共享同一个密钥,比方说LongWritable

  1. 运行两个作业那种两个datasetsby他们的钥匙,这两个作业必须减速机的数量设置同等数量的,说2
  2. 这将导致2 分类文件每个数据集
  3. 现在你设置了加入数据集的工作,这个工作将会产生2个映射器。如果你在之前的工作中设置更高的数字,这可能会更多。
  4. 在缩小步骤中做任何你喜欢的事情。

如果要加入的文件数量不相等,则会在作业设置过程中导致异常。

设置连接有点痛苦,主要是因为如果您的版本低于0.21.x,您必须使用旧API for mapper和reducer。

This document describes very well how it works.一直滚动到底部,遗憾的是这个文档在最新的Hadoop文档中有些遗漏。

另一个很好的参考资料是“Hadoop权威指南”,其中更详细地解释了所有这些和示例。