“国际大学生节”又称“世界大学生节”、“世界学生日”、“国际学生日”。1946年,世界各国学生代表于布拉格召开全世界学生大会,宣布把每年的11月17日定为“世界大学生节”,以加强全世界大学生的团结和友谊。

注意,本文讨论的hive join优化器是从hive 0.11.0版本起添加的,

本文描述了Hive查询执行计划的优化,以提高join效率并减少对用户提示的需求。

Hive自动识别各种用例并对其进行优化。Hive 0.11改进了这些情况的优化器:

决策支持系统或数据仓库的简单模型是星型模型,其中事件在大型事实表中收集,而较小的支持表(维度表)用于描述数据。

星型模型示例


原有的mapjoin

hive支持map joins,该类型适合星型模型的场景,当然要求维度表要适合加载入内存。在0.11的发布版本之前,mapjoin可以使用优化器提示来激活:


或者,也可以通过自动转换:


hive 0.10版本的时候,hive.auto.convert.join的值是false,0.11改为了true。?

MAPJOIN通过将较小的表加载到内存中的hashmap中并在流传输时将key与较大的表匹配来处理。先前的实现有一下几个步骤:

先前实现的局限性

Hive 0.11之前的MAPJOIN实现具有以下限制:

星形join的增强功能

Hive 0.11中的优化器增强功能专注于有效处理星型模型中所需的join。最初的工作仅限于星型模型join,其中projection和filter后的所有维度表同时适合内存。现在也实现了只有一些维度表适合内存的情景(HIVE-3996)。

连接优化可以分为三个部分:

以下部分介绍了每种优化程序增强功能。

mapjoin的优化链

下面的查询会产生两个对立的仅有map 的job


但是,对于小尺寸表,所需的两个表有可能同时适合装入内存。这大大减少了执行此查询所需的时间,因为事实表只读取一次而不是读取两次并将其写入HDFS以在job之间进行通信。

如果设置为true,则优化器不仅会将连接转换为mapjoins,还会尽可能地合并MJ *模式。

优化自动join转换

当自动join启动了,query中就不需要map-join的提示了。配置下面两个参数可以启自动join选项


第一个配置是指定默认值。

在大小配置使用户能够控制哪些尺寸表可以存放在内存。此值表示可以转换为适合内存的哈希映射的表大小的总和。目前,n-1个连接表必须适合装入内存才能使map join优化生效。没有检查表是否是压缩表以及表的潜在大小。这个假设对结果的影响将在下一节中讨论。

例如,上面的例子可以简单写为:


如果time_dim和date_dim符合所提供的大小配置,则相应的join将转换为map-join。如果表的大小总和可以小于配置的大小,则组合两个map join,从而产生单个map join。这减少了所需的MR作业数量,并显着提高了此查询的执行速度。此示例也可以轻松扩展为多join,并且可以按预期工作。

Outer joins?提供了更多挑战。由于map-join运算符只能流式传输一个表,因此流式表必须是所有行都需要的表。对于?left outer join,这是连接左侧的表; 对于?right outer join,右侧的表等。这意味着即使inner join可以转换为map join,outer join也无法转换为map join。在除了需要流式传输之外的表都小于配置的阈值大小的情况下,outer join可以转化为外部链接。full outer join无法转换为map-join,因为两个表都需要进行流式处理。

自动join转换也会影响sort-merge-bucket join。

Hive0.13.0 及更高版本引入,默认为false。

对于条件join,如果来自小别名的输入流可以直接应用于join运算符而不进行filter或projection,则无需通过MapReduce本地任务在分布式缓存中预先划分stage(pre-staged)。设置为true可避免在这些情况下进行预先分stage。

1.将尽可能多的MJ操作分组为一个MJ。

当Hive根据配置转换join为map-join时,会在这些转换结束时尽可能地将尽可能多的join组合在一起。如果参与各个map join的表的大小总和在配置的限制范围内,则将这些MJ运算符组合在一起,按顺序进行。这确保了关于这些查询的更多加速。

Sort-Merge-Bucket(SMB)join也可以转换为SMB map join。在表进行排序和分桶的任何地方都可以使用SMB连接。join归结为仅合并已经排序的表,允许此操作比普通的map-join更快。但是,如果表是分区的,则可能会减慢速度,因为每个mapper需要获得一个具有单个key分区的非常小块。

以下配置设置可以将SMB转换为map join SMB:


可以使用以下配置设置大表选择策略:


默认情况下,选择策略是平均分区大小。与hash表和流式传输表相比,大表选择策略有助于确定仅选择哪个表进行流式传输。

可用的选择政策是:


类名称描述了它们的用途。这对于事实 - 事实连接(TPC DS基准中的查询82)特别有用。

如果表具有不同数量的key,例如表A有2个SORT列,而表B有1个SORT列,那么可能会遇到索引超出范围的异常。

以下查询导致索引超出范围异常,因为emp_person让我们说例如有1个排序列,而emp_pay_history有2个排序列。

错误Hive 0.11


下面就可以正常运行

Hive 0.11


