一、表设计

合理分表

合理设计表分区,静态分区、动态分区

二、扫描相关

1、谓词下推(Predicate Push Down)

2、列裁剪(Column Pruning)

在读数据的时候,只关心感兴趣的列,而忽略其他列

对于查询:select a,b from src where e < 10

其中,src包含5个列(a、b、c、d、e),列c、d将会被忽略,只会读取a,b,e列

选项默认为真,hive.optimize.cp=true

3、分区剪裁(Partition Pruning)

在查询的过程中减少不必要的分区

对于下列查询:select * from t1 join (select * from t2) subq on (t1.c1 = subq.c2) where subq.prtn =100;

会在子查询中就考虑subq.prtn =100条件,从而减少读入的分区数目

选项默认为真,hive.optimize.pruner=true

三、关联JOIN相关

1、JOIN操作左边为小表

应该将条目少的表/子查询放在Join操作符的左边。

原因是在Join操作的Reduce阶段,位于Join操作符左边的表的内容会被加载到内存,将条目少的表放在左边可以有效减少OOM(内存溢出)的几率

原理就是关系数据库中驱动表与被驱动表

如果是mapjoin,可以放在右边

2、JOIN启动的job个数

如果join的key相同,不管有多少个表,都会合并为一个Map-Reduce

一个Map-Reduce(Tez)任务,而不是‘n’个

在做outer join的时候也是一样

        insert over write table pv_users select pv.pageid,u.age from page_view pv join user u on (pv.userid=u.userid) join newuser x on (u.userid = x.userid)

3、MapJoin

join操作在map阶段完成,不再需要reduce,前提条件是需要的数据在map的过程可以访问到

新版本,Hint已经去了,这里只是演示,应该尽可能使用mapjoin

不会倾斜,默认64M来并发处理数据

对表的大小有限制,通常来讲大于100M,就做不了了

        insert over write table pv_users select /*+MAPJOIN(pv)*/pv.pageid,u.age from page_view pv join user u on (pv.userid=u.userid);

需要设置的相关数据hive.join.emit.inter-1,hive.mapjoin.size.key,hive.map-join.cache.numrows。

4、join不支持不等值连接

!=、<>、>、<在join的on条件中不支持

select ……from ……

join ……

on (a.key!=b.key)

因为如果用不等值号的话,它会查其他节点上的数据,那么其他查不到的,mapreduce是不支持这样的机制,所以hive是不支持不等值连接的

四、分组Group By相关

1、Skew In Data

主要关注的是数据倾斜

hive.groupby.skewindata = true

当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的

第二个MR Job再根据预处理的数据结果按照Group By Key分布  到Reduce中(这个过程可以保证相同的Group By Key被分布到一个Reduce中),最后完成最终的聚合操作

没法通过部分值推导出最终值的,如中位数和众数

五、合并小文件

合并功能会增加任务运行时间

合并操作的性能很大程度上取决与“单个reduce端输出文件大小”。Reduce端的输出越大,耗时越长

合并操作会对每个Hive任务增加一次MapRedce任务

原因:

Hive在处理时,Client会从MetaStore中把文件的名字读到内存中,小文件过多会导致在SQL解析过程中,可能就根本就解析不出来

通过合并Map和Reduce的结果文件来消除小文件影响。需要设定的参数:

hive.merge.mapfiles=true,是否合并Map输入文件默认为true。

hive.merge.mapredfiles=false,设定是否合并Reduce输出文件,默认为false。

hive.merge.size.per.task=256*1000*1000,设定合并文件的大小,默认为256000000。

六、多作业

共享中间结果集

多作业共用输入或输出,如下场景

每日几千个作业访问大日志表trackinfo

访问多个表的相同统计存在于很多作业里面

常用复杂或低效统计统计给出,以避免上层作业过多计算

七、参数调优

有时会起到很好效果

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】。
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】。
如果,您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是【刘超★ljc】。

本文版权归作者,禁止转载,否则保留追究法律责任的权利。

