微信搜索lxw1234bigdata | 邀请体验:数阅–数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

HiveServer2的高可用-HA配置

Hive lxw1234@qq.com 67197℃ 9评论

关键字:hiveserver2、ha、高可用、high availability、ZooKeeper Service Discovery

在生产环境中使用Hive,强烈建议使用HiveServer2来提供服务,好处很多:

1. 在应用端不用部署Hadoop和Hive客户端;
2. 相比hive-cli方式,HiveServer2不用直接将HDFS和Metastore暴漏给用户;
3. 有安全认证机制,并且支持自定义权限校验
4. 有HA机制,解决应用端的并发和负载均衡问题;
5. JDBC方式,可以使用任何语言,方便与应用进行数据交互;
6. 从2.0开始,HiveServer2提供了WEB UI。

如果使用HiveServer2的Client并发比较少,可以使用一个HiveServer2实例,没问题。

hive

但如果这一个实例挂掉,那么会导致所有的应用连接失败。

Hive从0.14开始,使用Zookeeper实现了HiveServer2的HA功能(ZooKeeper Service Discovery),Client端可以通过指定一个nameSpace来连接HiveServer2,而不是指定某一个host和port。本文学习和研究HiveServer2的高可用配置。使用的Hive版本为apache-hive-2.0.0-bin。

hive

如上图,我准备在node1和node2上分别启用两个HiveServer2的实例,并通过zookeeper完成HA的配置。

Hive配置

注:这里假设你的Zookeeper已经安装好,并可用。

在两个安装了apache-hive-2.0.0-bin的机器上,分别编辑hive-site.xml,添加以下参数:

<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<property>
<name>hive.zookeeper.quorum</name>
<value> zkNode1:2181,zkNode2:2181,zkNode3:2181</value>
</property>

<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>


<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>

<property>
<name>hive.server2.thrift.port</name>
<value>10001</value> //两个HiveServer2实例的端口号要一致
</property>

先启动第一个HiveServer2 :

cd $HIVE_HOME/bin

./hiveserver2

hive

再启动另一个:

hive

第二个实例启动后,ZK中可以看到两个都注册上来。

JDBC连接

JDBC连接的URL格式为:

jdbc:hive2://<zookeeper quorum>/<dbName>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2

其中:

<zookeeper quorum> 为Zookeeper的集群链接串,如zkNode1:2181,zkNode2:2181,zkNode3:2181

<dbName> 为Hive数据库,默认为default

serviceDiscoveryMode=zooKeeper 指定模式为zooKeeper

zooKeeperNamespace=hiveserver2 指定ZK中的nameSpace,即参数hive.server2.zookeeper.namespace所定义,我定义为hiveserver2_zk

使用beeline测试连接:

cd $HIVE_HOME/bin
./beeline
!connect jdbc:hive2://zkNode1:2181,zkNode2:2181,zkNode3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk liuxiaowen ""

hive

可以正常连接。

执行一个HQL查询,日志中显示连接到的HiveServer2实例为Node2,停掉Node2中的HiveServer2实例后,需要重新使用!connect命令连接,之后可以继续正常执行查询,日志显示连接到了Node1中的实例。

关于Hadoop2中的用户权限认证

本例中两个HiveServer2实例均使用普通用户liuxiaowen启动,

刚开始使用beeline链接时候报错:

Error: Failed to open new session: 
java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException): 
User: liuxiaowen is not allowed to impersonate liuxiaowen (state=,code=0) 

这是由于Hadoop2中的用户权限认证导致的。

参考资料:

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/Superusers.html

http://dongxicheng.org/mapreduce-nextgen/hadoop-secure-impersonation/

解决办法:

在Hadoop的core-site.xml中增加配置:

<property>
<name>hadoop.proxyuser.liuxiaowen.groups</name>
<value>*</value>
</property>

<property>
<name>hadoop.proxyuser.liuxiaowen.hosts</name>
<value>*</value>
</property>

其中 liuxiaowen 为启动HiveServer2的用户。

