在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);
因此,如果我想使用更多的映射器同时连接多对文件,那么我应该如何构建正确的表达式?
没有找到相关结果
已邀请:
2 个回复
哩翔购
和
连接起来。 还有更多注意事项: 输入文件必须排序,因此它很可能是减速器输出 您可以通过设置应该对数据集进行排序的作业中的化简器数量,来控制连接映射阶段中的映射器数量。 整个过程基本上是这样的:您有数据集A和数据集B,它们共享相同的密钥,比方说“ 0”。 运行两个按其键对两个数据集进行排序的作业,两个作业都必须将化简器的数量设置为相等的数量,例如2。 这将为每个数据集生成2个排序文件 现在,您设置了连接数据集的作业,该作业将生成2个映射器。如果您在上一个作业中将减少数量设置得更高,可能会更多。 在减少步骤中做任何您喜欢的事情。 如果要连接的文件数不相等,则会在作业设置过程中导致异常。 设置联接有点痛苦,主要是因为如果您的版本小于0.21.x,则必须将旧的API用于mapper和reducer。 本文档很好地描述了它是如何工作的。一直滚动到最底端,可悲的是,最新的Hadoop文档中缺少该文档。 另一个很好的参考是《 Hadoop最终指南》,该书以示例的方式更详细地解释了所有这些。
痴浪墨