在一台服务器上搭建相对高可用HiveServer实践

本文来自网易云社区

作者:刘杰

问题及原因

组里之前搭建了一个hiveserver提供给猛犸上的ETL程序调用,hiveserver隔三差五地挂掉重启,网上查了些资料,也咨询了猛犸那边维护hiveserver周全同学,这是一个比较普遍的问题,原因基本上都是进程内存用爆引发的hiv& e x meserver奔^ * & i # 4 E溃,内存爆掉的原因大概有两个:

  • hiveserver2会加载大量的元数据,元数据多了,内存就oom了

  • 连接hq e 9 w v # w 4iverserver2的sq# Q 0 U }l性能慢,查询时间超` T j长,占用大量内存

解决方法

目前内存爆掉没有太好的解决方法,一般的解决方法监c 5 i控和重启,使用探针程序定时监测hiveserver是否工作,如果不工作就重启。另外启动多个hiveserver,使用HA工具进行切换,本文中采用HAProxy,HAProxy是一个开源的HA工具,可以工作在TCP层和HTTP层。

实践方案

软硬件配置

  • 16G内存服务器一台

  • Hive客户端

  • HAProxy

##使用不同的端口启动三个hiveserverhiveserver2--hiveconfhive.server2.thrift.port=10000&
hiveserver2# ^ I m I 5--hiveconfhive.server2.thrift.port=10001&
hiveserver2--hivecon# t w K D 2fhive.server2.thrift.port=10004&# k ! M L U
##crontab定时执行的检查程序##探针程序,每分钟执行一次,检查hiveserver是否运行正常,任意执行一个sql即可,如果不工作了就重启java-jarHiveserveH u ~ 5 e J ] s IrState-jar-wi, a O Kth-dependencies.jar-Dport=10000if[$?-ne0]then##内存监K 4 | @ | H控重定向到文件,查看hiveserver挂的那个时刻内存的快照ps-ef|grep"org.apachf G L Be.hive.service.server.HiveServer2--hiveconf
hive.server2.thrift.port=10000"|grep-vgrep|# G z x Hawk'{print$2}'|xargsjsta? 3 b ~ E X ^t-gcutil>>mk c e [ ! } dem_stat.log
ps-ef|grep"org.apache.hive.service.server.HiveServer& 3 U @ C & I2--hiveconfhive.server2.thrift.port=10000"|grep-vgrep|awk'{print$2}'|xargskill-? i @ _ 4 f n $9nohuphiveserver2--hiveconfhive.server2.thrift.port=10000&am? I & m A p ` fp;U V C . S 4 5 o =echo'restartHiveserver10000端口成功'fijava-jarHiveserverState-jar-with-dependencies.jar-Dport=10001if[$?-ne0]thenp{ C 0 R ; p Z  is-ef|grep"org.apache.hive.service.sZ u y E ! derver.HiveServer2--hiveconfhive.server2.thrift.port=10001"|grep-vgrep|awk'{print$2}'|xargsjstat-gcutil>>mem_stat.log
ps-ef|grep"org.apache.hD y M Z , / a ( Xiv/ n )e.service.servere 0 Q G e Z.HiveServer2--hi6 - k l q [ e k 2veconfhive.server2.thrift.port=10001"|grep-vgrep|awk'{print$2}@ w P O'|xargskill-9nohuphiveserver2--hiveconfhive.server2H V e i t m w.thrift.port=10001&echo'restartHiveserver10001端口成功'fijava-jarHiveserverState-jar-with-dependene } ] z *cies.jar-Dport=10004if[$?-ne0]thenps-ef|grep"org.apachem q ,.hive.service.server.Hi? h s e g QveServer2--hiveconfhive.server2.thrift.port=10004"|grep-vgrek c  4p|awk'{prinV 4 ) j Yt$2}'|xt M b s ;argsjstat-gcutilM ] _ R>>mem_stat.log
ps-ef|grep"org.apache.hive.service.server.HiveServ@ : H 5 2 $ Ler2--hiveconfhive.server2.thrift.port=10004"|grep-vgrep|awk'{print$2}'|xargskill-9nohuphiveserver2--hiveconfh/ S , ^ive.server2.thrift.port=G L , L ? p [10004&echo'restartHiveserver10004端口成功'fi
  • HA配置如下

listenhive#hive后端定义
bind0.0.0.0:10003#ha作为proxy所绑定的IP和端口6 p z t
modetcp#以4层方式代理,重要
balanceleastconnD 4 r 8#调度算法'leastconn'最少连接数分配,或者'roundrh $ o 5 x Q oobin',轮询分配
maxconn10240#最大连接数
serverhive_1server_ip:10000c^ 1 Y | W A @ [ Nheckinter180000rise1fall2
serverhive_2server_M d : * )ip:10001checkinter180000rise1fall2
serverhive_y w 9 D - Q =3server_ip:10004checkinter180000rise1fall2

问题及改进

以上方法搭建的hiveserver只是X : I 8 S r 2相对高可用,应对组内的ETL任务已经足够了。* w ( ) + #因为只有6 ^ Z 3 n S ; 2一台机器,9 e * X K H N x d所以存在单点故@ s W S i障,在实际生产环境中,可以使用两台机器作为HAProxy,另外三台作为hiveserver。

作者

  • 刘杰

  • 谢非

参考文章

http://l$ ] Z Xanlian.blog.51cto.com/6790106/1305228

http://www.cnblogs.com/smartloli/p/4368676.html

网易云大礼包:https://www.163yun.co6 _ 1 , R j Im/gia / } 9ft

本文来自网易云社区,经作者刘杰授权发布9 t C &

相关文章:
【推荐】微服务化不同阶段 Kubernetes 的不同玩法
【推荐】# @ : 3 j Y B , N网易云易盾CTO朱浩齐:我们是如何用AI赋能内容安全?
【推荐】在A# @ 0 L } _ . 7ndroid中使用Protocol Buffers(下篇q j e Z