连接复制

模式描述

复制连接(replicated join)是一种特殊类型的连接操作,是在一个大数据集和许多小数据集之间通过map端执行的连接操作。

目的

这个模式完全消除了混排数据到reduce阶段的需求。

动机

复制连接是非常有用的,但是它对参与连接操作的一个数据集以外的所有数据集的大小都有严格的限制。除一个非常大的数据集外,所有的数据集都需要在map任务的启动阶段读入到内存中,这将极大地受限于JVM堆的大小。如果你的计算可以满足这个需求,那么你将获益匪浅,因为没有reduce阶段,也就了没有混排或者排序。连接操作全部在map阶段完成,同时非常大的数据集作为这个MapReduce作业的输入。

另外一个限制是:复制连接实际只对内连接或者大数据集作为“左边”数据集的左连接有用。其他的连接类型需要有reduce阶段,用整个左边数据集对“右边”数据集进行分组。虽然在给定的map任务中存储在内存中的数据可能没有与输入数据匹配,但在另一个输入split中可能会有其他匹配的数据。

适用场景

复制连接应该用在如下场景中:

  • 要执行的连接类型是内连接或者左外连接,且大的输入数据集在连接操作符的“左边”时。
  • 除一个大的数据集外,所有的数据集都可以存入每个map任务的内存中。

结构

  • mapper的职责是在map阶段从分布式高速缓存中读取所有的文件,并将其存储在内存映射表中。在setup阶段完成后,mapper处理每一条输入记录将其与内存中存储的所有数据做连接操作。如果没有在内存结构中找到对应的外键,那么根据连接类型的不同,这条记录将会被忽略或者是被输出。
  • 这个模式没有combiner、partitioner以及reducer,它是只有map的。

结果

输出的part文件个数与map任务个数相同。part文件中包含连接后的所有记录。如果使用的是左连接,MapReduce分析的输入将会全部输出,可能会存在null值。

性能分析

因为不需要reducer,因此复制连接是所有连接模式中速度最快的一种,同时它也是有代价的。对数据量有限制,数据要能安全地存储在JVM中,这极大地受限于你愿意为每个map和reduce任务分配多少内存。在使用这个模式之前,可以通过实验来验证对于你的数据集多大的规模是可以满足内存要求的。同时要注意的是存储在内存中字节大小与存储在磁盘中的字节大小并不是完全一致的。因为java对象的开销会使得数据膨胀。

results matching ""

    No results matching ""