当 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 实现负载均衡
-
创建负载均衡实例,详情请参见 创建和管理 CLB 实例 。
-
在 默认服务器组 中添加 EMR 集群 HiveServer2 服务所在 ECS 实例,根据需要配置 ECS 的权重。
详情请参见 在默认服务器组添加和管理后端服务器 。
-
配置 TCP 端口,端口自定义, 后端协议/端口 配置为 TCP:10000。
调度算法请根据需要进行选择,详情请参见 添加 TCP 监听 。
-
访问 HiveServer2。
-
通过 SSH 方式连接集群,详情请参见 登录集群 。
-
执行以下命令,即可通过负载均衡的方式连接到集群中的多个 HiveServer2 服务。
beeline -u 'jdbc:hive2://<slb_ip_or_host>:<slb_port>'其中,以下参数请根据实际情况替换:
-
<slb_ip_or_host>:负载均衡实例的 IP 地址或绑定的 hostname。 -
<slb_port>:负载均衡实例前端监听的端口。
-
如果您希望 Hue 能够通过这个负载均衡与 HiveServer2 通信,则需要在 Hue 配置的 hue 页签中修改以下参数。
参数
描述
hive_server2_host
填写为负载均衡实例的 IP 地址或绑定的 hostname。
hive_server2_port
填写为负载均衡实例前端监听的端口。
-
EMR Kerberos 集群
以下方式适用于打开 Kerberos 身份认证 开关的集群。
使用 Zookeeper 实现负载均衡
-
首先执行
kinit命令,通过 Kerberos 认证,获取 Kerberos Ticket,详情请参见 使用 Kerberos 认证 。 -
访问 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 暂不支持连接 EMR Kerberos 集群的 Zookeeper 负载均衡的 HiveServer2,因此请使用 SLB 方式访问 HiveServer2。
-
使用 SLB 实现负载均衡
可以参见 EMR 普通集群 中的内容创建及配置 SLB 负载均衡。在 Kerberos 集群,还需要额外配置 HiveServer2 所使用的 Kerberos Principal 才能正常连接。
本示例假设 SLB 的 IP 地址为 121.40.**.**,前端监听端口为 10000,具体请根据实际情况进行修改。
-
首先执行
kinit命令,通过 Kerberos 认证,获取 Kerberos Ticket,详情请参见 使用 Kerberos 认证 。 -
创建 121.40.**.**地址对应的 Hive Principal 并导出 Keytab。
-
登录集群的 master-1-1 节点,详情请参见 登录集群 。
-
执行以下命令,进入 Kerberos 的 admin 工具。
kadmin.local -
执行以下命令创建 Principal,并将其导出到
/tmp/slb.keytab中。addprinc -randkey hive/121.40.**.** xst -k /tmp/slb.keytab hive/121.40.**.** exit如果 EMR Kerberos 集群对接使用的是外部 MIT Kerberos,则按照 MIT Kerberos 开源用法使用 kadmin.local 或 kadmin 连接 KDC,执行
addprinc和xst命令即可。重要多次导出 Kerberos 的 keytab 可能会导致之前的 keytab 文件失效。请确保
slb.keytab中仅包含最新导出的 Principal。如需再次导出 Principal,请务必先删除之前生成的 keytab 文件。
-
-
执行以下命令,将
slb.keytab传输到集群所有 HiveServer2 服务所在节点,并使用 ktutil 工具将其内容导入到各个节点的/etc/taihao-apps/hive-conf/keytab/hive.keytab中。ktutil rkt /tmp/slb.keytab wkt /etc/taihao-apps/hive-conf/keytab/hive.keytab quit -
执行以下命令,查看 hive.keytab 中的内容。
klist -kt /etc/taihao-apps/hive-conf/keytab/hive.keytab
-
修改集群的 Hive 配置。
在 EMR 控制台的 Hive 服务的 配置 页签,搜索参数 hive.server2.authentication.kerberos.principal ,修改参数值为 hive/121.40.**.**@EMR.**.COM ,即修改为上步骤中创建的 Principal。然后保存并生效配置。
-
重启集群 HiveServer 服务。
-
在 EMR 控制台的 Hive 服务的 状态 页签,在 HiveServer 操作列的 重启 。
-
输入执行原因,单击 确定 。
-
在 确认 对话框中,单击 确定 。
-
-
在 master-1-1 节点,执行以下命令访问 HiveServer2。
beeline -u 'jdbc:hive2://121.40.**.**:10000/default;principal=hive/121.40.**.**@EMR.**.COM'