Hive性能调优与实战节选

2024-05-23 06:58
文章标签 实战 性能 hive 调优 节选

本文主要是介绍Hive性能调优与实战节选,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

此文来自于《Hive性能调优与实战》,写的真不错,如有需要自行购买
京东 在这里仅用以笔记备忘,侵删!

一、什么是mapreduce的shuffle ?

shuffle的过程应该是从mapper的map方式输出到Reduce方法输入的过程. 非常关键的一个环节,制约了性能,保证了可以在廉价机器上可靠运行的一个环节。

在Mapper的map方法中,context.write 会讲数据计算所在的分区后写入到内存缓冲区(100mb)达到阈值0.8 也就是当写到80mb的时候开始启动新线程写入hdfs临时目录。目的是避免单行数据频繁写,以减轻磁盘负载。

在写到hdfs的过程中,为了下游的reducer任务顺序拉取数据,会讲数据排序后在写入到临时文件,当整个map执行介绍后会讲临时文件归并成一个文件。试想如果不对文件进行排序归并,那么下游的reducer任务拉取数据的时候就会频繁搜索磁盘,使得顺序读变为了随机读,极大的影响IO负载。

早期的spark shuffle 默认采用Hash based shuffle 会产生大量的临时文件,以至于下游读取需要很多的文件句柄,性能低下且容易oom。 因此spark 1.1开始引入Sort based shuffle才得意改善,且在spark2.0 正式废弃 Hash Based Shuffle. 事实上 Sort based shuffle也是借鉴了hasoop shuffle的思想。

继续说reduce,reduce任务启动后回启动拉取数据的线程,从HDFS拉取所需要的数据。
试想为啥不直接map完了直接推到对应的reduce节点上呢,这样可以节省写入磁盘的操作,性能更高?
因为采用缓存到hdfs,当一个reducer任务因为某些原因导致异常结束的时候,再启用一个新的依然可以读取到正确的结果。

从hdfs拉取数据回先缓存到内存缓冲区,当数据达到一定的阈值才会讲内存中的数据写入到内存或者磁盘文件中。文件数据量达到一定的量级还需要进行归并。(常见的表连接阶段)

二、发现并优化hive中的性能问题
收集表的元数据:

1、收集表的元数据

analyze table 表名 compute statistics

2、收集字段的元数据

analyze table 表名 compute statistics for columns

3、收集所有分区的元数据 (可能超时)

analyze table 表名 partition(分区列) compute statistics;

4、收集指定分区元数据

analyze table 表名 partition(分区列=分区值) compute;

5、收集所有分区列的元数据

analyze table 表名 partition(分区列) compute statistics for columns;
使用元数据做监控:

(1) 监控普通表存储的文件的平均大小 (2倍文件块大小)

