首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Hadoop /Reduce中为多个映射程序配置Map端连接

在Hadoop /Reduce中为多个映射程序配置Map端连接
EN

Stack Overflow用户
提问于 2011-06-12 17:54:25
回答 2查看 6.2K关注 0票数 4

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

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

任何暗示和建议都会受到高度的欢迎和赞赏。

石氏

非常感谢你的回复,大卫和托马斯!

感谢您强调地图端连接的预要求。是的,我知道排序,API等等。在阅读了您的评论后,我认为我的实际问题是在CompositeInputFormat中连接两个文件的多个分块的正确表达式是什么。例如,我在两个文件中分别对dataA和dataB进行了排序和压缩:

/A/dataA-r-00000

/A/dataA-r-00001

/B/dataB-r-00000

/B/dataB-r-00001

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

( inner(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,“/A/dataA 00000”),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,“/B/dataB-r-00000”)

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

字符串联合表达式= "inner(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,‘/A/dataA 00000’,tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,‘/B/dataB-r-00000’,tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,‘/A/dataA 00001’),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,‘/B/dataB-r-00001’)“;

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

或者我可以用这两个dirs作为输入,比如:

字符串联合表达式= "inner(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,'/A/'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,‘/B/’)“;

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

conf.set("mapred.join.expr",联合表达);

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

EN

回答 2

Stack Overflow用户

发布于 2011-06-15 15:35:57

有地图-和减少侧连接。您建议使用映射端联接,它是在映射器中执行的,而不是在映射器之前执行的。双方必须具有相同的键和值类型。因此,您不能加入LongWritableText,尽管它们可能具有相同的值。

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

  • 输入文件必须被排序,所以它很可能是一个减速器输出。
  • 您可以通过设置作业中本应对数据集进行排序的减速器数量来控制连接映射阶段中映射器的数量。

整个过程基本上是这样工作的:您有dataset A和dataset B,它们共享相同的密钥,比方说LongWritable

  1. 运行两个按键对两个数据集进行排序的作业,两个作业都必须将减速器的数量设置为相同的数目,比如2。
  2. 这将为每个数据集生成2个排序的文件。
  3. 现在您设置了加入数据集的作业,此作业将由2个映射器生成。如果您在上一份工作中将减少数设置得更高,则可能会更多。
  4. 在减少步骤中做你想做的任何事情。

如果要加入的文件数量不相等,则将导致作业设置期间出现异常。

设置一个join有点痛苦,主要是因为如果您的版本小于0.21.x,您必须使用以前的API作为映射器和还原器。

本文档很好地描述了它的工作原理。一直滚动到底层,遗憾的是,这个文档在最新的Hadoop中丢失了。

另一个很好的参考是"Hadoop最终指南“,它更详细地解释了这一切,并举例说明了这一点。

票数 4
EN

Stack Overflow用户

发布于 2011-06-15 15:11:34

我觉得你没抓住重点。你不能控制地图绘制者的数量。这是你能控制的减速器的数量。只需从映射器发出正确的键即可。然后运行10个减速器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6323544

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档