HiveServer2负载均衡

当E-MapReduce(EMR)集群中有多个HiveServer2服务时,可以通过Zookeeper服务和负载均衡SLB(Server Load Balancer),实现对HiveServer2的负载均衡,从而将HiveServer2的压力分散到多个节点上。本文详细介绍HiveServer2负载均衡的配置及使用方法,请根据EMR集群(普通集群和Kerberos集群)的实际情况进行选择。

前提条件

已创建高可用集群,详情请参见创建集群HA

使用限制

本文内容仅适用于打开服务高可用开关的集群。

EMR普通集群

以下方式适用于未打开Kerberos身份认证开关的集群。

使用Zookeeper实现负载均衡

高可用集群默认安装了Zookeeper服务,您可以使用以下连接方式选择一个HiveServer2进行连接,达到负载均衡的效果。详细操作如下:

  1. 通过SSH方式连接集群,详情请参见登录集群

  2. 执行以下命令,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实现负载均衡

  1. 创建负载均衡实例,详情请参见创建和管理CLB实例

  2. 默认服务器组中添加EMR集群HiveServer2服务所在ECS实例,根据需要配置ECS的权重。

    详情请参见在默认服务器组添加和管理后端服务器image

  3. 配置TCP端口,端口自定义,后端协议/端口配置为TCP:10000。

    调度算法请根据需要进行选择,详情请参见添加TCP监听

  4. 访问HiveServer2。

    1. 通过SSH方式连接集群,详情请参见登录集群

    2. 执行以下命令,即可通过负载均衡的方式连接到集群中的多个HiveServer2服务。

      beeline -u 'jdbc:hive2://<slb_ip_or_host>:<slb_port>'

      其中,以下参数请根据实际情况替换:

      1. <slb_ip_or_host>:负载均衡实例的IP地址或绑定的hostname。

      2. <slb_port>:负载均衡实例前端监听的端口。

    如果您希望Hue能够通过这个负载均衡与HiveServer2通信,则需要在Hue配置的hue页签中修改以下参数。

    参数

    描述

    hive_server2_host

    填写为负载均衡实例的IP地址或绑定的hostname。

    hive_server2_port

    填写为负载均衡实例前端监听的端口。

EMR Kerberos集群

以下方式适用于打开Kerberos身份认证开关的集群。

使用Zookeeper实现负载均衡

  1. 首先执行kinit命令,通过Kerberos认证,获取Kerberos Ticket,详情请参见使用Kerberos认证

  2. 访问HiveServer2。

    1. 通过SSH方式连接集群,详情请参见登录集群

    2. 执行以下命令,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,具体请根据实际情况进行修改。

  1. 首先执行kinit命令,通过Kerberos认证,获取Kerberos Ticket,详情请参见使用Kerberos认证

  2. 创建121.40.**.**地址对应的Hive Principal并导出Keytab。

    1. 登录集群的master-1-1节点,详情请参见登录集群

    2. 执行以下命令,进入Kerberos的admin工具。

      kadmin.local
    3. 执行以下命令创建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,执行addprincxst命令即可。

      重要

      多次导出Kerberos的keytab可能会导致之前的keytab文件失效。请确保slb.keytab中仅包含最新导出的Principal。如需再次导出Principal,请务必先删除之前生成的keytab文件。

  3. 执行以下命令,将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
  4. 执行以下命令,查看hive.keytab中的内容。

    klist -kt /etc/taihao-apps/hive-conf/keytab/hive.keytab

    image

  5. 修改集群的Hive配置。

    在EMR控制台的Hive服务的配置页签,搜索参数hive.server2.authentication.kerberos.principal,修改参数值为hive/121.40.**.**@EMR.**.COM,即修改为上步骤中创建的Principal。然后保存并生效配置。image

  6. 重启集群HiveServer服务。

    1. 在EMR控制台的Hive服务的状态页签,在HiveServer操作列的重启

    2. 输入执行原因,单击确定

    3. 确认对话框中,单击确定

  7. 在master-1-1节点,执行以下命令访问HiveServer2。

    beeline -u 'jdbc:hive2://121.40.**.**:10000/default;principal=hive/121.40.**.**@EMR.**.COM'