SELECT
TBL_NAME,avgfilesize'fileSize(Mb)'
FROM (
SELECT 
tp.totalSize/(1024*1024)/numFiles avgfilessize,TBL_NAME
FROM DBS d 
INNER join  TBLS t on d.DB_ID = t.DB_ID
left join  (SELECT TBL_ID,MAX(case PARAM_KEY when 'numFiles' then PARAM_VALUE ELSE 0 END) numFiles,MAX(case (PARAM_KEY when 'totalSize' then PARAM_VALUE ELSE 0 END ) totalSizefrom TABLE_PARAMSGROUP by TBL_ID
) tp on t.TBL_ID = tp.TBL_ID
where d.`NAME` = 'database name'
and tp.numFiles  is not NULL
and tp.numFiles > 0
) a where  avgfileszie > hdfs文件块大小*2;

(2)监控分区存储的文件的大小

SELECT
TBL_NAME,part_name,avgfilesize'fileSize(Mb)'
FROM (
SELECT 
pp.totalSize/(1024*1024)/numFiles avgfilesize,TBL_NAME,part.PART_NAME
FROM DBS d 
INNER join  TBLS t on d.DB_ID = t.DB_ID
INNER join PARTITIONS part  on t.TBL_ID = part.TBL_ID
left join  (SELECT PART_ID,-- 每个表存储的文件个数MAX(case PARAM_KEY when 'numFiles' then PARAM_VALUE ELSE 0 END) numFiles,-- 文件存储的大小MAX(case (PARAM_KEY when 'totalSize' then PARAM_VALUE ELSE 0 END ) totalSizefrom PARTITION_PARAMSGROUP by PART_ID
) pp on part.PART_ID = pp.PART_ID
where d.`NAME` = 'database name'
and pp.numFiles  is not NULL
and pp.numFiles > 0
) a where  avgfileszie > hdfs文件块大小*2;

(3)监控大表不分区的的表

select t.TBL_NAME 
FROM DBS d
inner join TBLS t on d.`DB_ID` = t.`DB_ID`
inner join (select `TBL_ID`,max(case `PARAM_KEY` when 'totalSize' then `PARAM_VALUE` else 0 end) totalSizefrom `TABLE_PARAMS`group by `TBL_ID`) tp on t.`TBL_ID` = tp.`TBL_ID`
left join
(select distinct `TBL_ID` from PARTITIONING
) part on t.`TBL_ID` = part.`TBL_ID`
where d.`NAME` = '监控的库名'
and  part.`TBL_ID` is null
and totalSize/1024/1024/1024 > 30

(4)监控hive表的分区数

-- 监控hive的分区数
SELECT
t.TBL_NAME '表名',d.`NAME` '库名', COUNT(part.PART_NAME) '分区数'
FROM
DBS d
INNER JOIN TBLS t on d.DB_ID = t.DB_ID
INNER join `PARTITIONS` part  on part.TBL_ID = t.TBL_ID
WHERE d.`NAME` = '需要监控的库名'
GROUP by  t.TBL_NAME,d.`NAME`;

三、监控当前集群状态

1、获取集群的状态信息
get http://xx:8088/ws/v1/cluster

2、获取集群任务的整体信息
get http://xx:8088/ws/v1/cluster/metrics

3、获取集群任务的运行信息
get http://xx:8088/ws/v1/cluster/apps

4、单个任务的运行信息
get http://xx:8088/ws/v1/cluster/apps/任务ID

5、获取资源调度分配的信息
get http://xx:8088/ws/v1/cluster/scheduler

四、聊聊parquet 和orc存储格式

列式存储格式普遍具有如下特点:

  • 高效的压缩编码,用于降低存储成本
  • 高效的读取能力,用于支撑快速查询

parquet具有如下特点;

  • 列式存储
  • 自带Schema
  • 具备Predicate Filter特性

实践证明:使用orc存储可以有效借助于元数据快速筛掉不需要的数据,在查询时候锁消耗 的集群资源比parquet少。

具体参考:https://zhuanlan.zhihu.com/p/35622907

五、数据倾斜解决方案
  1. 不可拆分大文件引发的倾斜
    解决:写入的时候随机打散分多份,或者使用bzip2,zip等支持读取时分割的压缩算法。

  2. 业务无关的数据引发的数据倾斜
    解决:没啥好说的,过滤吧

  3. 多维聚合计算引发的数据倾斜

    比如:rollup 可以尝试将其拆分成普通的分组聚合。

  4. 无法削减中间结果的数据量引发的数据倾斜
    解决:一般情况下开启 hive.groupby.skewindata,但是对于collect_list的聚合函数没有效果,因为该函数要求全量操作数据的中间结果,明显起不到作用,反而会因为引入新的作业增加了磁盘和网络IO开销,从而导致性能更为低下。解决办法,调整reduce执行内存大小,使用mapreduce.reduce.memory.mb。 但是如果hive客户端连接的hiveserver2服务一次性需要返回处理的数据量很大,超过了hiveserver2设置的最大JAVA堆也是会导致内存溢出的,所以请评估好在用。

  5. 两个hive表join时候引起的数据倾斜

    hive的做法是,启动两个作业,第一个处理么有倾斜的数据,第二个处理倾斜的数据将其存到分布式缓存中,分发到各个map任务所在节点,在map阶段完成join 即mapjoin ,避免shuffle ,从而避免数据倾斜。

这篇关于Hive性能调优与实战节选的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996160

相关文章

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

Nginx概念、架构、配置与虚拟主机实战操作指南

《Nginx概念、架构、配置与虚拟主机实战操作指南》Nginx是一个高性能的HTTP服务器、反向代理服务器、负载均衡器和IMAP/POP3/SMTP代理服务器,它支持高并发连接,资源占用低,功能全面且... 目录Nginx 深度解析:概念、架构、配置与虚拟主机实战一、Nginx 的概念二、Nginx 的特点

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

Redis 命令详解与实战案例

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统... 目录Redis 命令详解与实战案例一、Redis 基础介绍二、Redis 核心数据结构与命令1. 字符

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

CPython与PyPy解释器架构的性能测试结果对比

《CPython与PyPy解释器架构的性能测试结果对比》Python解释器的选择对应用程序性能有着决定性影响,CPython以其稳定性和丰富的生态系统著称;而PyPy作为基于JIT(即时编译)技术的替... 目录引言python解释器架构概述CPython架构解析PyPy架构解析架构对比可视化性能基准测试测

Python AST 模块实战演示

《PythonAST模块实战演示》Python的ast模块提供了一种处理Python代码的强大工具,通过解析代码生成抽象语法树(AST),可以进行代码分析、修改和生成,接下来通过本文给大家介绍Py... 目录 什么是抽象语法树(AST)️ ast 模块的核心用法1. 解析代码生成 AST2. 查看 AST