设置 YAML 文件
下面我们提供 yaml 目录中 YAML 文件的详细信息。
这些文件应更新以反映 env.sh 中的设置和 Kubernetes 集群的具体配置。由于 YAML 文件不读取环境变量,所有必要的更新必须手动完成。
所有 Pod 共用
namespace.yaml
此清单为所有 Kubernetes 对象定义一个命名空间。name 字段应与 kubernetes/env.sh 中 MR3_NAMESPACE 指定的命名空间匹配。
vi yaml/namespace.yaml name: hivemr3
同样,其他 YAML 文件中的 namespace 字段应匹配相同的命名空间。
hive-service-account.yaml
此清单定义一个 ServiceAccount。ServiceAccount 对象的名称(hive-service-account)在 run-hive.sh 中读取,因此无需更新此文件。
cluster-role.yaml
此清单定义一个 ClusterRole。ClusterRole 资源的名称(node-reader)在 run-hive.sh 中读取,因此无需更新此文件。
metastore-role.yaml
此清单为 Metastore Pod 定义一个 Role。Role 资源的名称(metastore-role)在 run-metastore.sh 中读取,因此无需更新此文件。
hive-role.yaml
此清单为 HiveServer2 Pod 定义一个 Role。Role 资源的名称(hive-role)在 run-hive.sh 中读取,因此无需更新此文件。
workdir-pv.yaml
此清单为 PersistentVolume 定义一个卷,用于将查询结果从 ContainerWorker 复制到 HiveServer2。用户应更新它以使用所需类型的 PersistentVolume。
workdir-pvc.yaml
此清单定义一个 PersistentVolumeClaim,引用由 workdir-pv.yaml 创建的 PersistentVolume。用户应指定存储大小。
vi yaml/workdir-pvc.yaml storage: 10Gi
配置 Metastore
metastore-service.yaml
此清单定义管理 Metastore 的 StatefulSet 所需的服务。用户应使用 env.sh 中环境变量 HIVE_METASTORE_PORT 指定的相同端口号。
vi yaml/metastore-service.yaml ports: - name: tcp port: 9850
metastore.yaml
此清单为运行 Metastore 定义一个 Pod。用户应根据 Kubernetes 集群设置更新此文件中的几个部分。
在 spec.template.spec.containers 部分:
image字段应与env.sh中DOCKER_HIVE_IMG指定的 Docker 镜像匹配。resources.requests和resources.limits指定分配给 Metastore Pod 的资源。ports.containerPort字段应与metastore-service.yaml中指定的端口号匹配。
vi yaml/metastore.yamlspec: template: spec: containers: - image: mr3project/hive:4.0.0.mr3.2.4 resources: requests: cpu: 2 memory: 16Gi limits: cpu: 2 memory: 16Gi ports: - containerPort: 9850 protocol: TCP
在 spec.template.spec.volumes 部分:
conf-k8s-volume下的configMap.name字段应与env.sh中CONF_DIR_CONFIGMAP指定的名称匹配。key-k8s-volume下的secret.secretName字段应与env.sh中KEYTAB_SECRET指定的名称匹配。
vi yaml/metastore.yamlspec: template: spec: volumes: - name: conf-k8s-volume configMap: name: hivemr3-conf-configmap - name: key-k8s-volume secret: secretName: hivemr3-keytab-secret
在 spec.template.spec.hostAliases 部分:
env.sh中的HIVE_DATABASE_HOST指定运行 Metastore 数据库的主机。如果它使用默认 DNS 未知的主机,用户应添加其别名。以下示例添加了默认 DNS 未知的主机名red0和indigo20。
vi yaml/metastore.yamlspec: template: spec: hostAliases: - ip: "10.1.91.4" hostnames: - "red0" - ip: "10.1.91.41" hostnames: - "indigo20"
配置 HiveServer2
hiveserver2-service.yaml
此清单定义一个服务,用于将 HiveServer2 暴露到 Kubernetes 集群外部。用户应指定一个带有有效主机名的公共 IP 地址和 HiveServer2 的端口号(名称为 thrift),以便客户端可以从 Kubernetes 集群外部连接到它。如果启用了 HTTP 传输(通过在 conf/hive-site.xml 中将配置键 hive.server2.transport.mode 设置为 all 或 http),则应指定另一个端口号(名称为 http)。主机名是必需的,以便 Ranger 可以安全地与 HiveServer2 通信。
vi yaml/hiveserver2-service.yaml ports: - protocol: TCP port: 9852 targetPort: 9852 name: thrift - protocol: TCP port: 10001 targetPort: 10001 name: http externalIPs: - 10.1.91.41
在我们的示例中,我们使用 10.1.91.41:9852 作为 HiveServer2 的完整地址。用户应确保 IP 地址存在且带有有效的主机名,且未被占用。
hive.yaml
此清单通过创建 Deployment 来定义运行 HiveServer2 的 Pod。用户应根据 Kubernetes 集群设置更新此文件中的几个部分。
在 spec.template.spec.containers 部分:
image字段应与env.sh中DOCKER_HIVE_IMG指定的 Docker 镜像匹配。args字段指定 DAGAppMaster 模式:--localthread为 LocalThread 模式,--localprocess为 LocalProcess 模式,--kubernetes为 Kubernetes 模式。resources.requests和resources.limits字段指定分配给 HiveServer2 Pod 的资源。- 三个字段
ports.containerPort、readinessProbe.tcpSocket.port和livenessProbe.tcpSocket.port应与hiveserver2-service.yaml中指定的端口号匹配。
$ vi yaml/hive.yamlspec: template: spec: containers: - image: mr3project/hive:4.0.0.mr3.2.4 args: ["start", "--kubernetes"] resources: requests: cpu: 4 memory: 32Gi limits: cpu: 4 memory: 32Gi ports: - containerPort: 9852 readinessProbe: tcpSocket: port: 9852 livenessProbe: tcpSocket: port: 9852
在 spec.template.spec.volumes 部分:
conf-k8s-volume下的configMap.name字段应与env.sh中CONF_DIR_CONFIGMAP指定的名称匹配。key-k8s-volume下的secret.secretName字段应与env.sh中KEYTAB_SECRET指定的名称匹配。
vi yaml/hive.yamlspec: template: spec: volumes: - name: conf-k8s-volume configMap: name: hivemr3-conf-configmap - name: key-k8s-volume secret: secretName: hivemr3-keytab-secret
spec.template.spec.hostAliases 字段可以列出默认 DNS 可能找不到的主机的别名。例如,运行 Metastore 的主机可能对默认 DNS 未知,在这种情况下,用户可以为其添加别名。