Hive Tuning(一) 连接策略

简介: 群里共享了一本hive调优的书记,名叫《Hive Tunning》,就忍不住开始看了,也顺便记录一下自己学到的东西,备忘!第一篇——“Hive Tuning(一) 连接策略”。
群里共享了一本hive调优的书记,名叫《Hive Tunning》,就忍不住开始看了,也顺便记录一下自己学到的东西,备忘!
首先,这是hive的数据摘要,别问我什么意思,我也没看懂。
4c22e24899abed69b468d7dca470befad9288a90
好,我们正式开始,首先是连接的问题,我们都知道连接耗时长,但是连接无法避免,那hive又是怎么处理连接操作的呢?
下面是hive的连接策略:
085bf50c221e80e4d157ad94815d99658bac8cc9
hive有 三种类型的连接策略:
(1)Shuffle Join : 这种类型的是通过map/reduce 来实现连接操作的,优点是不需要考虑数据的大小和分布,缺点是消耗大量的资源而且是最慢的。
(2)Broadcast Join:这种类型的方式是把一个小的表在所有节点中加载到内容当中,然后用mapper来扫描大表进行连接,速度非常快,但是其中一个表必须可以加载到内存当中。
(3)Sort-Merge-Bucket Join:mapper可以协同定位keys去进行高效的连接,速度很快,不需要考虑表的大小,但是数据必须先排序和整理。
Shuffle Join:
2d4cce36310ea85507195a416a9cc76b4e5370ab
我们以这个销售订单这个例子来做演示,可以看到其中的图,它们是通过customer.id=order.cid来做连接的,首先Map把两个表中的数据处理成以连接字段为key,其他字段为value的作为输出,然后把两个表中id和cid相同的数据传递到同一个reducer中,从网络使用率上看是很奢侈的。
Broadcast Join:
6771511e8adbe57f06bca2a227ccd89632d4f9f7
这种方式比较复杂一点,首先它使用足够小的维度表来存放在所有的节点当中,单独扫描大表,然后根据模式匹配进行连接。
当两个表都很大的情况下:
7c819ad08ed0aaf442374b31e5fdbecdd5a8799f
第一步,首先按照连接字段排序,所有可能的匹配的都在硬盘的同一块区域。
9090310e9bbf0811c103e4dbfe31fbc2b94eeb79
第二步,把所有的值都移到同一个节点下面进行等值连接,不需要再进行shuffle。
3a1fb8adde437c9eeffe8d1a26fe682b9d591ae0
80d9dea202b21cfd2507ae17afad1185608d429b
Bucketing: 
– Hash partition values into a configurable number of buckets. 
– Usually coupled with sorting. 
• Skews: 
– Split values out into separate files. 
– Used when certain values are frequently seen. 
• Replication Factor: 
– Increase replication factor to accelerate reads. 
– Controlled at the HDFS layer. 
• Sorting: 
– Sort the values within given columns. 
– Greatly accelerates query when used with ORCFilefilter pushdown.
这里就不解释了,自己看吧,这和下面的图是对应的,针对不同大小的表,hive有多种处理模式。
9222f688f1320856a3af132374766753305acc17
(1)小表,经常要用的数据,建议使用replication factor,可能是缓存的意思,具体是什么意思,等我清楚了再给大家解释。
(2)任意大小的表,有很多要精确查询的列,建议先按照最常使用的列进行排序再进行查询。
(3)大表但是又需要和另外的的大表做连接,建议先通过连接列做排序和bucket。
(4)大表,但只是利用到其中某些常用的值,可以把常用的值弄个单独的skew中。
(5)大表但是有一些自然边界,比如日期的,建议利用日期进行分区。
Map Join开启
我们可以启用连接自动转换来帮助我们转换,在执行语句之前设置一下即可。它是经过优化的Map Join,无reducer。
set hive.auto.convert.join=true;
set hive.auto.convert.join.noconditionaltask = true;
set hive.auto.convert.join.noconditionaltask.size = 10000;
Skew Join
真实数据中数据倾斜是一定的, hadoop 中默认是使用
hive.exec.reducers.bytes.per.reducer = 1000000000
也就是每个节点的reduce 默认是处理1G大小的数据,如果你的join 操作也产生了数据倾斜,那么你可以在hive 中设定
set hive.optimize.skewjoin = true; 
set hive.skewjoin.key = skew_key_threshold (default = 100000)
hive 在运行的时候没有办法判断哪个key 会产生多大的倾斜,所以使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce, 一般可以设置成你
(处理的总记录数/reduce个数)的2-4倍都可以接受.
倾斜是经常会存在的,一般select 的层数超过2层,翻译成执行计划多于3个以上的mapreduce job 都很容易产生倾斜,建议每次运行比较复杂的sql 之前都可以设一下这个参数. 如果你不知道设置多少,可以就按官方默认的1个reduce 只处理1G 的算法,那么  skew_key_threshold  = 1G/平均行长. 或者默认直接设成250000000 (差不多算平均行长4个字节)
Sort-Merge-Bucket Join
如果表已经排序并且已经bucketed,可以启用SMB joins
set hive.auto.convert.sortmerge.join=true;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
set hive.auto.convert.sortmerge.join.noconditionaltask=true;
set hive.auto.convert.sortmerge.join.bigtable.selection.policy     
= org.apache.hadoop.hive.ql.optimizer.TableSizeBasedBigTableSelectorForAutoSMJ;
目录
相关文章
|
SQL HIVE
DataGrip连接Hive执行DDL操作报错:「FAILED: ParseException line 1:5 cannot recognize input near 'show' 'indexes' 'on' in ddl statement」
DataGrip连接Hive执行DDL操作报错:「FAILED: ParseException line 1:5 cannot recognize input near 'show' 'indexes' 'on' in ddl statement」
346 0
DataGrip连接Hive执行DDL操作报错:「FAILED: ParseException line 1:5 cannot recognize input near 'show' 'indexes' 'on' in ddl statement」
|
6月前
|
SQL 关系型数据库 MySQL
Mybatis-Plus(连接Hive)
Mybatis-Plus(连接Hive)
100 0
|
SQL HIVE Python
Window10 pyhive连接hive报错:Could not start SASL: b‘Error in sasl_client_start (-4) SASL(-4)
Window10 pyhive连接hive报错:Could not start SASL: b‘Error in sasl_client_start (-4) SASL(-4)
464 0
Window10 pyhive连接hive报错:Could not start SASL: b‘Error in sasl_client_start (-4) SASL(-4)
|
11月前
|
SQL 分布式计算 网络协议
hive连接被拒
connection refused
128 0
|
11月前
|
SQL 数据库 HIVE
Python连接Hive数据库
Python连接Hive数据库
|
SQL Java 数据库连接
本地客户端 dbeaver-连接HIVE库
本地客户端 dbeaver-连接HIVE库 hive库管理套件
本地客户端 dbeaver-连接HIVE库
|
SQL 分布式计算 数据管理
spark SQL配置连接Hive Metastore 3.1.2
Hive Metastore作为元数据管理中心,支持多种计算引擎的读取操作,例如Flink、Presto、Spark等。本文讲述通过spark SQL配置连接Hive Metastore,并以3.1.2版本为例。
spark SQL配置连接Hive Metastore 3.1.2
|
SQL Java HIVE
hive连接eclipse
如何在eclipse中写hive hadoop.proxyuser.qiqi.hosts 主节点地址 hadoop.
1460 0
|
SQL 测试技术 HIVE
0039-如何使用Python Impyla客户端连接Hive和Impala
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 1.文档编写目的 继上一章讲述如何在CDH集群安装Anaconda&搭建Python私有源后,本章节主要讲述如何使用Pyton Impyla客户端连接CDH集群的HiveServer2和Impala Daemon,并进行SQL操作。
3461 0
|
SQL Java 数据库连接
通过jdbc连接hive报java.sql.SQLException: Method not supported问题
通过jdbc连接hive报java.sql.SQLException: Method not supported异常或Required field 'client_protocol' is unset异常
14432 0