在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化:

1. 只支持等值连接

2. 底层会将写的HQL语句转换为MapReduce,并且reduce会将join语句中除最后一个表外都缓存起来

3. 当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce

具体的优化建议:

1. 合理的设置map和reduce数量

jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数,参数mapred.job.reuse.jvm.num.tasks

2. 对于任务重没有依赖关系的阶段开启并发执行,设置属性:set hive.exec.parallel=true

3. 查询分区表时,在查询条件中指定分区

4. 尽量使用left semi join 替代in、not in、exists

因为left semi join在执行时,对于左表中指定的一条记录,一旦在右表中找到立即停止扫描,效率更高

5. 当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算

6. 对于经常join的表,针对join字段进行分桶,这样在join时不必全表扫描

7. 小表进行mapjoin

如果在join的表中,有一张表数据量较小,可以存于内存中,这样该表在和其他表join时可以直接在map端进行,省掉reduce过程,效率高。设置方式主要分两种:

1)自动方式

set hive.auto.convert.join=true;hive.mapjoin.smalltable.filesize,设置可以mapjoin的表的大小,默认值是25Mb

2)手动方式

select  /*+ mapjoin(A)*/  x.a,  y.b from t_x x join t_y y on x.id=y.id;

8. 同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。

例如:任务重需要执行insert overwrite table t_y select * from t_x;和

insert overwrite table t_z select * from t_x;

可以优化成:from t_x insert overwrite table t_y select * insert overwrite table t_z select *

9. join中的数据倾斜处理

set hive.optimize.skewjoin=true;

set hive.skewjoin.key=100000;

当单个reduce节点处理数据阈值,会进行skewjoin,建议设置为平均数据量的2-4倍。

原理:会产生两个job,第一个job会将超过hive.skewjoin.key设置值的记录的key加上一些随机数,将这些相同的key打乱,然后分配到不同的节点上面进行计算。最后再启动一个job,在第一个job处理的基础上(即第一个job的reduce输出结果)再进行处理,将相同的key分发到相同的节点上处理。因为会产生两个job进行处理,在实际使用中还是要注意以及阈值的设置。

10. limit调优

limit语句通常是执行整个语句后返回部分结果。但通过设置参数set hive.limit.optimize.enable=true,将针对查询对元数据进行抽样。同时可能还需要设置以下两个参数:

set hive.limit.row.max.size=10000;设置最小的采样容量

set hive.limit.optimize.limit.file=20;设置最大的采样样本数

这种优化方式存在一个缺点:有可能部分数据永远不会被处理到


关注微信公众号:大数据学习与分享,获取更对技术干货

Hive Join优化的更多相关文章

  1. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...

  2. Hive Join优化经验

    大表x小表 这里可以利用mapjoin,SparkSQL中也有mapjoin或者使用广播变量能达到同样效果,此处描述HQL // 开启mapjoin并设定map表大小 set hive.auto.co ...

  3. hive join 优化

    common join : 即reducer join,瓶颈在shuffle阶段,会产生较大的网络io: map join:即把小表放前面,扫描后放入每个节点的内存,在map阶段进行匹配: 开启map ...

  4. hive的join优化

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

  5. Hive篇---Hive使用优化

    一.前述 本节主要描述Hive的优化使用,Hive的优化着重强调一个 把Hive SQL 当做Mapreduce程序去优化 二.主要优化点 1.Hive运行方式:本地模式集群模式 本地模式开启本地模式 ...

  6. Hive性能优化【严格模式、join优化、Map-Side聚合、JVM重用】

    一.严格模式 通过设置以下参数开启严格模式: >set hive.mapred.mode=strict;[默认为nonstrict非严格模式] 查询限制: 1.对于分区表,必须添加where查询 ...

  7. Hive性能优化

    1.概述 继续<那些年使用Hive踩过的坑>一文中的剩余部分,本篇博客赘述了在工作中总结Hive的常用优化手段和在工作中使用Hive出现的问题.下面开始本篇文章的优化介绍. 2.介绍 首先 ...

  8. Hive任务优化(2)

    JOIN优化 1.大多数情况下,Hive会对每对Join连接对象启动一个MapReduce任务. 2.多表关联时,如果每个ON子句都使用相同的连接键的话,那么只会产生一个MapReduce Job. ...

  9. Hive性能优化上的一些总结

    https://blog.csdn.net/mrlevo520/article/details/76339075 1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据 ...

随机推荐

  1. 脚手架安装react

    //1 npm install -g create-react-app //2 create-react-app xxx //xxx项目名称 //3 cd xxx //xxx项目名称 npm star ...

  2. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

  3. Git软件操作过程

    一.下载 Git 二.下载Git小乌龟-TortoiseGit 三.汉化-去官网下载,官网地址 https://tortoisegit.org/download/

  4. 例题3-3 回文词(Palindromes, UVa401)

    输入一个字符串,判断它是否为回文串以及镜像串.输入字符串保证不含数字0.所谓 回文串,就是反转以后和原串相同,如abba和madam.所有镜像串,就是左右镜像之后和原串相同,如2S和3AIAE.注意, ...

  5. PO模式学习笔记

    框架: 1.PO模式应用(测试对象和测试用例分离)(写到简历中) 2.引入ddt 3.深入分层:测试数据分离 4.遵循原则:测试用例的独立性 5.深入分层:元素定位分离 6.框架优化:提取basepa ...

  6. Java NIO:选择器

    最近打算把Java网络编程相关的知识深入一下(IO.NIO.Socket编程.Netty) Java NIO主要需要理解缓冲区.通道.选择器三个核心概念,作为对Java I/O的补充, 以提升大批量数 ...

  7. php 数组与URL相互转换

    php为了数组与url参数相互转换提供了两个函数: 1,数组转换为带&的URL的字符串 例如: $arr =['title'=>'我是小白','name'=>'真的很白','tex ...

  8. sync.WaitGroup的使用以及坑

    all goroutines are asleep - deadlock 简单使用: package main import ( "sync" ) type httpPkg str ...

  9. selenium 图片懒加载

    from selenium import webdriver options = webdriver.ChromeOptions() prefs = {} prefs['profile.managed ...

  10. UVA 12298 Super Poker II (FFT)

    #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using ...