2019独角兽企业重金招聘Python工程师标准>>>

Common Join

最为普通的join策略,不受数据量的大小影响,也可以叫做reduce side join ,最没效率的一种join 方式. 它由一个mapreduce job 完成.

首先将大表和小表分别进行map 操作, 在map shuffle 的阶段每一个map output key 变成了table_name_tag_prefix + join_column_value , 但是在进行partition 的时候它仍然只使用join_column_value 进行hash.

每一个reduce 接受所有的map 传过来的split , 在reducce 的shuffle 阶段,它将map output key 前面的table_name_tag_prefix 给舍弃掉进行比较. 因为reduce 的个数可以由小表的大小进行决定,所以对于每一个节点的reduce 一定可以将小表的split 放入内存变成hashtable. 然后将大表的每一条记录进行一条一条的比较.

真正的Join在reduce阶段。

MapJoin

Map Join 的计算步骤分两步,将小表的数据变成hashtable广播到所有的map 端,将大表的数据进行合理的切分,然后在map 阶段的时候用大表的数据一行一行的去探测(probe) 小表的hashtable. 如果join key 相等,就写入HDFS.

map join 之所以叫做map join 是因为它所有的工作都在map 端进行计算.

hive 在map join 上做了几个优化:

hive 0.6 的时候默认认为写在select 后面的是大表,前面的是小表, 或者使用 /*+mapjoin(map_table) */ 提示进行设定. hive 0.7 的时候这个计算是自动化的,它首先会自动判断哪个是小表,哪个是大表,这个参数由(hive.auto.convert.join=true)来控制. 然后控制小表的大小由(hive.smalltable.filesize=25000000L)参数控制(默认是25M),当小表超过这个大小,hive 会默认转化成common join. 你可以查看HIVE-1642.

首先小表的Map 阶段它会将自己转化成MapReduce Local Task ,然后从HDFS 取小表的所有数据,将自己转化成Hashtable file 并压缩打包放入DistributedCache 里面.

目前hive 的map join 有几个限制,一个是它打算用BloomFilter 来实现hashtable , BloomFilter 大概比hashtable 省8-10倍的内存, 但是BloomFilter 的大小比较难控制.

现在DistributedCache 里面hashtable默认的复制是3份,对于一个有1000个map 的大表来说,这个数字太小,大多数map 操作都等着DistributedCache 复制.

优化后的map-join

Converting Common Join into Map Join

判断谁是大表谁是小表(小表的标准就是size小于hive.mapjoin.smalltable.filesize的值)

Hive在Compile阶段的时候对每一个common join会生成一个conditional task,并且对于每一个join table,会假设这个table是大表,生成一个mapjoin task,然后把这些mapjoin tasks装进

conditional task(List<Task<? extends Serializable>> resTasks),同时会映射大表的alias和对应的mapjoin task。在runtime运行时,resolver会读取每个table alias对应的input file size,如果小表的file size比设定的threshold要低 (hive.mapjoin.smalltable.filesize,默认值为25M),那么就会执行converted mapjoin task。对于每一个mapjoin task同时会设置一个backup task,就是先前的common join task,一旦mapjoin task执行失败了,则会启用backup task

Performance Bottleneck

性能瓶颈

1、Distributed Cache is the potential performance bottleneck

分布式缓存是一个潜在的性能瓶颈

A、Large hashtable file will slow down the propagation of Distributed Cache

大的hashtable文件将会减速分布式缓存的传播

B、Mappers are waiting for the hashtables file from Distributed Cache

Mapper排队等待从分布式缓存获取hashtables(因为默认一个hashtable缓存是三份,如果mappers数量太多需要一个一个的等待)

2、Compress and archive all the hashtable file into a tar file.

压缩和归档所有的hashtable文件为一个tar文件。

Bucket Map Join

Why:

Total table/partition size is big, not good for mapjoin.

How:

set hive.optimize.bucketmapjoin = true;

1. Work together with map join

2. All join tables are bucketized, and each small tableʼs bucket number can be divided by big tableʼs bucket number.