使用超级用户hadoop刷新配置:

yarn rmadmin -refreshSuperUserGroupsConfiguration

hdfs dfsadmin -refreshSuperUserGroupsConfiguration

如果是对namenode做过HA,则需要在主备namenode上执行:

hdfs dfsadmin -fs hdfs://cdh5 -refreshSuperUserGroupsConfiguration

之后问题解决,后续再详细研究这块。

至此,HiveServer2的多实例高可用-Ha配置完成,的确能解决生产中的很多问题,比如:并发、负载均衡、单点故障、安全等等。

因此强烈建议在生产环境中使用该模式来提供Hive服务。

 

 

如果觉得本博客对您有帮助,请 赞助作者

转载请注明:lxw的大数据田地 » HiveServer2的高可用-HA配置

喜欢 (73)
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(9)个小伙伴在吐槽
  1. 你好, 我在操作的时候碰到如下问题: org.apache.hive.service.ServiceException: java.net.BindException: 地址已在使用 at org.apache.hive.service.server.HiveServer2.start(HiveServer2.java:469) ~[hive-service-2.1.0.jar:2.1.0] at org.apache.hive.service.server.HiveServer2.startHiveServer2(HiveServer2.java:543) [hive-service-2.1.0.jar:2.1.0] at org.apache.hive.service.server.HiveServer2.access$700(HiveServer2.java:87) [hive-service-2.1.0.jar:2.1.0] at org.apache.hive.service.server.HiveServer2$StartOptionExecutor.execute(HiveServer2.java:790) [hive-service-2.1.0.jar:2.1.0] 我怀疑的端口设置重复的问题导致,但是我看到你写到: 两个HiveServer2实例的端口号要一致 请问我这样是哪里配置有问题吗?
    wew2017-05-05 17:13 回复
  2. 博客很接地气,收益匪浅,感谢~~~ HiveServer2 HA当一个HiveSever2服务挂后,需要由客户端进行重新连接,重新提交作业,是否能够做到自动容错呢?
    Riordon2017-05-09 15:26 回复
  3. HiveServer2 HA实现了负载均衡,未实现自动容错,需结合客户端进行容错
    Riordon2017-05-09 16:03 回复
  4. 老帖了,但是最近才用到,感觉有一点点小纰漏。 首先,hive-site.xml里面的“hive.server2.thrift.bind.host”在HA模式下不能配置为0.0.0.0,否则ZooKeeper分配给Client时候,Client会连本地的“hive.server2.thrift.port”端口。 然后,每个HiveServer2的配置中,“hive.server2.thrift.port”并不见得必须相同吧?我测试了一下,不同应该也是没有问题的。
    MonsieurWilson2018-10-18 09:10 回复
    • 你好,想问一下这个ha模式下的两个hiveServer2可以同时对外提供服务吗?还是说是一主一备只是做高可用没法负载均衡呢?感谢
      大葱拌豆腐2018-12-12 22:51 回复
    • 确实,做HA时不能将hive.server2.thrift.bind.host配置成0.0.0.0,否则注册到zk里的就是0.0.0.0,导致客户端通过注册zk里的信息根本找不到实际hiveserver2服务地址的。
      Janvn2020-02-26 14:58 回复
  5. 你好,这中方式是提供了HA吧,负载均衡和并发体现在哪了。两个节点的hiveserver2可以同时对外提供服务吗?还是说一个是备用的一个挂了另外一个才会接替对外提供服务呢?感谢
    大葱拌豆腐2018-12-12 22:48 回复
  6. 大神的文章都很好。尤其是讲hive原数据库的那几篇。其实一直不是很懂 这种 thriftserver 本身会有性能瓶颈么? 一般这个是不是架设再 datanode上?还是架再别的地方?指定jvm的话 ,大概能顶多少并发 ?1000个并发是不是一个 server 就不行了?
    bulbcat2019-01-11 15:48 回复
  7. 您好,我这里报错找不到hiveserver2 configs from zookeeper
    王智军2021-11-05 18:07 回复