Hive性能调优实战读书笔记
1、感受Hive调优多样性
(1)SQL书写方式
举的是multi-insert的例子
(2)文件块大小
输入文件划分与Map数量
(3)数据格式
SequenceFile 二进制key/value结构平面分拣
Parquet列式数据存储格式
ORC优化RCFile存储,主流选择
(4)表设计
分区、分桶
2、hive优化瓶颈
(1)磁盘——优化存储
(2)IO——优化执行过程
(3)内存——优化作业调度
3、调优的原则
需求
架构
4、调优一般性过程
(1)选择性能评估及各自目标
(2)分析系统组件和服务定义性能目标
(3)明确当前环境下各个组件性能
(4)分析定位性能瓶颈
(5)优化产生性能瓶颈的程序或系统
(6)性能监控和告警
5、Hive元数据
(1)数据库元数据
(2)表相关元数据--表名、表基本统计信息、授权情况
(3)分区相关元数据--分区信息、分区统计信息、分区授权信息
(4)文件存储相关元数据--HDFS路径地址、输入格式、输出格式、分桶、字段名称、类型等1
(5)其他--锁信息、权限相关信息
6、常见HDFS优化
(1) Hive作用生成的小文件
2、合理的HDFS文件块大小
3、增加namenode的java堆
4、在集群进行扩容和缩容时,调整namenode服务处理程序计数和处理程序计数
5、写入大文件,尝试启用写入后清理缓存
6、多随机读、一次性读取大数据文件,启用读取后清理缓存
7、集群单机性能高可增加处理程序计数
8、HDFS读取数据时会开启HDFS快速读取
7、MR过程
image.pngMap端
(1) Map启动耗时 控制map数量 mapred.map.tasks marped.min.split.size
(2) Mapper启动向量化操作,批量处理数据
(3) map join自动优化
(4) hive.mapjoin.smalltable.filesize大小表join 小表小于该值则开启mapjoin自动优化
(5) hive.map.aggr 是否开启map端聚合
(6) hive.map.aggr.hash.percentmemory 开启map任务聚合,聚合使用的hash表可达到mapper内存的多少
(7) hive.mapjoin.optimize.hashtabel.wbsize 优化的hash表使用的是一种链块内存,该值是一个块的大小
(8) hive.vectorized.execution.mapjoin.naive.enabled 是否使用原生的向量化执行模式执行mapjoin
Reduce端
(1) Reducer数量 mapred.reduce.tasks
(2) hive.exec.reducers.bytes.per.reduce 每个reducer处理的数据量
(3) hive.exec.reducers.max 一个作业运行的最大reducers数
(4) hive.multigroupby.singlereducer 如果分组聚合的字段是一样,则可以设置为一个reducer解决
(5) hive.mapred.reduce.tasks.speculative.execution 如果按相同的key再次聚合,可开启
(6) hive.vectorized.execution.reduce.enabled 表示是否启用reducer端的向量化模式,mapreduce模型不支持reduce端的向量化模式
Shuffle
为什么不直接推给reducer,因为reducer异常结束时,可以从hdfs拉取正常的数据。保证HDFS能在廉价服务器稳定的传递数据
Map结束后的排序是为了reduce拉取不要频繁地搜索磁盘
Combiner
开启了之后,执行计划里会多一个Group by Operator
hive.groupby.mapaggr.checkinterval:默认值100000,启用combiner会尝试去这个配置对应的数据量进行聚合
hive.map.aggr.hash.percentmemory:默认值0.5,标识进行mapper端聚合占用的最大内存
hive.map.aggr.hash.force.flush.memory.threhold:默认值为0.9 如果聚合时Hash表占用内存超过0.9,开始刷磁盘,默认512MB
小文件
hive.merge.mapfile参数 合并只有map任务作业的输出文件
hive.merge.mapdfiles 合并MapReduce作业最终的输出文件
hive.merge.smallfiles.avgsize,默认16M,当输出文件小于该值,启用合并
hive.merge.size.per.task 默认256M 每个任务合并后文件的大小
其他配置
hive.optimize.countdistinct: 当进行去重技术时,作业会分为两个来进行处理
hive.exec.parallel:是否开启作业并行
hive.exec.parallel.thread.num:默认值是8,最多可以并行的作业数量
hive.exec.mode.local.auto:是否开启本地执行模式
hive.optimize.correlation:默认false,相关性优化,可以减少重复性shuffle,比如join和group by都涉及的key
8、Hive执行过程
explain dependency
可以查看内外部表、分区等信息,排查由分区造成的错误
还可以看出连接时取分区的情况,比如内连接on后面的过滤条件并不会进行分区的选择
左外连接 on 后面的 右表过滤条件生效 左表全扫
Map端如果有combiner就会有group by operator
窗口函数
Map table scan - reduce output operator
reduce TPF operator操作窗口函数
连接
在tablescan - filter - reduce output
join operator
left semi join
在子表会多一个group by operator 数据去重,减少输出量
9、Hive数据处理模式
(1)过滤
where在map端进行过滤,减少数据传输
having发生在reduce端,在reduce operator 和 group by operator之后,分组聚合时进行过滤
distinct操作在reduce端,将进行分组聚合,hive也有可能使用hash表去重
分桶过滤,按照相同值进行分桶
(2)聚合
count(*) count(1)性能更优,
collect_list不可计算中间结果,map也会汇总一部分,需要注意会不会倾斜
(3)连接
map join 先启动一个小作业,读取小表数据,内存构建hash表,然后写入本地磁盘,将hash表上传到hdfs并添加到分布式缓存中,再启动一个任务读取b表数据,连接时就通过读取hash内容进行连接
hive.mapjoin.followby.gby.localtask.max.memory.usage:默认0.55,如果mapjoin后面还有group by那就只有55%内存给哈希表缓存数据
桶连接、smb join(排序桶连接) map形式
倾斜连接,一种方式是指定倾斜健,将指定的数据分割成单独的数据文件或目录,这样可以加快数据过滤从而提升运行速度。倾斜键数值会被单独处理。
hive.optimize.skewjoin 默认值weifalse
hive.skewjoin.key 默认值100000,如果键行数多于这个数,那么就会作为倾斜键处理
hive.skewjoin.mapjoin.map.tasks 倾斜键连接做mapjoin的map任务个数
Calcite是一个基于成本优化器的SQL执行查询执行框架
CBO会根据表的元信息自动地进行表连接顺序排序,bushy tee连接改变了左深数连接模式
10、Yarn日志
(1)RM UI
Cluster下面
Applications 查看作业概况
Scheduler 查看Yarn调度器
Tools下面
Configuration 查看xml配置
Local logs 查看日志
(2)RM日志
metrics 作业个数、等待执行/运行的作业个数、预留内存等
cluster node metrics 查看节点健康情况
cluster overview 查看集群信息、RM启动时间等
(3)集群节点概况
cluster下的node 几家、节点状态、节点已用内存、可用内存、心跳报告路径、HTTP接口
单机HTTP地址,可查看node详细信息
list of applications可以看到节点正在运行的作业相关信息
(4)队列调度情况
子队列情况、队列使用资源情况
(5)问题排查
集群作业情况:重点管制accept、running、finish、failed、killed,了解作业启动、运行、持续等元数据,可以为作业建立画像
作业运行情况:tracking UI 查看map时间、shuffle时间、merge时间、reduce时间
作业计数器:
HDFS 一个作业写HDFS次数、数量
FILE 写本地文件次数、数据量
MR框架计数器 MAP REDUCE数量,输出的记录数、数据量
HIVE计数器 任务结束后创建的文件数、反序列化错误数 输出记录数 中间结果记录数
SHUFFLE错误技术 IO异常数量 MAPREDUCE异常数量
FILE INPUT/OUTPUT FORMAT COUNTERS map读和reduce写输出的value值数据量
11、数据存储
(1)ORC格式
图片.png
ORC文件由三部分组成:条带(实际存储位置)、文件脚注(strip信息)、postscript(压缩信息)
strip也分为三部分:index data(保存了所在条带的统计信息,数据的位置索引信息)、row data(数据存储的地方)、strip footer(数据保存的文件目录)
ORC为文件提供了三个级别的索引:
文件级别,记录文件中所有stripe位置信息,存储的每列数据统计信息
条带级别,记录索引记录每个stripe所存储数据的统计信息
行组组别,在stripe中,没1w行构成一个行组,记录行组中存储数据的信息
(2)parquet
图片.png
也会记录元数据,包括表级别的元数据、列块的元数据信息、页头的元数据信息
ORC在数据大区时进行了优化,增强了数据读取效率
12、各种监控
(1)Hive数据库监控
analyze table 表名 compute statistics
analyze table 表名 compute statistics for columns
analyze table 表名 partition(分区列) compute statistics
......
监控文件存储的平均大小,较大的文件块可能读取数据时发生倾斜
监控分区存储大小
监控大表不分区的表
监控分区列不均匀的数据
监控存储格式非ORC Parquet
监控使用索引的表,索引对hive效率不高,因为每次有数据时需要及时更新索引,相当于重建新表
查询表字段空值率以及字段重复占比
监控分区字段空值率
监控hive表分区数
(2)监控集群的状态
获取集群的状态
获取集群任务整体状态
获取提交到集群所有任务的运行信息
获取当前资源调度分配信息
13、问题排查
(1)大小文件问题
图片.png
如果一个可分割大文件呗多个map读取,会丧失任务执行本地化,需要跨服务其读取存储在不同服务器的文件
(2)reduce数据倾斜
对比reduce任务耗时即可发现
(3)缓慢shuffle
elapsed time shuffle
14、数据倾斜
导致数据倾斜的常见原因包括:读取大文件、需要处理大量相同键的数据
(1)不可拆分大文件引发的数据倾斜
不可分割的压缩格式:GZIP,如果该压缩文件很大,map就要花费很多时间进行读取,尽量采用bzip和zip等支持分割的压缩算法
(2)NULL值或热点值
随机数填充打散
(3)多维聚合引发数据膨胀
rollup cube等,如果map端聚合得不好,map端输出得数据量将会很大
hive.new.job.grouping.set.cardinality可对任务进行拆解
(4)中间结果无法削减
例如collect_list,同时key又有倾斜
解决这类问题最直接得方式时调整reduce执行得内存大小
(5)两个hive数据表连接发生数据倾斜
hive处理方式时启用两个作业,一个作业处理没有倾斜得数据,第二个作业将倾斜得数据存到分布式缓存中,分发到各个map任务所在的节点,进行mapjoin。
15、Hive知识体系
图片.png 图片.png未被external修饰的是内部表(managed table),被external修饰的为外部表(external table);
区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
分区表、桶排序表、倾斜表、临时表、事务表
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。