当E-MapReduce(简称EMR)集群有多个HiveServer2服务时,可以借助Zookeeper服务或负载均衡SLB(Server Load Balancer)实现访问HiveServer2的负载均衡,将HiveServer2的压力分担到多个节点上去。本文详细介绍HiveServer2负载均衡的配置及使用方法,请根据EMR集群(普通集群和Kerberos集群)的实际情况进行选择。
前提条件
已创建高可用集群,详情请参见创建集群。

使用限制
本文内容仅适用于打开服务高可用开关的集群。
EMR普通集群
以下方式适用于未打开Kerberos身份认证开关的集群。
Zookeeper实现负载均衡
高可用集群默认安装了Zookeeper服务,您可以使用以下连接方式选择一个HiveServer2进行连接,达到负载均衡的效果。详细操作如下:
- 通过SSH方式连接集群,详情请参见登录集群。
- 执行以下命令,Zookeeper服务会选择一个HiveServer2进行连接。
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
说明 代码中的master-1-1:2181,master-1-2:2181,master-1-3:2181
为您获取到的Zookeeper的连接地址。Hue连接该负载均衡HiveServer2,需要在Hue配置的hue页签中添加如下三个自定义参数。参数 描述 zookeeper.clusters.default.hostports Zookeeper的连接地址,请根据实际情况填写,本示例为master-1-1:2181,master-1-2:2181,master-1-3:2181。 beeswax.hive_discovery_hs2 固定值为true。 beeswax.hive_discovery_hiveserver2_znode 固定值为/hiveserver2。
SLB实现负载均衡
- 创建SLB实例,详情请参见创建和管理CLB实例。
- 在默认服务器组中添加EMR集群HiveServer2服务所在ECS实例,根据需要配置ECS的权重。详情请参见为默认服务器组添加和管理云服务器。
- 配置TCP端口,端口自定义,后端协议/端口配置为TCP:10000。SLB的调度算法根据需要进行选择。详情请参见添加TCP监听。
- 访问HiveServer2。
EMR Kerberos集群
以下方式适用于打开Kerberos身份认证开关的集群。
Zookeeper实现负载均衡
- 首先执行
kinit
命令,通过Kerberos认证,获取Kerberos Ticket,详情请参见使用Kerberos认证。 - 访问HiveServer2。
SLB实现负载均衡
可以参见EMR普通集群中的内容创建及配置SLB负载均衡。在Kerberos集群,还需要额外配置HiveServer2所使用的Kerberos Principal才能正常连接。因此分下面两种方式介绍需要的操作。
- 方式一:使用SLB的IP地址以负载均衡方式访问HiveServer2
本示例假设SLB的IP地址为121.41.**.**,前端监听端口为10000,具体请根据实际情况进行修改。
- 创建121.41.**.**地址对应的Hive Principal并导出Keytab。
如果EMR Kerberos集群使用的是EMR自带的HAS Kerberos,则使用如下方式创建并导出SLB所需的Principal。
- 登录集群的master-1-1节点,详情请参见登录集群。
- 执行以下命令,进入Kerberos的admin工具。
- EMR-3.30.0及后续版本和EMR-4.5.1及后续版本。
sh /usr/lib/has-current/bin/admin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
- EMR-3.30.0之前版本和EMR-4.5.1之前版本。
sh /usr/lib/has-current/bin/hadmin-local.sh /etc/ecm/has-conf -k /etc/ecm/has-conf/admin.keytab
- EMR-3.30.0及后续版本和EMR-4.5.1及后续版本。
- 执行以下命令创建Principal,并将其导出到/tmp/slb.keytab中。
addprinc -randkey hive/121.41.**.** xst -k /tmp/slb.keytab hive/121.41.**.** exit
如果EMR Kerberos集群对接使用的是外部MIT Kerberos,则按照MIT Kerberos开源用法使用kadmin.local或kadmin连接KDC,执行addprinc
和xst
命令即可。重要 MIT Kerberos多次导出keytab会导致之前导出的keytab失效,所以需确保slb.keytab只导出一次。
- 将slb.keytab写入到hive.keytab中。将slb.keytab传输到集群所有HiveServer2服务所在节点,使用ktutil工具将slb.keytab中存储的Principal导入到各个节点/etc/ecm/hive-conf/hive.keytab中,执行以下命令。
ktutil rkt /tmp/slb.keytab wkt /etc/ecm/hive-conf/hive.keytab
hive.keytab中应该有如下内容。 - 修改集群的Hive配置。在EMR控制台的Hive服务的配置页签,搜索参数hive.server2.authentication.kerberos.principal,修改参数值为hive/121.41.**.**@EMR.**.COM,即修改为上步骤中创建的Principal。然后保存并选中自动更新配置。
- 重启集群HiveServer服务。
- 在EMR控制台的Hive服务的状态页签,在HiveServer操作列的重启。
- 输入执行原因,单击确定。
- 在确认对话框中,单击确定。
- 使用以下命令访问HiveServer2。
beeline -u 'jdbc:hive2://121.41.**.**/default;principal=hive/121.41.**.**@EMR.**.COM'
- 创建121.41.**.**地址对应的Hive Principal并导出Keytab。
- 方式二:使用SLB的hostname以负载均衡方式访问HiveServer2重要 Beeline在进行Kerberos认证时,会将Principal都转换为小写字母进行服务端Principal验证,为了与之保持一致,hostname中的英文字母必须全部小写不能有大写字母,否则容易因为大小写不统一造成Kerberos认证失败。与方式一相同,只是创建Principal和修改hive-site配置时,将IP地址修改为hostname。连接时也使用hostname进行连接。使用以下命令访问HiveServer2。
beeline -u 'jdbc:hive2://<slb_hostname>/default;principal=hive/<slb_hostname>@EMR.**.COM'
Hue连接该负载均衡HiveServer2,需要在Hue配置的hue页签中修改以下参数。参数 描述 hive_server2_host 填写为SLB的IP地址或绑定的hostname。 hive_server2_port 填写为SLB前端监听的端口。