当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.hostportsZookeeper的连接地址,请根据实际情况填写,本示例为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. 创建SLB实例,详情请参见创建和管理CLB实例
  2. 在默认服务器组中添加EMR集群HiveServer2服务所在ECS实例,根据需要配置ECS的权重。
  3. 配置TCP端口,端口自定义,后端协议/端口配置为TCP:10000。SLB的调度算法根据需要进行选择。
    详情请参见添加TCP监听monitor
  4. 访问HiveServer2。
    1. 通过SSH方式连接集群,详情请参见登录集群
    2. 执行以下命令,直接访问SLB对应的IP地址(或您使用已有的hostname绑定SLB的IP地址)和端口,即可以负载均衡的方式连接集群多个HiveServer2服务。
      beeline -u 'jdbc:hive2://<slb_ip_or_host>:<slb_port>'

      其中<slb_ip_or_host>为SLB的IP地址或绑定的hostname,<slb_port>为SLB前端监听的端口。

      Hue连接该负载均衡HiveServer2,需要在Hue配置的hue页签中修改以下参数。
      参数描述
      hive_server2_host填写为SLB的IP地址或绑定的hostname。
      hive_server2_port填写为SLB前端监听的端口。

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地址以负载均衡方式访问HiveServer2

    本示例假设SLB的IP地址为121.41.**.**,前端监听端口为10000,具体请根据实际情况进行修改。

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

      如果EMR Kerberos集群使用的是EMR自带的HAS Kerberos,则使用如下方式创建并导出SLB所需的Principal。

      1. 登录集群的master-1-1节点,详情请参见登录集群
      2. 执行以下命令,进入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
      3. 执行以下命令创建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,执行addprincxst命令即可。
        重要 MIT Kerberos多次导出keytab会导致之前导出的keytab失效,所以需确保slb.keytab只导出一次。
    2. 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_keytab
    3. 修改集群的Hive配置。
      在EMR控制台的Hive服务的配置页签,搜索参数hive.server2.authentication.kerberos.principal,修改参数值为hive/121.41.**.**@EMR.**.COM,即修改为上步骤中创建的Principal。然后保存并选中自动更新配置。Principal
    4. 重启集群HiveServer服务。
      1. 在EMR控制台的Hive服务的状态页签,在HiveServer操作列的重启
      2. 输入执行原因,单击确定
      3. 确认对话框中,单击确定
    5. 使用以下命令访问HiveServer2。
      beeline -u 'jdbc:hive2://121.41.**.**/default;principal=hive/121.41.**.**@EMR.**.COM'
  • 方式二:使用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前端监听的端口。