跳到主要内容

执行滚动更新

HivePlus 允许用户对 HiveServer2、DAGAppMaster 和 ContainerWorker Pod 执行滚动更新。通过执行滚动更新,用户在有新 Docker 镜像可用时不必终止 HivePlus 的活动实例。

设置镜像拉取策略

为了对 DAGAppMaster 和 ContainerWorker Pod 执行滚动更新,用户应确保在 conf/mr3-site.xml 中将配置键 mr3.k8s.pod.image.pull.policy 设置为 Always,以便更新后创建的新 Pod 使用最新的 Docker 镜像。

vi conf/mr3-site.xml
<property>
<name>mr3.k8s.pod.image.pull.policy</name>
<value>Always</value>
</property>

对于 HiveServer2 Pod,用户应在 yaml/hive.yaml 中将字段 spec.template.spec.containers.imagePullPolicy 设置为 Always

vi yaml/hive.yamlspec: template: spec: containers: imagePullPolicy: Always

一种简单的方法是直接删除正在运行的 Pod。由于 MR3 的容错和恢复机制,这在大多数情况下效果很好。缺点是所有正在执行的查询可能会经历短暂的延迟,或者如果 DAGAppMaster Pod 被删除,甚至会失败。在生产环境中,不应有查询被中断,我们建议用户改用 MasterControl 来优雅地停止 DAGAppMaster 和 ContainerWorker Pod。

下面我们演示如何使用 MasterControl 执行滚动更新。

使用 MasterControl 更新 ContainerWorker Pod

首先从 HiveServer2 的日志文件中获取 ApplicationID(在 Kubernetes 外部)。

kubectl logs -n hivemr3 hivemr3-hiveserver2-78d455fb76-jrqgt | grep ApplicationID2020-01-14T07:01:06,552 INFO [main] client.MR3Client$: Starting DAGAppMaster with ApplicationID application_30211_0000 in session mode

在 HiveServer2 Pod 内执行带有命令 stopContainerWorkers 的 MasterControl,以优雅地停止所有 ContainerWorker。用户甚至可以在有查询正在运行的情况下执行 MasterControl(不会受到影响)。

kubectl exec -n hivemr3 -it hivemr3-hiveserver2-78d455fb76-jrqgt -- /bin/bash -c 'export PS1="$ "; exec /bin/bash'./master-control.sh stopContainerWorkers application_30211_0000Sent a request to stop all ContainerWorkers for application_30211_0000

在所有查询完成且 ContainerWorker Pod 被删除后,用户可以更新 ContainerWorker Pod 的 Docker 镜像。然后所有新的 ContainerWorker Pod 都使用更新的 Docker 镜像。

使用 MasterControl 更新 DAGAppMaster Pod

与更新 ContainerWorker Pod 类似,用户可以通过执行带有命令 closeDagAppMaster 的 MasterControl 来更新 DAGAppMaster Pod。但是,与更新 ContainerWorker Pod 不同,用户应在执行 MasterControl 之前更新 DAGAppMaster Pod 的 Docker 镜像,因为新的 DAGAppMaster Pod 会自动启动。由于执行 MasterControl 不会影响正在运行的查询,用户可以随时执行 MasterControl。稍后,使用新 Docker 镜像的新 DAGAppMaster Pod 会启动。

./master-control.sh closeDagAppMaster application_30211_0000Sent a request to close DAGAppMaster for application_30211_0000

更新 HiveServer2 Pod

MR3 使用 Deployment 资源来管理 HiveServer2。因此,用户可以遵循 Deployment 资源的标准程序来执行 HiveServer2 Pod 的滚动更新。