0 问题描述

集群的 3 台 hiveserver 非常有规律 (每隔 4-5 天)相继下线,无法提供服务,日志里面大量报错,报错里面的一个关键信息如下:

logs/hiveserver2.log.2019-04-09:2019-04-09 17:53:42,526 ERROR [HiveServer2-Handler-Pool: Thread-741270]: util.Shell (Shell.java:runCommand(913)) - Caught java.lang.OutOfMemoryError: unable to create new native thread. One possible reason is that ulimit setting of 'max user processes' is too low. If so, do 'ulimit -u ' and try again.

集群信息:HDP hive(1.2.1)

1 问题定位与解决思路如下

1.1 从日志报错入手

通过日志从 'max user processes' is too low 入手,三个问题:

user processes 是什么,进程?线程?

通过 ulimit -a 可以查看到有一项配置为 'max user processes' ,通过了解到,这个 process 是线程维度,而不是我们平时了解的进程维度。

如何查看 hive 用户当前的 user processes ?:

ps -U hive -L | wc -l

说明 : 加上 -L 才能查看线程 (LWP Light Weight Processes)

查看 hive 的 max user processes 配置:

注:这里有一个大坑,必须切换到 hive 用户下,查看 ulimit -a,因为 hiveserver hivemetastore 等服务是 hive 用户启动的 ;我们之前通过运维账号 ulimit -a 查看 配置的是 65535 然并卵。

image.png

hive 用户 启动的服务有 hiveserver 和 hivemetastore , max user processes (单个用户最大线程数) 为 16000(这个配置在 HDP 的配置中)

通过 ps -U hive -L | wc -l 查看 hive 用户线程数在16000 左右就会出现 unable to create native threads

跟观察到的现象一致

1.2 解决办法:

先修改 hive 的 ulimit, 可以直接在 Ambari 修改后,重启 hiveserver 即可

Ambari UI -> HIVE -> Configs -> Advanced -> Advanced hive-env -> hive_user_nofile_limit 65535

Ambari UI -> HIVE -> Configs -> Advanced -> Advanced hive-env -> hive_user_noproc_limit 65535

1.3 进一步定位根源

进一步思考:启动服务几天后 hiveserver 启动的进程会累计增加到 15K+ ,线程为何没有释放 这是一个问题;通过 jstack 命令查看线程栈信息,大部分线程为,线程的状态为:TIMED_WAITING。

Truststore reloader thread" daemon prio=10 tid=0x00007f96d14d3000 nid=0x2323 waiting on condition [0x00007f959773e000]

java.lang.Thread.State: TIMED_WAITING (sleeping)

at java.lang.Thread.sleep(Native Method)

at org.apache.hadoop.security.ssl.ReloadingX509TrustManager.run(ReloadingX509TrustManager.java:194)

at java.lang.Thread.run(Thread.java:745)

统计此类线程个数:

grep -o "ruststore reloader thread" /tmp/hiveserver.jstack.129.20.20190522.17 | wc -l 7417 (总线程数 7580 占比 97%)

经过关键词检索,定位到是 hive 1.2.1 的 bug ,存在内存(线程)泄露的问题,见 HIVE-1421。hive 启动 hadoop 任务之后忘了关闭连接。

ExecDriver needs to call jobclient.close() to trigger the clean-up of the resources after the submitted job is done/failed

1.4 最终结论:

修改配置,新增 hiveserver 节点,可以暂时缓解频繁挂的问题

升级 hive 版本可以彻底解决此问题(从 1.2.1 升级到1.2.2 或者 2.x)

2 实际解决方案:

理想是:例如升级版本,考虑如何实现平滑过渡。

现实是:考虑到线上运行了大量的任务,升级 hive 版本可能会带来不稳定性,稳妥起见,考虑最小化影响解决改问题。

通过阅读该 bug 的补丁代码后发现代码的改动实际很小(hadoop 连接没有释放),下载源码,加上释放连接的代码 重新打包替换原先 hive-exec.jar ,相继重启 hiveserver 服务搞定,自此 hive 用户的线程数 稳定在 150 左右。

3 总结

通过日志定位到的问题不一定是根源问题(root cause);

linux 下查看用户的 ulimit 相关参数一定要切换到影响到的该用户下去查看;

善用工具 linux 相关的 ps lsof ulimit, Java 相关的 jstack(线程信息) jmap (内存占用信息),jstat(gc);

问题的解决不一定要按部就班,根据实际场景,可以另寻出路,改源码换 jar 包的方式一天搞定,升级版本的方式可能得大半个月的验证时间。

