高可用性
为 HiveServer2 启用高可用性
为了启用 HiveServer2 的高可用性,用户应采取以下两个步骤:
- 在
env.sh中设置环境变量MR3_SHARED_SESSION_ID - 通过更新
hive-site.xml配置高可用性
首先,在启动 HiveServer2 实例之前将 MR3_SHARED_SESSION_ID 设置为一个唯一字符串,例如:
vi env.sh
export MR3_SHARED_SESSION_ID=d7b52f74-7349-405c-88a2-d0d1cbb5a918
该环境变量(其值在 HiveServer2 内部用作 MR3 会话 ID)可以设置为任何字符串,但应在所有 HiveServer2 实例中保持相同,以便它们共享 HDFS 上的同一个临时目录。
接下来,通过更新 hive-site.xml 来配置 HiveServer2。下表显示了与 HiveServer2 高可用性相关的配置键。特别是,将 hive.server2.active.passive.ha.enable 设置为 true 可以启用高可用性,并允许所有 HiveServer2 实例共享一个通用的 MR3 DAGAppMaster。需要注意的是,高可用性需要服务发现(由 hive.server2.support.dynamic.service.discovery 指定),以便所有 HiveServer2 实例都可以注册到 ZooKeeper。
| 名称 | 默认值 | 启用高可用性的示例 |
|---|---|---|
| hive.server2.active.passive.ha.enable | false | true |
| hive.server2.support.dynamic.service.discovery | false | true |
| hive.mr3.zookeeper.appid.namespace | mr3AppId | (默认值) |
| hive.server2.active.passive.ha.registry.namespace | hs2ActivePassiveHA | (默认值) |
| hive.server2.zookeeper.namespace | hiveserver2 | hiveserver2-mr3 |
| hive.zookeeper.quorum | blue0:2181 | blue0:2181 |
| hive.zookeeper.client.port | 2181 | 2181 |
由于 HiveServer2 的高可用性使用服务发现,Beeline 连接会随机选择一个 HiveServer2 实例。为了利用服务发现的优势,用户在运行 Beeline 时应指定 ZooKeeper 服务器和命名空间。例如,对于在 blue0:2181 上运行的 ZooKeeper 服务器和命名空间 hiveserver2-mr3,用户可以按如下方式在 env.sh 中设置环境变量 HIVE_SERVER2_JDBC_OPTS。
vi env.sh
HIVE_SERVER2_JDBC_OPTS="ssl=false;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2-mr3"
在同一节点上运行多个 HiveServer2 实例
如果多个 HiveServer2 实例要在同一节点上运行,用户应通过在 env.sh 中设置环境变量 HIVE_SERVER2_PORT 为每个 HiveServer2 实例分配不同的端口。此外,应在 hive-site.xml 中设置以下两个配置键。
- 将
hive.server2.webui.port设置为 0 以避免冲突 - 适当设置
hive.server2.logging.operation.log.location,例如/tmp/hive/operation_logs/${hive.server2.port}
使用 ZooKeeper
如果 HiveServer2 在启动时建立与 ZooKeeper 的连接,用户应确保 HiveServer2 使用的 Curator 模块(org.apache.curator)与 ZooKeeper 服务兼容。如果不兼容,用户应手动运行适当版本的 ZooKeeper,并在 hive-site.xml 中设置配置键 hive.zookeeper.quorum。