一、SQL优化
### --- SQL优化~~~     列裁剪和分区裁剪
~~~     列裁剪是在查询时只读取需要的列;分区裁剪就是只读取需要的分区。
~~~     简单的说:select 中不要有多余的列,坚决避免 select * from tab;

### --- 查询分区表,不读多余的数据;select uid, event_type, record_data
from calendar_record_log
where pt_date >= 20190201 and pt_date <= 20190224
and status = 0;

### --- sort by 代替 order by~~~     # HiveQL中的order by与其他关系数据库SQL中的功能一样,是将结果按某字段全局排序,
~~~     这会导致所有map端数据都进入一个reducer中,在数据量大时可能会长时间计算不完。
~~~     如果使用sort by,那么还是会视情况启动多个reducer进行排序,并且保证每个reducer内局部有序。
~~~     # 为了控制map端数据分配到reducer的key,往往还要配合distribute by 一同使用。
~~~     如果不加 distribute by 的话,map端数据就会随机分配到reducer。

### --- group by 代替 count(distinct)~~~     当要统计某一列的去重数时,如果数据量很大,count(distinct) 会非常慢。
~~~     原因与order by类似,count(distinct)逻辑只会有很少的reducer来处理。
~~~     此时可以用group by 来改写:
~~~     这样写会启动两个MR job(单纯distinct只会启动一个),
~~~     所以要确保数据量大到启动job的overhead远小于计算耗时,才考虑这种方法。
~~~     当数据集很小或者key的倾斜比较明显时,group by还可能会比distinct慢。

~~~     # 原始SQL
select count(distinct uid)
from tab;~~~     # 优化后的SQL
select count(1)
from (select uid
from tab
group by uid) tmp;

二、group by 配置调整
### --- map端预聚合
~~~     group by时,如果先起一个combiner在map端做部分预聚合,可以有效减少shuffle数据量。
~~~     -- 默认为trueset hive.map.aggr = true

~~~     # Map端进行聚合操作的条目数
~~~     通过hive.groupby.mapaggr.checkinterval 参数也可以设置map端预聚合的行数阈值,
~~~     超过该值就会分拆job,默认值10W。set hive.groupby.mapaggr.checkinterval 1 = 100000

### --- 倾斜均衡配置项~~~     group by时如果某些key对应的数据量过大,就会发生数据倾斜。
~~~     Hive自带了一个均衡数据倾斜的配置项hive.groupby.skewindata ,默认值false。
~~~     其实现方法是在group by时启动两个MR job。第一个job会将map端数据随机输入reducer,
~~~     每个reducer做部分聚合,相同的key就会分布在不同的reducer中。
~~~     第二个job再将前面预处理过的数据按key聚合并输出结果,这样就起到了均衡的效果。
~~~     但是,配置项毕竟是死的,单纯靠它有时不能根本上解决问题,
~~~     建议了解数据倾斜的细节,并优化查询语句。

三、join基础优化:Hive join的三种方式
### --- common join~~~     普通连接,在SQL中不特殊指定连接方式使用的都是这种普通连接。
~~~     缺点:性能较差(要将数据分区,有shuffle)
~~~     优点:操作简单,普适性强

### --- map join
~~~     map端连接,与普通连接的区别是这个连接中不会有reduce阶段存在,连接在map端完成~~~     # 适用场景:
~~~     大表与小表连接,小表数据量应该能够完全加载到内存,否则不适用
~~~     # 优点:
~~~     在大小表连接时性能提升明显,