所有join的表是bucketized并且小表的bucket数量是大表bucket数量的整数倍

3. Bucket columns == Join columns

hive 建表的时候支持hash 分区通过指定clustered by (col_name,xxx ) into number_buckets buckets 关键字.

当连接的两个表的join key 就是bucket column 的时候,就可以通过

hive.optimize.bucketmapjoin= true

来控制hive 执行bucket map join 了, 需要注意的是你的小表的number_buckets 必须是大表的倍数. 无论多少个表进行连接这个条件都必须满足.(其实如果都按照2的指数倍来分bucket, 大表也可以是小表的倍数,不过这中间需要多计算一次,对int 有效,long 和string 不清楚)

Bucket Map Join 执行计划分两步,第一步先将小表做map 操作变成hashtable 然后广播到所有大表的map端,大表的map端接受了number_buckets 个小表的hashtable并不需要合成一个大的hashtable,直接可以进行map 操作,map 操作会产生number_buckets 个split,每个split 的标记跟小表的hashtable 标记是一样的, 在执行projection 操作的时候,只需要将小表的一个hashtable 放入内存即可,然后将大表的对应的split 拿出来进行判断,所以其内存限制为小表中最大的那个hashtable 的大小.

Bucket Map Join 同时也是Map Side Join 的一种实现,所有计算都在Map 端完成,没有Reduce 的都被叫做Map Side Join ,Bucket 只是hive 的一种hash partition 的实现,另外一种当然是值分区.

create table a (xxx) partition by (col_name)

不过一般hive 中两个表不一定会有同一个partition key, 即使有也不一定会是join key. 所以hive 没有这种基于值的map side join, hive 中的list partition 主要是用来过滤数据的而不是分区. 两个主要参数为(hive.optimize.cp = true 和 hive.optimize.pruner=true)

hadoop 源代码中默认提供map side join 的实现, 你可以在hadoop 源码的src/contrib/data_join/src 目录下找到相关的几个类. 其中TaggedMapOutput 即可以用来实现hash 也可以实现list , 看你自己决定怎么分区. Hadoop Definitive Guide 第8章关于map side join 和side data distribution 章节也有一个例子示例怎样实现值分区的map side join.

上图解释:b表是大表,a,c是小表并且都是整数倍,将a,c表加入内存先join然后到每个b表的map去做匹配。

Sort Merge Bucket Map Join

Why:

No limit on file/partition/table size.

How:

set hive.optimize.bucketmapjoin = true;

set hive.optimize.bucketmapjoin.sortedmerge = true;

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

1.Work together with bucket map join

将bucket加入到map join中

2.Bucket columns == Join columns == sort columns

Bucket Map Join 并没有解决map join 在小表必须完全装载进内存的限制, 如果想要在一个reduce 节点的大表和小表都不用装载进内存,必须使两个表都在join key 上有序才行,你可以在建表的时候就指定sorted byjoin key 或者使用index 的方式.

做法还是两边要做hash bucket,而且每个bucket内部要进行排序。这样一来当两边bucket要做局部join的时候,只需要用类似merge sort算法中的merge操作一样把两个bucket顺序遍历一遍即可完成,这样甚至都不用把一个bucket完整的加载成hashtable,这对性能的提升会有很大帮助。

set hive.optimize.bucketmapjoin = true;

set hive.optimize.bucketmapjoin.sortedmerge = true;

set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;

Bucket columns == Join columns == sort columns

这样小表的数据可以每次只读取一部分,然后还是用大表一行一行的去匹配,这样的join 没有限制内存的大小. 并且也可以执行全外连接.

Skew Join

Join bottlenecked on the reducer who gets the

skewed key

set hive.optimize.skewjoin = true;

set hive.skewjoin.key = skew_key_threshold

转载于:https://my.oschina.net/CostBasedOptimizatio/blog/388277

