【presto 】presto OOM问题处理回顾和升级方案

一、初始

老集群简单介绍:

  • presto 版本: 0.220
  • 二次开发:添加了查询hive 视图的功能
  • 集群数量:30台
  • 内存配置:30G

我们生产环境的 presto 集群最近很不稳定,在业务高峰期时(早上大家都要查看报表),会短时间产生大量的大任务, presto 集群会大批量发生 OOM 的现象,导致 presto 服务挂掉。

由于 presto 服务的特性,当某个节点异常后,只要是在执行在这台节点的 sql 任务都会失败。这就会导致陷入了: 执行任务 -> 服务OOM -> 任务失败 -> 重试任务 -> 服务OOM -> 任务失败 的死循环。

二、简单优化

这时对于运维来说,最简单的只能是配置优化和扩容,于是进行了一些配置优化和节点的扩容。

但是只能是加快任务的执行时间,如之前一个任务执行3分钟,优化后变成2分钟,但是对于短时间的集中的大任务来说,这些优化,还是显得杯水车薪。

三、内存保护机制

此时查看文档,有个配置进入了眼帘,query.low-memory-killer.policy 内存不足保护机制,计划通过这个配置来实现当节点JVM内存不足时,杀掉占用最大内存的任务,来避免JVM OOM。但是有引发一系列问题详情如下:https://blog.csdn.net/Mrerlou/article/details/118024250

由这点引发了两个解决方案:

  • 临时方案:去掉 JVM OOM kill 参数,虽然 presto 还会发生OOM ,但是只会影响到 OOM 的线程,也就是说个别任务会执行异常,但是没有发生OOM 的线程是不会受影响的。能够避免任务雪崩式异常,但是 presto OOM 后,服务会不稳定,有些连接无法正常释放,导致节点 http 连接数过大。所以还需要一个监控脚本,当发现presto 异常后,等到业务低峰期时,在重启下 presto 任务。
  • 后期方案:1. 版本升级;2. 修改源码,让内存不足的判断策略能够提前触发。poolInfo.getFreeBytes() + poolInfo.getReservedRevocableBytes() 比如小于JVM内存的15% ~ 20%。来早的触发内存保护策略。

升级版本:

旧版本:0.220 → 新版本: 0.269

升级目的:

  1. 新版本对于老版本做了很多优化,提高服务稳定性。
  2. 新版本需要兼容老版本的功能,并且对业务方是透明的。
  3. 引入更为严格的内存判断策略。

新版本提升:

  1. 增加了很多函数
  2. query.initial-hash-partitions 由默认的8 改为 100
  3. 对于hive的orc格式数据有更好的支持
  4. hive可以根据文件大小进行称重拆分的支持,从而在文件较小时允许更深的工作人员拆分队列
  5. 修复了底层数据格式为parquet查询结果不一致问题
  6. 修复了大量bug
  7. 更多有关升级内容详情见:https://prestodb.io/docs/current/release/release-0.269.html

老版本二次开发详情如下:

  1. presto 支持递归查询 hive视图 (presto默认是不支持hive视图功能的)
  2. presto password 认证插件 (自开发插件,用于python 代码客户端的身份认证,只做认证,不涉及到权限)

为了兼容老版本,以及提高稳定性 新版本改动如下:

功能目的
1支持递归查询hive视图功能兼容老版本
2原生的password 认证插件替代自开发插件
3支持老版本 password 认证插件兼容老版本
4修改 general memory pool的内存不足判断策略提高稳定性
5修改log4j的版本,防止jni注入安全性
6使用jdk11提高稳定性

升级方案:

此次升级无法采用滚动升级(新老服务不兼容),搭建一套新版本服务,将 presto 软连接挂到新版本上,然后停掉老版本集群,新版本集群沿用旧集群的配置。

升级时间:

由于无法采用滚动升级,所以升级时间选择在业务低峰期进行

升级步骤:

  1. 批量拷贝 presto 安装包到 /usr/local 目录下 => /usr/local/presto-server-0.269
  2. 批量拷贝 jdk11 安装包到 /home/rong 目录下 => /home/rong/jdk-11.0.14
  3. 添加软连接 ln -s /home/rong/jdk-11.0.14 jdk11
  4. 更新下发 worker 节点的config.properties 配置文件
  5. 更新下发 condition 节点config.properties 配置文件
  6. 初始化节点配置信息脚本,目的是更新 worker 节点的node.properties 配置文件中的host信息
  7. 停止旧集群服务
  8. 修改软连接到新版本服务
  9. 启动&验证新版本服务

升级影响:

redash 理论无影响
tableau 理论无影响
python 客户端代码 理论无影响

回退方案:

将软连接重新挂回旧版本,重新启动旧集群。

二、支持HIVE视图

参考以下文章,并结合新版本进行移植适配 (done)

  • https://github.com/prestodb/presto/pull/9031
  • https://blog.csdn.net/hjw199089/article/details/81415444

三、内存不足判断策略

1什么时候集群内存不足?

在这里插入图片描述

备注: 由于 RESERVED_POOL 配置文件中没有开启,所以判断条件就只剩 GENERAL_POOL 是否出现阻塞节点

2 什么条件判断节点是否阻塞(内存不足)?

在这里插入图片描述

if (poolInfo.getFreeBytes() + poolInfo.getReservedRevocableBytes() <= 0) {
    blockedNodes++;
}
  

目的:为了更快的触发内存保护策略。

运维天地 > presto 新版本升级详情 > image2022-1-13_13-46-45.png

修改:
原来是 poolInfo.getFreeBytes <= 0, 改为小于pool MaxByte的80%,提前触发内存保护策略
在这里插入图片描述

此功能是针对与 GENERAL_POOL的改动,并不能完全解决 OOM的问题,因为还有一部分内存是Presto 无法监控到的,所以节点还是有OOM的风险。

参考:

  • http://armsword.com/2020/02/18/presto-memory-kill-policy/

  • http://armsword.com/2018/05/22/the-memory-management-and-tuning-experience-of-presto/

  • http://armsword.com/2019/11/13/the-configuration-settings-of-presto-memory-management/

四、password-file-authenticators 插件

此插件为自定义插件,目的是用来进行身份认证。并不做权限管理。

此插件功能与password-authenticators 官方插件功能基本一致。

区别:
password-file-authenticators 插件的用户名密码为明文

运维天地 > presto 新版本升级详情 > image2022-1-13_13-57-56.png

password-authenticators 插件的密码为密文

运维天地 > presto 新版本升级详情 > image2022-1-13_13-59-4.png
自定义开发的插件也已经在新版移植适配过了,目前两种插件都可以使用。功能是一样的。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值