美文网首页
在一台服务器上搭建相对高可用HiveServer实践

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

作者: 刘不吃草也能跑 | 来源:发表于2017-07-24 18:56 被阅读0次

    问题及原因

    搭建过一个hiveserver被ETL程序调用,hiveserver隔三差五地挂掉重启,网上查了些资料,这是一个比较普遍的问题,原因基本上都是进程内存用爆引发的hiveserver奔溃,内存爆掉的原因大概有两个:

    • hiveserver2会加载大量的元数据,元数据多了,内存就oom了
    • 连接hiverserver2的sql性能慢,查询时间超长,占用大量内存

    解决方法

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

    image.png

    实践方案

    软硬件配置

    • 16G内存服务器一台
    • Hive客户端
    • HAProxy
     ##使用不同的端口启动三个hiveserver
    hiveserver2 --hiveconf hive.server2.thrift.port=10000 &
    hiveserver2 --hiveconf hive.server2.thrift.port=10001 &
    hiveserver2 --hiveconf hive.server2.thrift.port=10004 &
    
    ##crontab定时执行的检查程序
    ##探针程序,每分钟执行一次,检查hiveserver是否运行正常
    java -jar HiveserverState-jar-with-dependencies.jar -Ddatasource=plumber -Dport=10000
    if [ $? -ne 0 ]
    then
    ##内存监控重定向到文件,查看hiveserver挂的那个时刻内存的快照
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf 
    hive.server2.thrift.port=10000" | grep -v grep | awk '{print $2}'  | xargs jstat -gcutil >> mem_stat.log
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf hive.server2.thrift.port=10000" | grep -v grep | awk '{print $2}'  | xargs kill -9
    nohup hiveserver2 --hiveconf hive.server2.thrift.port=10000 &
    echo 'restart Hiveserver 10000 端口成功'
    fi
    
    java -jar HiveserverState-jar-with-dependencies.jar -Ddatasource=plumber -Dport=10001
    if [ $? -ne 0 ]
    then
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf hive.server2.thrift.port=10001" | grep -v grep | awk '{print $2}'  | xargs jstat -gcutil >> mem_stat.log
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf hive.server2.thrift.port=10001" | grep -v grep | awk '{print $2}' | xargs kill -9
    nohup hiveserver2 --hiveconf hive.server2.thrift.port=10001 &
    echo 'restart Hiveserver 10001 端口成功'
    fi
    
    java -jar HiveserverState-jar-with-dependencies.jar -Ddatasource=plumber -Dport=10004
    if [ $? -ne 0 ]
    then
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf hive.server2.thrift.port=10004" | grep -v grep | awk '{print $2}'  | xargs jstat -gcutil >> mem_stat.log
    ps -ef|grep "org.apache.hive.service.server.HiveServer2 --hiveconf hive.server2.thrift.port=10004" | grep -v grep | awk '{print $2}' | xargs kill -9
    nohup hiveserver2 --hiveconf hive.server2.thrift.port=10004 &
    echo 'restart Hiveserver 10004 端口成功'
    fi
    
    • HA配置如下
    listen hive             #hive后端定义
            bind 0.0.0.0:10003              #ha作为proxy所绑定的IP和端口
            mode tcp                        #以4层方式代理,重要
            balance leastconn               #调度算法 'leastconn' 最少连接数分配,或者 'roundrobin',轮询分配
            maxconn 10240                    #最大连接数
            server hive_1 server_ip:10000 check inter 180000 rise 1 fall 2
            server hive_2 server_ip:10001 check inter 180000 rise 1 fall 2
            server hive_3 server_ip:10004 check inter 180000 rise 1 fall 2
    
    image.png

    问题及改进

    以上方法搭建的hiveserver只是相对高可用,应对组内的ETL任务已经足够了。因为只有一台机器,所以存在单点故障,在实际生产环境中,可以使用两台机器作为HAProxy,另外三台作为hiveserver。

    参考文章

    http://lanlian.blog.51cto.com/6790106/1305228
    http://www.cnblogs.com/smartloli/p/4368676.html

    相关文章

      网友评论

          本文标题:在一台服务器上搭建相对高可用HiveServer实践

          本文链接:https://www.haomeiwen.com/subject/qxahkxtx.html