linux多线程入库hive,hiveserver2 定时挂采坑记相关推荐

  1. Taro小程序采坑记

    Taro,京东凹凸实验室出品的适配多端的一个框架, Taro 是一套遵循 React 语法规范的 多端开发 解决方案.现如今市面上端的形态多种多样,Web.React-Native.微信小程序等各种端 ...

  2. Android平台招商银行“一网通”支付对接采坑记

    公司最近的App中需要做支付功能,支付中需要支持微信支付.支付宝支付.一网通支付.本文主要记录在对接Android平台中的"一网通"过程中遇到的坑,如果有类似需求的朋友,可供你参考 ...

  3. centos7.4.3 部署python-pcl亲测可用(采坑记)

    最近工作里用到PCL库,处理点云数据.点云抽稀能极大的减少点云数据. 通过python-pcl调用C++的PCL库.windows下运行ok,linux下部署踩了很多坑,试了多种办法,包括源码安装,都 ...

  4. 禅道和xxd(喧喧)两台主机服务器采坑记!

    禅道之前安装采用官方推荐的文章:Centos7.4系统下安装httpd,mariadb,php7.1环境运行禅道 而不是(推荐)linux用一键安装包 所以坑大了 Centos7.4系统下安装http ...

  5. [教程]centos7.x 及centos8 硬盘安装法#免U盘#采坑记

    参考教程 最新win7下硬盘安装CentOS6.3,亲测可行-百度经验 补充说明: 需要分出两个区 10G左右 存放iso安装包及解压出来的vmlinuz和initrd.img文件,ext分区格式 5 ...

  6. 几行代码把Chrome搞崩溃之:HTML5 MP3录音由ScriptProcessorNode升级成AudioWorkletNode采坑记

    关键词: STATUS_ACCESS_VIOLATION AudioContext AudioWorkletNode audioWorklet addModule resume suspended c ...

  7. Pytorch转ONNX采坑记:Converting a tensor to a Python boolean might cause the trace to be incorrect. We...

    如果你用Pytorch定义的网络结构太过于灵活,那么转成ONNX的时候很有可能出错.这个报错通常情况下是你的网络结构中出现if else 语句.比如 if cfg.CUDA:eps = torch.c ...

  8. antd 获取table选中行数据_element-ui 组件el-table默认选中行setCurrentRow采坑记

    1.背景 选中表格中某一行,高亮显示,table表格数据变化后(删除某几条数据,不包括选中的删除), this.$refs.multipleTable.setCurrentRow(row),选中之前选 ...

  9. spark分布式矩阵采坑记

    最近在开发一版基于协同过滤算法的推荐系统,需要用到历史7天的搜索和所有历史订单数据,几十亿的数据参与运算.采用spark2.0.2版本的mllib.linalg.distributed模块. 该模块包 ...

最新文章

  1. 大厂程序员回乡真风光?敲锣打鼓游街欢迎,横幅写着月薪和公司!
  2. 7个问题,直击管理的本质
  3. 给硬件工程师介绍SAP Cloud for Customer
  4. 39策略模式(Strategy Pattern)
  5. 7.Python学习笔记:[字典]
  6. [itext] java生成pdf
  7. libiconv字符集转换库使用方法
  8. dll模块化设计与编程_PLC模块、结构化编程到底强在哪里?
  9. bsh.jar/beanshell下载链接
  10. Win7/10亲测可用:湘源控规6+CAD200832+64
  11. 痴情人, 浮生梦(上)
  12. 从东南大学906被刷到调剂过程(内含个人感想)
  13. 空间两条直线段的最短距离及最近点计算
  14. Gateway网关的使用
  15. php预览ppt,演示文稿幻灯片有哪四种视图模式?
  16. OpenCV基础应用4.边缘检测
  17. 5 UML views and the 9+4 UML Diagrams 关系
  18. win10无法访问xp计算机,XP系统访问Win10打印机被拒绝的解决方法
  19. 全国3000多名医护人员感染新冠,医疗机器人与智能技术提供解决方案
  20. forge 服务器 优化,[FO]难以置信的优化 (Fabulously Optimized)

热门文章

  1. 为什么每个程序员都应该学习C语言?
  2. 保障健康睡眠的几种食疗法
  3. Aqua - Mac OS X平台的用户界面(user interface)
  4. mysql order by 语句_Mysql优化order by语句的方法详解
  5. kaggle房价预测特征意思_Kaggle竞赛丨房价预测(House Prices)
  6. RedHat Linux下获取snmp信息不全的解决办法
  7. Repository和dao
  8. python_day3
  9. weblogic集群集群说明
  10. libevent 接收TCP连接