Hive Tuning(一) 连接策略

群里共享了一本hive调优的书记,名叫《Hive Tunning》,就忍不住开始看了,也顺便记录一下自己学到的东西,备忘! 首先,这是hive的数据摘要,别问我什么意思,我也没看懂。

好,我们正式开始,首先是连接的问题,我们都知道连接耗时长,但是连接无法避免,那hive又是怎么处理连接操作的呢? 下面是hive的连接策略

hive有三种类型的连接策略 (1)Shuffle Join : 这种类型的是通过map/reduce 来实现连接操作的,优点是不需要考虑数据的大小和分布,缺点是消耗大量的资源而且是最慢的。 (2)Broadcast Join:这种类型的方式是把一个小的表在所有节点中加载到内容当中,然后用mapper来扫描大表进行连接,速度非常快,但是其中一个表必须可以加载到内存当中。 (3)Sort-Merge-Bucket Join:mapper可以协同定位keys去进行高效的连接,速度很快,不需要考虑表的大小,但是数据必须先排序和整理。

Shuffle Join:

我们以这个销售订单这个例子来做演示,可以看到其中的图,它们是通过customer.id=order.cid来做连接的,首先Map把两个表中的数据处理成以连接字段为key,其他字段为value的作为输出,然后把两个表中id和cid相同的数据传递到同一个reducer中,从网络使用率上看是很奢侈的。

Broadcast Join:

这种方式比较复杂一点,首先它使用足够小的维度表来存放在所有的节点当中,单独扫描大表,然后根据模式匹配进行连接。

当两个表都很大的情况下:

第一步,首先按照连接字段排序,所有可能的匹配的都在硬盘的同一块区域。

第二步,把所有的值都移到同一个节点下面进行等值连接,不需要再进行shuffle。


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有多种处理模式。

(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;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

考点总结:互联网校招技术岗都考些什么?数据结构算法游戏 + 场景c++面向对象javaJVMSpringandroid数据库计网线程安全linux前端询问面试官

数据结构 红黑树 pk 平衡二叉树 hash表处理冲突的方法 算法 手写 最长无重复字符子串 链表的增、删、查、逆序 数组实现队列,要求可以动态扩展,保证较高的...

38170
来自专栏菩提树下的杨过

velocity模板引擎学习(1)

velocity与freemaker、jstl并称为java web开发三大标签技术,而且velocity在codeplex上还有.net的移植版本NVeloc...

22850
来自专栏架构之路

追源索骥:透过源码看懂Flink核心框架的执行流程

写在最前:因为这篇博客太长,所以我把它转成了带书签的pdf格式,看起来更方便一点。想要的童鞋可以到我的公众号“老白讲互联网”后台留言flink即可获取。

3.7K60
来自专栏TungHsu

【干货】什么?Python3.X不能输出中文?原来是编辑器geany的锅?!

小白说我要开始学Python了,既然3.X支持中文,那就学3吧。于是安装好Python环境,下载好geany就开始写了。 先写个“Hello World”吧,作...

49460
来自专栏互联网杂技

重新认识javascript的settimeout和异步

今晚看到QLeelulu的一道JavaScript面试题(setTimeout),稍微想了一下,好不容易连猜带蒙,凑巧说对了答案。但是原因到底是什么呢?自己一时...

34690
来自专栏web编程技术分享

【手把手】JavaWeb 入门级项目实战 -- 文章发布系统 (第五节)

482110
来自专栏java思维导图

值得收藏!Redis五大数据类型应用场景(二)

Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数...

20120
来自专栏java一日一条

Web前端面试题目及答案汇总

以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中无法解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢...

3.5K20
来自专栏偏前端工程师的驿站

JS读书心得:《JavaScript框架设计》——第12章 异步处理

一、何为异步                                 执行任务的过程可以被分为发起和执行两个部分。 同步执行模式:任务发起后必须等待直...

22570
来自专栏Golang语言社区

Go语言实战: 编写可维护Go语言代码建议

大家好, 我在接下来的两个会议中的目标是向大家提供有关编写Go代码最佳实践的建议。

24930

扫码关注云+社区

领取腾讯云代金券