我有一个关于在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",联合表达);
因此,总之,如果我想要使用更多的映射器同时连接多对文件,我应该如何构建正确的表达式?
发布于 2011-06-15 15:35:57
有地图-和减少侧连接。您建议使用映射端联接,它是在映射器中执行的,而不是在映射器之前执行的。双方必须具有相同的键和值类型。因此,您不能加入LongWritable和Text,尽管它们可能具有相同的值。
还有更多微妙的事情要注意:
整个过程基本上是这样工作的:您有dataset A和dataset B,它们共享相同的密钥,比方说LongWritable。
如果要加入的文件数量不相等,则将导致作业设置期间出现异常。
设置一个join有点痛苦,主要是因为如果您的版本小于0.21.x,您必须使用以前的API作为映射器和还原器。
本文档很好地描述了它的工作原理。一直滚动到底层,遗憾的是,这个文档在最新的Hadoop中丢失了。
另一个很好的参考是"Hadoop最终指南“,它更详细地解释了这一切,并举例说明了这一点。
发布于 2011-06-15 15:11:34
我觉得你没抓住重点。你不能控制地图绘制者的数量。这是你能控制的减速器的数量。只需从映射器发出正确的键即可。然后运行10个减速器。
https://stackoverflow.com/questions/6323544
复制相似问题