- 描述: 公司内部使用Hue作为数分团队对大数据的分析产出工具,随着数分业务增加和使用人员复杂,不规范SQL,不规范的使用,导致Hue连接Hive的Hiveserver2服务意外宕机,查看服务日志,并无明显报错,只能在CDH管理界面看出是OOM导致的意外退出,想着通过加大内存以及加上万能重启方式,然而并不能解决,服务运行一段时间后,仍然因OOM挂机,因日志没有详细错误信息,只能看到服务在退出时dump出了很大的堆快照文件(-XX:+HeapDumpOnOutOfMemoryError),分析快照文件相对较为麻烦,因此采用jstat 命令监控重启后服务的内存回收情况(jstat -gc lvmid),发现正常回收一点时间后Full Gc次数在某个时间点激增,但Full Gc 后内存仍回收不足。
- 问题原因: 公司大数据平台的Hiveserver2服务只是单节点部署的单台服务(平台搭建时遗留的坑),随着大量作业的提交(直接SQL,脚本等)导致Hiveserver2服务不堪重负宕机。
- 解决: 既然单节点服务不能承载目前查询任务量,那么就建立Hiveserver2集群,采用Nginx作负载均衡代理
- 环境: CDH5.15
-
CM管理界面寻找较空闲服务器启动多个Hiveserver2服务,这里对服务内存做了相应调高和添加了一些JVM垃圾回收器参数,步骤如下:
1.添加多个hiveserver2服务实例
Hiveserver2选择部署主机,按步骤进行添加2.修改服务配置:
-XX:MaxPermSize=512M -XX:+UseParNewGC -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:ParallelCMSThreads=20
这里做了session超时调优,避免实效session占用太多资源,也是Hue连接Hive 防止一直出现Results have expired,rerun the query if need 的参数
添加load balancer 地址,代理服务器地址,格式为主机名:端口号
-
网上也有采用Haproxy作为代理服务器的,但经过测试后发现性能不如Nginx,因此采用Nginx
1.Nginx服务部署参:菜鸟文档
2.修改Nginx配置文件:events { worker_connections 10240; } stream{ upstream backend { hash $remote_addr consistent; server cdh005:10000; server cdh010:10000; server cdh011:10000; } server{ listen 10001; proxy_connect_timeout 30000; proxy_pass backend; } }这里采用IP Hash 算法来解决Hue session跨域问题,防止Hue查询出现:Results have expired,rerun the query if need 问题,代理服务配置了3个节点服务器,并单独开发初1 单台服务器供远程JDBC连接。
3.在Hue服务高级配置代码段(安全阀)hue_safety_valve.ini添加如下配置:[beeswax] close_queries=true
4.启动Nginx,重启Hive,Hue。



