在Hadoop Map / Reduce中为多个映射器配置Map Side联接

|| 我有一个关于为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联接是映射器之前的预处理任务,因此,我想将mapper(1)的a(1)和b(1)联接,将a(2)和b( 2)用于mapper(2),依此类推。 在阅读了一些参考资料之后,我仍然不清楚如何配置这十个映射器。我知道使用CompositeInputFormat可以连接两个文件,但是似乎仅配置一个映射器,然后一对对地连接20个文件(在10个连续任务中)。如何在真正的Map / Reduce中并行配置所有这十个映射器并同时加入十对(并行执行10个任务)?据我了解,十个映射器将需要十个CompositeInputFormat设置,因为要加入的文件都是不同的。我坚信这是可行且可行的,但我无法弄清楚应该使用哪些确切命令。 任何提示和建议都将受到欢迎和赞赏。 施 非常感谢David和Thomas的回复! 感谢您对Map-side Join的先决条件的重视。是的,我知道排序,API等。阅读您的评论后,我认为我的实际问题是在CompositeInputFormat中联接两个文件的多个分割的正确表达式是什么。例如,我分别将dataA和dataB排序并减少为2个文件: / A /数据A-r-00000 / A / dataA-r-00001 / B /数据B-r-00000 / B /数据B-r-00001 我现在使用的expression命令是: 内部(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,\“ / A / dataA-r-00000 \”),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,\“ / B / dataB-r-00000 \“)) 它可以工作,但是正如您提到的,它仅启动两个映射器(因为内部联接可防止拆分),如果文件很大,效率可能非常低。如果我想使用更多的映射器(比如说另外两个映射器来连接dataA-r-00001和dataB-r-00001),那么我应该如何构造该表达式,它是这样的: 字符串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具有不重叠的键,因此不会有任何结果)。 或者,我可以只使用两个Dirs作为输入,例如: 字符串joinexpression = \“ inner(tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,\'/ A / \'),tbl(org.apache.hadoop.mapred.KeyValueTextInputFormat,\'/ B / \'))\ “; 内部联接将根据文件结尾自动匹配对,例如,将“ 00000”设置为“ 00000”,将“ 00001”设置为“ 00001”?我被困在这一点上,因为我需要构造表达式并将其传递给 conf.set(\“ mapred.join.expr \”,joinexpression); 因此,如果我想使用更多的映射器同时连接多对文件,那么我应该如何构建正确的表达式?     
已邀请:
有map-和reduce侧连接。 您建议使用地图侧连接,该连接在映射器内部而不是在映射器之前执行。 双方必须具有相同的键和值类型。因此,尽管它们可能具有相同的值,但是您不能将
LongWritable
Text
连接起来。 还有更多注意事项: 输入文件必须排序,因此它很可能是减速器输出 您可以通过设置应该对数据集进行排序的作业中的化简器数量,来控制连接映射阶段中的映射器数量。 整个过程基本上是这样的:您有数据集A和数据集B,它们共享相同的密钥,比方说“ 0”。 运行两个按其键对两个数据集进行排序的作业,两个作业都必须将化简器的数量设置为相等的数量,例如2。 这将为每个数据集生成2个排序文件 现在,您设置了连接数据集的作业,该作业将生成2个映射器。如果您在上一个作业中将减少数量设置得更高,可能会更多。 在减少步骤中做任何您喜欢的事情。 如果要连接的文件数不相等,则会在作业设置过程中导致异常。 设置联接有点痛苦,主要是因为如果您的版本小于0.21.x,则必须将旧的API用于mapper和reducer。 本文档很好地描述了它是如何工作的。一直滚动到最底端,可悲的是,最新的Hadoop文档中缺少该文档。 另一个很好的参考是《 Hadoop最终指南》,该书以示例的方式更详细地解释了所有这些。     
        我认为您错过了重点。您不控制映射器的数量。这是您可以控制的减速器数量。只需从映射器发出正确的密钥即可。然后运行10个减速器。     

要回复问题请先登录注册