4.1.2 复制连接(Replication join)
复制连接是map端的连接。复制连接得名于它的具体实现:连接中最小的数据集将会被复制到所有的map主机节点。复制连接有一个假设前提:在被连接的数据集中,有一个数据集足够小到可以缓存在内存中。
如图4.5所示,MapReduce复制连接工作原理如下:
- 使用分布式缓存(Districubted cache)将这个小数据集复制到所有运行map任务的节点。
- 用各个map任务初始化方法将这个小数据集装载到一个哈希表(hashtable)中。
- 逐条用大数据集中的记录遍历这个哈希表,逐个判断是否符合连接条件。
- 输出符合连接条件的结果。
复制连接的实现非常直接明了。更具体的内容可以参考《Hadoop in Action》。附录D.2提供了一个通用的框架来实现复制连接(http://www.cnblogs.com/datacloud/p/3617078.html)。这个框架支持任意类型的InputFormat和OutputFormat的数据。(我们将在下一个技术中使用这个框架。)复制连接框架根据内存足迹的大小从分布式缓存的内容和输入块(input split)两者中动态地决定需要缓存的对象。
如果所有的输入数据集都不能够小到可以放到缓存中,那有没有办法来优化map端连接呢?那就到了看半连接(semi-join)的时间了。