hive的join优化

640?wx_fmt=png

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

640?wx_fmt=png

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

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

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

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

星型模型示例性能

 

原有的mapjoin优化

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

 

或者,也能够经过自动转换:htm

 

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

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吗?

640?wx_fmt=jpeg


文章来源:http://www.javashuo.com/article/p-enwodoxn-n.html

相关文章
相关标签/搜索