作为一般策略,首选是 map-side 连接。这里,我们探讨三种不同风格的 map-side joins:
有一个数据集小到足够放入内存缓存;
有一个数据集经过过滤后可以放入内存缓存中;(在两个数据集中都存在 join key);
数据被排序并以某种方式跨文件分发。
方式一:连接数据,其中有一个数据集小到足够放入内存缓存
复制连接是 map-side join,复制连接得名于它的具体实现:连接中最小的数据集将会被复制到所有的 map 主机节点。复制连接有一个假设前提:在被连接的数据集中,有一个数据集足够小到可以缓存在内存中。使用分布式缓存来缓存较小的那个数据集,当较大的那个数据集流向 mapper 时与其执行接。
MapReduce 复制连接工作原理如下:
使用分布式缓存(Districubted cache)将这个小数据集复制到所有运行 map 任务的节点。
用各个 map 任务初始化方法将这个小数据集装载到一个哈希表(hashtable)中。
使用输入到 map 函数的大数据集的每条记录的 key 来查找这个小数据集的哈希表,并在这个大数据集记录和匹配该连接值的小数据集的所有记录间执行一个连接。
输出符合连接条件的结果。
示例:实现复制连接(map-join)。
题目:
有两个数据集 mylogs_tsv.txt 和 ip_country_tsv.txt。其中 mylogs_tsv.txt 中数据为 web 网站日志记录,ip_country_tsv.txt 中数据为 ip 地址和国家代码映射信息。
按照以下步骤操作:
我们先写mapper类:
然后再写我们的job类:
country.txt:
mylogXX.txt:
进行集群提交:
输出结果格式:
说明:
- 结论:So you're supposed to just open the file, it will be there. No dedicated API.- 使用 Hadoop 2.x 的分布式缓存,需要在 hadoop 平台上运行 MR 程序
如果所有的输入数据集都不能够小到可以放到缓存中,那有没有办法来优化 map 端连接呢?那就需要使用半连接(semi-join)了。
这就是简单的Map-side join 需要资料加qq:86497564 标明乐乎