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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

jvm调优常用命令行工具详解

《jvm调优常用命令行工具详解》:本文主要介绍jvm调优常用命令行工具的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一 jinfo命令查看参数1.1 查看jvm参数二 jstack命令2.1 查看现场堆栈信息三 jstat 实时查看堆内存,gc情况3.1

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2