组合连接
模式描述
组合连接是一种非常特殊的连接操作,它可以在map端对许多非常大的格式化输入做连接。
目的
如果你需要连接非常大的数据集,那么组合连接将特别有用。但是,在使用这个类型的连接之前,必须先按照外键对数据集进行排序和分区,并以一种非常特殊的方式读入数据集。也就是说,如果你的数据能够按照这样的方式读入或者你能够预先处理数据,那么相对于其他类型的连接操作来讲使用组合连接有极大的优势。
hadoop通过使用CompositeInputFormat来支持组合连接操作。这个连接模式只适用于内连接和全外连接。每一个mapper的输入都要按照指定的方式做分区和排序,对每一个输入数据集都需要分成相同数目的分区。此外,对应于某个特定外键的所有必须在同一个分区中。通常情况下,这发生在几个作业的输出有相同数目的reducer和相同的外键,并且输出文件不是可拆分的,即不大于一个HDFS文件块的大小或者gzip压缩的。
适用场景
组合连接应该被用在如下场景中:
- 需要执行的是内连接或者全外连接。
- 所有的数据集都足够的大。
- 所有的数据集都可以用外键当mapper的输入键来读取。
- 所有的数据集有相同的数目的分区。
- 每一个分区都是按照外键排序的。并且所有的外键都出现在关联分区的每个数据集中。也就是说,数据集合A和B的分区X包含相同的外键,并且这些外键只存在于分区X中。
- 数据集不会经常改变。
结构
- 在作业配置阶段,驱动程序代码完成了大部分的工作。它设置用于解析数据集的输入格式的类型,以及要执行的连接类型。然后框架负责在读入数据是执行真正的连接操作。
- mapper非常简单。从输入元祖中抽取两个值,并将其简单地输出到文件系统。
- 这个模式中没有combiner、partitioner或者reducer。它是只有map的。
结果
输出的part文件数目与map任务的数目相同。part文件中包含连接记录的全部集合。如果执行的是外连接,输出文件中可能会出现null值。
性能分析
组合连接可以在大数据集上执行得相对快些。 但是MapReduce框架只能调度作业到两个数据集中的一个集合所对应的节点上。对于按照相同键分区得到的各个文件,不能假设它们在同一个节点上。
在分析这个模式的性能时,要考虑到所有的数据预处理过程。通常情况下,数据预处理作业也是一个MapReduce作业,但是如果这个数据集很少变化,那么经过排序和分区的数据集可以被反复使用。这样预处理这些数据的成本就会在多次的使用中被平均。