~~~     # 备注:
~~~     Hive 0.6 的时候默认认为写在select 后面的是大表,前面的是小表,
~~~     或者使用/*+mapjoin(map_table) / 提示进行设定。select a., b.* from a join b on a.id =b.id【要求小表在前,大表之后】
~~~     hive 0.7 的时候这个计算是自动化的,它首先会自动判断哪个是小表,哪个是大表,
~~~     这个参数由(hive.auto.convert.join=true)来控制,
~~~     然后控制小表的大小由(hive.smalltable.filesize=25000000)参数控制(默认是25M),
~~~     当小表超过这个大小,hive 会默认转化成common join。
~~~     Hive 0.8.1,hive.smalltable.filesize => hive.mapjoin.smalltable.filesize
~~~     # 缺点:
~~~     使用范围较小,只针对大小表且小表能完全加载到内存中的情况。

### --- bucket map join~~~     # 分桶连接:Hive 建表的时候支持hash 分区通过指定clustered by (col_name,xxx )into number_buckets buckets 关键字.
~~~     当连接的两个表的join key 就是bucketcolumn 的时候,
~~~     就可以通过设置hive.optimize.bucketmapjoin= true 来执行优化。

~~~     # 原理:通过两个表分桶在执行连接时会将小表的每个分桶映射成hash表,
~~~     每个task节点都需要这个小表的所有hash表,但是在执行时只需要加载该task所持有大表分桶对应的小表部分的hash表就可以,
~~~     所以对内存的要求是能够加载小表中最大的hash块即可。~~~     # 注意点:小表与大表的分桶数量需要是倍数关系,这个是因为分桶策略决定的,
~~~     分桶时会根据分桶字段对桶数取余后决定哪个桶的,所以要保证成倍数关系。
~~~     # 优点:比map join对内存的要求降低,能在逐行对比时减少数据计算量(不用比对小表全量)
~~~     # 缺点:只适用于分桶表

### --- 利用map join特性~~~     map join特别适合大小表join的情况。Hive会将build table和probe table在map端直接完成join过程,
~~~     消灭了reduce,效率很高。
~~~     map join的配置项是hive.auto.convert.join ,默认值true。
~~~     当build table大小小于hive.mapjoin.smalltable.filesize 会启用map join,
~~~     默认值25000000(约25MB)。还有hive.mapjoin.cache.numrows ,
~~~     表示缓存build table的多少行数据到内存,默认值25000。

select a.event_type, b.upload_time
from calendar_event_code a
inner join (
select event_type, upload_time from calendar_record_log
where pt_date = 20190225
) b on a.event_type = b.event_type;

### --- 分桶表map join~~~     map join对分桶表还有特别的优化。
~~~     由于分桶表是基于一列进行hash存储的,因此非常适合抽样(按桶或按块抽样)。
~~~     它对应的配置项是hive.optimize.bucketmapjoin 。

### --- 倾斜均衡配置项~~~     这个配置与 group by 的倾斜均衡配置项异曲同工,通过hive.optimize.skewjoin来配置,默认false。
~~~     如果开启了,在join过程中Hive会将计数超过阈值hive.skewjoin.key (默认100000)
~~~     的倾斜key对应的行临时写进文件中,然后再启动另一个job做map join生成结果。
~~~     通过hive.skewjoin.mapjoin.map.tasks 参数还可以控制第二个job的mapper数量,默认10000。

### --- 处理空值或无意义值~~~     日志类数据中往往会有一些项没有记录到,其值为null,或者空字符串、-1等。
~~~     如果缺失的项很多,在做join时这些空值就会非常集中,拖累进度【备注:这个字段是连接字段】。
~~~     若不需要空值数据,就提前写 where 语句过滤掉。需要保留的话,
~~~     将空值key用随机方式打散,例如将用户ID为null的记录随机改为负值:

select a.uid, a.event_type, b.nickname, b.age
from (
select
(case when uid is null then cast(rand()*-10240 as int) else
uid end) as uid,
event_type from calendar_record_log
where pt_date >= 20190201
) a left outer join (
select uid,nickname,age from user_info where status = 4
) b on a.uid = b.uid;

### --- 单独处理倾斜key~~~     如果倾斜的 key 有实际的意义,一般来讲倾斜的key都很少,此时可以将它们单独抽取出来,
~~~     对应的行单独存入临时表中,然后打上一个较小的随机数前缀(比如0~9),最后再进行聚合。
~~~     不要一个Select语句中,写太多的Join。一定要了解业务,了解数据。
~~~     (A0-A9)分成多条语句,分步执行;(A0-A4; A5-A9);先执行大表与小表的关联;

### --- 调整 Map 数~~~     通常情况下,作业会通过输入数据的目录产生一个或者多个map任务。主要因素包括:
~~~     输入文件总数
~~~     输入文件大小
~~~     HDFS文件块大小
~~~     map越多越好吗。当然不是,合适的才是最好的。
~~~     如果一个任务有很多小文件(<< 128M),每个小文件也会被当做一个数据块,用一个 Map Task 来完成。
~~~     一个 Map Task 启动和初始化时间 >> 处理时间,会造成资源浪费,而且系统中同时可用的map数是有限的。

### --- 对于小文件采用的策略是合并。~~~     每个map处理接近128M的文件块,会有其他问题吗。也不一定。
~~~     有一个125M的文件,一般情况下会用一个Map Task完成。
~~~     假设这个文件字段很少,但记录数却非常多。
~~~     如果Map处理的逻辑比较复杂,用一个map任务去做,性能也不好。

### --- 对于复杂文件采用的策略是增加 Map 数。
~~~     调整maxSize最大值。让maxSize最大值低于blocksize就可以增加map的个数。
~~~     建议用set的方式,针对SQL语句进行调整。computeSliteSize(max(minSize, min(maxSize, blocksize))) =
blocksize
minSize : mapred.min.split.size (默认值1)
maxSize : mapred.max.split.size (默认值256M)

### --- 调整 Reduce 数
~~~     reducer数量的确定方法比mapper简单得多。使用参数mapred.reduce.tasks 可以直接设定reducer数量。如果未设置该参数,Hive会进行自行推测,逻辑如下:
~~~     参数hive.exec.reducers.bytes.per.reducer 用来设定每个reducer能够处理的最大数据量,默认值256M
~~~     参数hive.exec.reducers.max 用来设定每个job的最大reducer数量,默认值999(1.2版本之前)或1009(1.2版本之后)
~~~     得出reducer数: reducer_num = MIN(total_input_size /reducers.bytes.per.reducer, reducers.max)~~~     # 即: min(输入总数据量 / 256M, 1009)
~~~     reducer数量与输出文件的数量相关。如果reducer数太多,会产生大量小文件,对HDFS造成压力。如果reducer数太少,每个reducer要处理很多数据,容易拖慢运行时间或者造成OOM。

三、优化小结
### --- 优化小结
~~~     深入理解 Hadoop 的核心能力,对Hive优化很有帮助。Hadoop/Hive 处理数据过程,~~~     # 有几个显著特征:
~~~     不怕数据多,就怕数据倾斜
~~~     对 job 数比较多的作业运行效率相对比较低,比如即使有几百行的表,多次关联多次汇总,
~~~     产生十几个jobs,执行也需要较长的时间。MapReduce 作业初始化的时间是比较长的
~~~     对sum、count等聚合操作而言,不存在数据倾斜问题
~~~     count(distinct) 效率较低,数据量大容易出问题

### --- 从大的方面来说,优化可以从几个方面着手:~~~     # 好的模型设计,事半功倍
~~~     解决数据倾斜问题。仅仅依靠参数解决数据倾斜,是通用的优化手段,收获有限。
~~~     开发人员应该熟悉业务,了解数据规律,通过业务逻辑解决数据倾斜往往更可靠
~~~     # 减少 job 数
~~~     设置合理的map、reduce task数
~~~     对小文件进行合并,是行之有效的提高Hive效率的方法
~~~     优化把握整体,单一作业的优化不如整体最优

CC00027.hadoop——|HadoopHive.V27|——|Hive.v27|Hive优化策略|实战.v03|相关推荐

  1. 千万级流量的优化策略实战

    摘要 性能优化涉及面很广.一般而言,性能优化指降低响应时间和提高系统吞吐量两个方面,但在流量高峰时候,性能问题往往会表现为服务可用性下降,所以性能优化也可以包括提高服务可用性.在某些情况下,降低响应时 ...

  2. BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略

    BigData:大数据开发的简介.核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS.HBase.Hive}+Docker).经典场景应用之详细攻略 BigData:大数 ...

  3. 深入浅出学Hive:Hive优化

    目录: 初始Hive Hive安装与配置 Hive内建操作符与函数开发 Hive JDBC Hive参数 Hive高级编程 Hive QL Hive Shell基本操作 Hive优化 Hive体系结构 ...

  4. ssis组件_使用SSIS Hadoop组件连接到Apache Hive和Apache Pig

    ssis组件 In our previously published articles in this series, we talked about many SSIS Hadoop compone ...

  5. Hadoop的学习笔记(Hive|pig|zookeeper|hbase)

    轉載的,此筆記的鏈接地址請點擊此處 hadoop笔记本 <div class="postText"><div id="cnblogs_post_body ...

  6. 【hadoop生态之Hive】Hive的基本概念和安装【笔记+代码】

    一.Hive基本概念 1.1 什么是Hive Hive:由Facebook开源用于解决海量结构化日志的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提 ...

  7. [一起学Hive]之十二-Hive SQL的优化

    十一.Hive SQL的优化 本章只是从HQL层面介绍一下,日常开发HQL中需要注意的一些优化点,不涉及Hadoop层面的参数.配置等优化. 其中大部分是我之前发过的博客文章,这里整理了下. 11.1 ...

  8. Hive On Spark优化

    1.Hive官方建议的Hive On Spark优化 mapreduce.input.fileinputformat.split.maxsize=750000000hive.vectorized.ex ...

  9. hive的set优化_Hive优化(整理版)

    1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...

最新文章

  1. Cannot run Eclipse; JVM terminated. Exit code=13
  2. web标准---html、css、js分离
  3. 推荐CUDA程序优化的15个策略
  4. 【CyberSecurityLearning 46】PHP 函数
  5. OSPF动态路由协议(了解ospf,RIP协议,外部网关协议内部网关协议,ospf工作过程,选举过程,ospf邻居关系7个状态)
  6. java获取当前分钟_分别获取当前年月日 小时 分钟 秒 毫秒
  7. 头条号个人中心登录_微信个人订阅号开通了创作领域的认证!这是要跟头条看齐了吗?...
  8. vscode终端进程已终止 - 问题采集
  9. 安卓学习笔记22:常用控件 - 可展开列表视图
  10. 学生成绩查询系统用c语言,求学生学籍及成绩查询系统要用c语言做的,会做的帮个忙啊 爱问知识人...
  11. CentOS 6.5 yum安装配置lnmp服务器(Nginx+PHP+MySQL)
  12. 【转】HttpModule和HttpHandler(续)
  13. SSM_config配置springmvc.xml模板
  14. 贪心科技机器学习训练营(十一)
  15. win10安装Visual Studio2019时卡在了提取文件处
  16. 程序员如何做SOHO一族接私单做呢?
  17. [机器学习] 实验笔记 - 表情识别(emotion recognition)
  18. WebStorm下载、安装、配置/2022最新版
  19. c语言bcd错误数字还原,Windows10开机出现恢复界面且提示错误0xc0000034怎么办
  20. 小米5S TWRP刷面具、EdXposed

热门文章

  1. linux让前台程序脱离终端运行
  2. 【对学习现状的总结和思考】
  3. python pip 的安装、更新、卸载、降级、和使用 pip 管理包
  4. kill命令详解kill -9、kill -15区别
  5. 【RC延迟电路 RC充电电路】 multisim 14.0仿真 参数计算
  6. @Value(“${}“)获取不到配置文件值的原因
  7. ORM是什么? ORM框架是什么?
  8. unity3d Daikon GUI 图片查看器 Demo 说明
  9. Elasticsearch之指定分片、路由查询
  10. DirectShow编程(2)- 开始DirectShow旅程