知识卡片
Map侧连接的三种变体:广播散列、分区散列与合并连接
内容
与[[排序合并连接把相关数据放在一起的核心思想]]在Reducer里做连接不同,如果能对输入数据做出某些假设,就可以用Map侧连接省掉排序和跨机器复制Reducer这一整套开销:广播散列连接适用于一大一小两个数据集连接的场景,小数据集小到能整个塞进每个Mapper的内存哈希表(甚至可以放到本地磁盘的只读索引里替代内存),每个处理大数据集分片的Mapper启动时把小数据集”广播”进内存,然后逐条对大数据集记录做哈希查找;分区散列连接要求连接两侧用相同的键、相同的哈希函数、相同数量的分区,这样每个Mapper只需要读取两侧对应编号的分区做局部哈希连接,好处是每个Mapper内存里存的数据更少;Map侧合并连接则要求两侧不仅分区相同还各自按键排序好,此时Mapper可以直接做归并式的连接扫描,甚至不要求数据能塞进内存。三者共同点是省去了Reduce侧连接昂贵的排序、复制与合并,代价是对输入的大小、分区方式或有序性做了更强的假设——这类假设往往来自前一个MapReduce作业已经做过对应的分组或排序。
参考来源
- 位置:《数据密集型应用系统设计》第十章《批处理》"Map侧连接""广播散列连接""分区散列连接""Map侧合并连接"(源文件:_epub-src/ch10_split_001.html)
- 结论依据:原文分别描述广播散列连接(小数据集整体载入内存哈希表)、分区散列连接(两侧相同分区方式各自局部哈希)、Map侧合并连接(两侧同分区且同排序时归并扫描)三种Map侧连接变体及其对输入的前提假设,直接支撑本卡片的分类总结。
- 原始内容:这种简单有效的算法被称为广播散列连接……如果Map侧连接的输入以相同的方式进行分区,则散列连接方法可以独立应用于每个分区……如果输入数据集不仅以相同的方式进行分区,而且还基于相同的键进行排序,则可适用另一种Map侧连接的变体。