hive优化总结的更多相关文章

  1. Hive 12、Hive优化

    要点:优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解hadoop的核心能力,是hive优化的根本. 长期观察hadoop处理数据的过程,有几个显著的特征: 1. ...

  2. hive优化之——控制hive任务中的map数和reduce数

    一.    控制hive任务中的map数: 1.    通常情况下,作业会通过input的目录产生一个或者多个map任务.主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文 ...

  3. Hive优化案例

    1.Hadoop计算框架的特点 数据量大不是问题,数据倾斜是个问题. jobs数比较多的作业效率相对比较低,比如即使有几百万的表,如果多次关联多次汇总,产生十几个jobs,耗时很长.原因是map re ...

  4. 一起学Hive——总结常用的Hive优化技巧

    今天总结本人在使用Hive过程中的一些优化技巧,希望给大家带来帮助.Hive优化最体现程序员的技术能力,面试官在面试时最喜欢问的就是Hive的优化技巧. 技巧1.控制reducer数量 下面的内容是我 ...

  5. 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)

    第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...

  6. 大数据开发实战:Hive优化实战3-大表join大表优化

    5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个具体的问题场景,然后基于此介绍各自优 ...

  7. 大数据开发实战:Hive优化实战1-数据倾斜及join无关的优化

    Hive SQL的各种优化方法基本 都和数据倾斜密切相关. Hive的优化分为join相关的优化和join无关的优化,从项目的实际来说,join相关的优化占了Hive优化的大部分内容,而join相关的 ...

  8. Hadoop生态圈-hive优化手段-作业和查询优化

    Hadoop生态圈-hive优化手段-作业和查询优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  9. 【转】Hive优化总结

    优化时,把hive sql当做map reduce程序来读,会有意想不到的惊喜. 理解Hadoop的核心能力,是hive优化的根本.这是这一年来,项目组所有成员宝贵的经验总结.   长期观察hadoo ...

  10. hive 优化 (转)

    Hive优化 Hive优化目标 在有限的资源下,执行效率更高 常见问题 数据倾斜 map数设置 reduce数设置 其他 Hive执行 HQL --> Job --> Map/Reduce ...

随机推荐

  1. Android -- 再来一发Intent

    之前写过一篇Intent的博客,主要说了一下隐式意图. 传送门:<Android -- Intent> Intent对象构成 Component name.Action.Data.Cate ...

  2. HTML-Html开发之Viewport的使用

    近年来随着移动端的快速发展,越来越多传统的web应用需要适配移动终端,下面记录一下如何通过viewport实现简单的不同型号的手机端的适配问题.不过在此之前,介绍一下如何通过Chrome浏览器,调试在 ...

  3. (剑指Offer)面试题8:旋转数组的最小数字

    题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转 ...

  4. 【Android实战】----基于Retrofit实现多图片/文件、图文上传

    本文代码详见:https://github.com/honghailiang/RetrofitUpLoadImage 一.再次膜拜下Retrofit Retrofit不管从性能还是使用方便性上都非常屌 ...

  5. C#基础视频教程5.1 如何编写简单的超级热键

    我们上一节介绍了编写简单计算器,实际上也是出于实用角度(这个计算器只要你肯改,肯定能做的比微软自带的计算器好用).这一节介绍做简单的超级热键(所谓的超级热键是指自定义快捷键的功能) 超级热键的最关键一 ...

  6. Discuz常见小问题-如何快速清除帖子

    看别人发的垃圾帖,然后鼠标移到用户名上面,在弹出菜单中点击禁止用户   设置禁止访问-全选所有,删除   然后短期内无法看到效果,帖子还在,你点进去会报错说指定的主题不存在   过三十分钟再刷新页面, ...

  7. KineticJS教程(3)

    KineticJS教程(3) 作者: ysm  3.图形对象 3.1.Shape Kinetic提供了一个Shape对象用于在层上绘制图形,我们可以通过Kinetic.Shape()构造方法返回一个S ...

  8. STL之hashtable源代码剖析

    // Filename: stl_hashtable.h /////////////////////////////////////////////////////////////////////// ...

  9. oracle 存储过程 返回结果集

      oracle 存储过程 返回结果集 CreationTime--2018年8月14日09点50分 Author:Marydon 1.情景展示 oracle存储过程如何返回结果集 2.解决方案 最简 ...

  10. 〖Linux〗Bash快捷键使用

    这篇 Bash Shell Shortcuts 的快捷键总结的非常好.值得学习.下面内容大多数是拷贝粘贴与总结. CTRL 键相关的快捷键: Ctrl + a - Jump to the start ...