高可用性
在 Kubernetes 上,HiveServer2 的高可用性由 Kubernetes 直接支持,因为我们使用 Deployment 来创建 HiveServer2 Pod。
Hadoop 上 HiveServer2 的高可用性
结合 ZooKeeper 的服务发现,Hadoop 上的 HivePlus 支持高可用性,允许多个 HiveServer2 实例共享一个共同的 MR3 DAGAppMaster。由于单个 MR3 DAGAppMaster 为所有 HiveServer2 实例服务,无论 Beeline 连接联系哪个 HiveServer2 实例,集群中的所有资源都能被充分利用。此外,并发运行多个 HiveServer2 实例意味着单个 HiveServer2 实例在重负载下不太可能发生故障。因此,HivePlus 的高可用性使我们能够在最大程度利用集群的同时最小化服务故障的可能性。

如果启用了高可用性,HivePlus 维护一个 leader HiveServer2 实例,该实例负责检查当前 MR3 DAGAppMaster 的 Yarn 应用程序状态,并在发生错误时启动新的 Yarn 应用程序。启动新的 Yarn 应用程序后(包括第一个 HiveServer2 实例启动的情况),leader HiveServer2 实例会在专用的 ZooKeeper znode 中更新 Yarn ApplicationID。然后所有 HiveServer2 实例都会收到更新后的 Yarn ApplicationID 通知,并与新的 MR3 DAGAppMaster 建立新的连接。如果 leader HiveServer2 实例崩溃,ZooKeeper 会选举另一个 HiveServer2 实例作为新的 leader。通过这种方式,我们确保所有 HiveServer2 实例保持对共同 MR3 DAGAppMaster 的一致视图。
运行多个 HiveServer2 实例
作为 HivePlus 高可用性的一个应用,我们可以运行多个 HiveServer2 实例,每个实例都有自己的 Metastore,而无需拆分集群。额外的要求是,在使用 Kerberos 的安全集群中,所有 Metastore 实例应通过使用相同的 KDC(Kerberos 票据的分发中心)和 KMS(委托令牌的密钥管理服务器)在同一集群中管理数据。例如,我们不能导入在不同安全集群中运行的多个 Metastore 实例。需要注意的是,由于多个 Metastore 实例可达,在运行 Beeline 时不应使用服务发现模式,即用户应手动指定目标 HiveServer2 实例的地址。
高可用性仅在 HivePlus 的共享会话模式下才有意义。在独立会话模式下,每个 Beeline 连接都会创建自己的 DAGAppMaster,因此仅服务发现就足够了,启用高可用性没有意义。