Hive Join Strategies hive的连接策略相关推荐

  1. Hive基本操作,DDL操作(创建表,修改表,显示命令),DML操作(Load Insert Select),Hive Join,Hive Shell参数(内置运算符、内置函数)等

    1.  Hive基本操作 1.1DDL操作 1.1.1    创建表 建表语法 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_nam ...

  2. Hive JOIN使用详解

    Hive是基于Hadoop平台的,它提供了类似SQL一样的查询语言HQL.有了Hive,如果使用过SQL语言,并且不理解Hadoop MapReduce运行原理,也就无法通过编程来实现MR,但是你仍然 ...

  3. hive join on 条件 与 where 条件区别

    hive join on 条件 与 where 条件区别 1. select * from a left join b on a.id = b.id and a.dt=20181115;2. sele ...

  4. Hive第二代客户端远程连接

    目录 hive第二代客户端 两种模式解读​ 启动 相关配置文件 前提:启动hadoop集群 初始化元数据库 ​踩坑 启动metastore 启动hiveserver2 远程连接 测试 IDEA连接hi ...

  5. 大数据系列之数据仓库Hive命令使用及JDBC连接

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  6. 用Hive统计某个年阶段连接夺冠的NBA球队

    用Hive统计某个年阶段连接夺冠的NBA球队 1.原始数据如下:`在这里插入 team,year 活塞,1990 公⽜,1991 公⽜,1992 公⽜,1993 ⽕箭,1994 ⽕箭,1995 公⽜, ...

  7. hive 启动服务命令及连接

    启动元数据服务 ./hive --service metastore & 启动server ./hive --service hiveserver2 -hiveconf hive.server ...

  8. 将服务器文件加载至hive表中,Hive入门到剖析(四)

    10 Hive体系架构 10.1概念 用户接口:用户访问Hive的入口 元数据:Hive的用户信息与表的MetaData 解释器:分析翻译HQL的组件 编译器:编译HQL的组件 优化器:优化HQL的组 ...

  9. 认识Hive,以及Hive的数据定义与数据操作,hive的数据查询和hive函数

    认识Hive 为什么要出现hive 前面知识我们讲到mapreudce计算框架,各位需要通过java编码的形式来实现设计运算过程,这对各位的编程能力提出了更高的要求,难道没有门槛更低的方式来实现运算的 ...

最新文章

  1. 对装饰器@wraps的解释(一看就懂)-- 并对装饰器详解
  2. 微服务实战(一):微服务架构的优势与不足
  3. Ensure that you have installed a JDK (not just a JRE) and configured your JAVA_HOME system variable
  4. QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)
  5. DAL层修改sql表数据
  6. VC6.0 中的__asm语句
  7. 获取数据库时间相差8小时_JAVA 程序展示时间与数据表保存的时间相差了13个小时...
  8. 如何用Git向GitHub上传送文件(从注册GitHub到用Git上传的每一步)
  9. MarkDown 下载-安装
  10. 使用Transformer学习动态多层次的交通时空特征
  11. 工资重要还是五险一金重要
  12. dnf剑魂buff等级上限_DNF体验服快讯—剑魂加入25开关/25仔变34仔/国庆版本内容前瞻...
  13. 电脑系统知识:Windows原版系统与Ghost系统的区别,你知道吗?
  14. 瑞利、莱斯、高斯信道模型
  15. 链接被微信拦截(被封锁、被屏蔽、被和谐)最新方法
  16. 交易系统订单存在的意义
  17. Python之文章生成器
  18. 发那科机器人控制柜示教器不通电_FANUC发那科机器人示教器A05B-2301-C305液晶屏维修...
  19. React(九)create-react-app创建项目 + 按需加载Ant Design
  20. Android记账本案例

热门文章

  1. C++读取txt数据为二维数组 将数据保存到txt文本中
  2. OpenCV图像剪切的扩展和高级用法:任意裁剪,边界扩充
  3. elk的一些零碎知识
  4. Codeforces 527C Glass Carving (最长连续0变形+线段树)
  5. 使用plsql developer 创建用户
  6. 【Oracle】Oracle索引
  7. MYSQL数据库导入出错:#1046 - No database selected
  8. 修改大型 XML 文件的有效方法
  9. UOJ #586. 旅行问题
  10. 软件工程综合实践 作业 Axure介绍