两表join在业务开发中是经常用到,了解了大数据join的原理,对于开发有很大的好处。

1、reduce side join

reduce side join是一种简单的join的方法,具体思想如下:
顾名思义就在reduce进行join,
在map阶段,map同时读取两文件file1,file2,为了区分key/value需要对两文件进行打标签,比如:tag=0 表示file1 tag=1 表示file2,
map阶段主要的任务就是对不同的数据打上不同的标签。
在reduce阶段,reduce函数会从file1,file2中获取相同key的value list,然后对相同key的file1和file2 进行join,即reduce 阶段进行实际的连接操作。

http://blog.csdn.net/huashetianzu/article/details/7819244

2、map side join

顾名思义就是在map端进行join,因为reduce side join 是非常低效的,需要在shuffle的过程中进行大量的数据传输,因为map阶段不能获取到所有需要的join的字段,即:同一个key对应的字段可能位于不同的map中。
map side join 一般是指需要一张大表,一张小表,小表可以直接放到内存中,这样我们可以将小表复制到各个map端进行join,每个map端都会存一份,一般在内存中(比如hash table)然后只扫描大表,对于大表中的每一条key/value,在小表中找到相同key的记录,如果有则输出。
http://blog.csdn.net/huashetianzu/article/details/7821674

3、semi join

semi join 也叫半连接,这个是从分布式数据库中借鉴过来的。产生的动机呢,主要是reduce side join 跨机器传输数据量非常大,这成了join的一个瓶颈,如果能在map端过滤掉不会参加join操作的数据,可以大大的节省了IO。

实现方法:先选取一张小表,假设是file1,把参与join的key抽取出来,保存在file3中,file3文件一般很小,可以放到内存中,这样把file3拷贝到每个taskTracker中,然后将file2中不在file3中的数据过滤掉,剩下的就与reduce side join相同。
http://blog.csdn.net/huashetianzu/article/details/7823326

4、reduce side join + BloomFilter

这个也是semi join的一个延伸,主要是有时sem join抽取出来的key在内存中依然存放不下,这时可以用BloomFilter来节省空间,
BloomFilter最常见的作用是:判断某个元素是否在一个集合里面,通过判断元素是否存在来过滤,
因而可将小表中的key保存到BloomFilter中,根据BloomFilter算法,在map阶段过滤大表,可能有一些不在小表中的记录没有被过滤掉(但是在小表中的记录一定不会过滤掉),这样只是增加了少量的IO。
http://blog.csdn.net/jiaomeng/article/details/1495500
http://baike.baidu.com/link?url=xLbNuk12FJSSlzLRmcWpQ1OaPbPYIvVUaackA6d_N77kYdyEqYVWUsgXbmo65iVotcnzODV_CvbuMQqbBtOFDLhfxccE4qUUWNTN589LrTK

MapReudce中常见join的方案的更多相关文章

  1. Redis 中常见的集群部署方案

    Redis 的高可用集群 前言 几种常用的集群方案 主从集群模式 全量同步 增量同步 哨兵机制 什么是哨兵机制 如何保证选主的准确性 如何选主 选举主节点的规则 哨兵进行主节点切换 切片集群 Redi ...

  2. JavaScript中常见的数组操作函数及用法

    JavaScript中常见的数组操作函数及用法 昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下 ...

  3. OpenStack安装部署管理中常见问题解决方法

    一.网络问题-network 更多网络原理机制可以参考<OpenStack云平台的网络模式及其工作机制>. 1.1.控制节点与网络控制器区别 OpenStack平台中有两种类型的物理节点, ...

  4. PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等

    页面导航: 首页 → 网络编程 → PHP编程 → php技巧 → 正文内容 PHP安全 PHP开发中常见的安全问题详解和解决方法(如Sql注入.CSRF.Xss.CC等) 作者: 字体:[增加 减小 ...

  5. js中常见的问题

    js中常见的问题 原文链接 1.js获取select标签选中的值 原生js var obj = document.getElementByIdx_x(”testSelect”); //定位id var ...

  6. SQL Server中INNER JOIN与子查询IN的性能测试

    这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...

  7. Python中常见字符串去除空格的方法总结

    Python中常见字符串去除空格的方法总结 1:strip()方法,去除字符串开头或者结尾的空格>>> a = " a b c ">>> a.s ...

  8. SQL中常见语句

    SQL中常见语句笔记: --替换字段中的回车符和换行符 ) ), '') --删除表命令 DROP TABLE [dbo].[MGoods_Test] --删除表中数据命令 DELETE FROM [ ...

  9. (转载)MySQL数据库的几种常见高可用方案

    转自: https://yq.aliyun.com/articles/74454   随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化. ...

随机推荐

  1. iOS-Gdata XML解析配置和简单使用

    简单介绍使用废话少说直接上图就能看明白... 导入libxml2,使用第三方AFNetworking网络请求,第三方XML解析GData GData需要的配置 Build Settings 里搜索,添 ...

  2. Xcode 设置 ARC&MRC混用

    如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件加入 -fobjc-arc 标签.如果你的项目使用的是 ARC 模式,则为非 ARC 模式的代码文件加入 -fno-objc-arc 标 ...

  3. C++学习笔记24:makefile文件

    makefile make命令:负责c/c++程序编译与链接 make根据指定命令进行建构 建构规则文件:GNUmakefile , makefile,Makefile makefile 文件格式 m ...

  4. js中有趣的闭包(closure)

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  5. REST概念和应用 - TODO

    Motivation Sometimes I fell like giving up, then I remember I have a lot of motherfuckers to prove w ...

  6. opencv--图像轮廓检测

    //图像的轮廓检测上 //By MoreWindows (http://blog.csdn.net/MoreWindows) #include <opencv2/opencv.hpp> u ...

  7. (转)Deep Learning Research Review Week 1: Generative Adversarial Nets

    Adit Deshpande CS Undergrad at UCLA ('19) Blog About Resume Deep Learning Research Review Week 1: Ge ...

  8. ZFS(一):ZFS在Debian GNU/Linux上的安装

    以下内容翻译自https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux/,并附有原文,由于是第一次翻译,如有任何翻译不恰当之处,欢迎指出 ...

  9. centos网卡eth1变成eth0修改方法

    centos网卡eth1变成eth0修改方法 2013年03月29日 ⁄ Linux基础 ⁄ 共 406字 ⁄ 暂无评论 ⁄ 被围观 8,266 views+ 虚拟化中,从模板克隆出来的虚拟机网卡都会 ...

  10. SpringMVC学习系列(9) 之 实现注解式权限验证

    对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MV ...