未来的工作将使在任务端完全生成内存中的哈希表成为可能。

在客户端上生成哈希表(或多个join的多个哈希表)具有缺点。(*tropical客户端机器是用于运行Hive客户端并提交作业的主机。)

在客户端计算机上预处理哈希表也有一些好处:

当在任务端完全生成哈希表时,所有任务节点都必须访问原始数据源以生成哈希表。由于在正常情况下这将并行发生,因此不会影响延迟,但Hive具有存储处理程序的概念,并且许多任务访问相同的外部数据源(HBase,数据库等)可能会对数据源造成性能压力。

推荐阅读:

重磅:关于hive的join使用必须了解的事情

经验|如何设置Spark资源

你真知道如何高效用mapPartitions吗?


文章来源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/82322343

hive的join优化的更多相关文章

  1. HIVE: Map Join Vs Common Join, and SMB

    HIVE  Map Join is nothing but the extended version of Hash Join of SQL Server - just extending Hash ...

  2. 深入浅出Hive企业级架构优化、Hive Sql优化、压缩和分布式缓存(企业Hadoop应用核心产品)

    一.本课程是怎么样的一门课程(全面介绍)    1.1.课程的背景       作为企业Hadoop应用的核心产品,Hive承载着FaceBook.淘宝等大佬 95%以上的离线统计,很多企业里的离线统 ...

  3. hive:join操作

    hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...

  4. [Hive_add_5] Hive 的 join 操作

    0. 说明 在 Hive 中进行 join 操作 1. 操作步骤 1.0 建表 在 hiveserver2 服务启动的前提下,在 Beeline客户端中输入以下命令 # 新建顾客表 create ta ...

  5. Hive中Join的类型和用法

    关键字:Hive Join.Hive LEFT|RIGTH|FULL OUTER JOIN.Hive LEFT SEMI JOIN.Hive Cross Join Hive中除了支持和传统数据库中一样 ...

  6. Hive 的企业优化

    优化 数据优化 一.从大表拆分成小表(更快地检索) 引用:Hive LanguageManual DDL eg2:常用于分表 create table if not exists default.ce ...

  7. Hive常用性能优化方法实践全面总结

    Apache Hive作为处理大数据量的大数据领域数据建设核心工具,数据量往往不是影响Hive执行效率的核心因素,数据倾斜.job数分配的不合理.磁盘或网络I/O过高.MapReduce配置的不合理等 ...

  8. MySQL 使用JOIN优化子查询

    1.数据准备 mysql> select * from student; +----+--------+----------+---------+-------------+ | id | na ...

  9. MySQL的JOIN(四):JOIN优化实践之快速匹配

    这篇博文讲述如何优化扫描速度.我们通过MySQL的JOIN(二):JOIN原理得知了两张表的JOIN操作就是不断从驱动表中取出记录,然后查找出被驱动表中与之匹配的记录并连接.这个过程的实质就是查询操作 ...

随机推荐

  1. js左右选项移动

    <!--网页代码--><div class="modal" id="modal-primary7"> <div class=&qu ...

  2. STM32学习笔记:IIC通信协议详解(附带软件模拟源码)

    什么是IIC(I2C)? IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司设计出来的一种简单.双向.二线制.同步串行总线.它是一种多向控制总 ...

  3. echart 库 初始

    一.echart简介 Echarts (http://echarts.baidu.com/)是百度公司出品的,算是百度不可多得的良心之作.要彻底掌握Echarts,你需要掌握一点前端开发的知识,这些知 ...

  4. CodeForces - 876E National Property(2-sat)

    题意:有n个有小写字母组成的字符串,将部分小写字母改成对应的大写字母,注意某种小写字母更改,所有的这种小写字母都会更改.若能使这给定的n个字符串符合字典序由小到大排序,则输出Yes,并输出需要修改的字 ...

  5. ROS学习笔记7-理解服务(services)和参数(parameter)

    本文内容来自官方wiki:http://wiki.ros.org/ROS/Tutorials/UnderstandingServicesParams ROS服务(service)服务也是ROS中一种通 ...

  6. 浅谈JVM线程调度机制及主要策略

    在之前有说过线程,应该都知道,所谓线程就是进程中的一个子任务,一个进程有多个线程.今天的话主要就是谈一谈JVM线程调度机制.我们结合线程来说,当我们在做多线程的案例时,如一个经典案例,火车站卖票. * ...

  7. 图片上传--base64

    <?php defined('BASEPATH') OR exit('No direct script access allowed'); include_once (APPPATH . &qu ...

  8. Python 常用的标准库以及第三方库有哪些?

    作者:史豹链接:https://www.zhihu.com/question/20501628/answer/223340838来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. Python 编写代码 检查是否遵循PEP 8标准

    实际上并非必须遵守PEP 8,但是它已经成为一个默认的.约定俗成的规则,可以使代码风格更统一,提高可读性. 由于最近一直在学习Ubuntu,因此此处仍然以Ubuntu为例,介绍一下规则检查工具,它能帮 ...

  10. ArrayList与LindedList区别

    1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList ...