HiveServer2负载均衡

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,执行 addprinc xst 命令即可。

      重要

      多次导出 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'