Helm
本页面介绍如何使用 Helm 和 DockerHub 上提供的预构建 Docker 镜像在 Minikube 上操作 Hive on MR3。所有组件(Metastore、HiveServer2、MR3 DAGAppMaster 和 MR3 ContainerWorkers)将在 Minikube 内运行。对于 Metastore 数据库,我们将在 Docker 容器中运行 MySQL 数据库,但使用现有的 MySQL 数据库也可以。按照以下说明,用户将学习:
- 如何使用 Helm 启动 Metastore
- 如何使用 Helm 运行 Hive on MR3
- 如何创建 Beeline 连接并向在 Minikube 内运行的 HiveServer2 发送查询
前置条件
在 Minikube 上运行 Hive on MR3 有以下前置条件:
- 一个正在运行的 Minikube 集群可用。
- 用户能够执行:1) 命令
kubectl;2) 命令helm;3) 命令docker(如果没有 MySQL 数据库可用)。
安装 Hive on MR3 后,进入 helm 目录。
cd helm/
在我们的示例中,所有命令由用户 gla 执行。我们使用 Helm 2.17.0。
如果在安装 Hive on MR3 时未执行 install.sh,请手动创建指向两个目录 kubernetes/conf 和 kubernetes/key 的符号链接。
mkdir -p ../kubernetes/key
ln -s ../../kubernetes/conf/ hive/conf
ln -s ../../kubernetes/key/ hive/key
概述
Hive on MR3 创建四种 Pod:Metastore、HiveServer2、MR3 DAGAppMaster 和 MR3 ContainerWorker。用户手动创建一个 Metastore Pod 和一个 HiveServer2 Pod。HiveServer2 创建一个 DAGAppMaster Pod,DAGAppMaster 在执行查询时创建 ContainerWorker Pod。
使用 Helm 运行 Hive on MR3 涉及以下步骤:
- 用户创建
values-minikube.yaml来配置 Pod。 - 用户在配置目录
hive/conf中更新hive-site.xml、mr3-site.xml和tez-site.xml。 - 用户使用
values-minikube.yaml安装 Hive on MR3 的 Helm chart 以启动 Metastore 和 HiveServer2。
在第二步中,更新 hive-site.xml 和 mr3-site.xml 通常足以开始使用,因为 tez-site.xml 中的默认值在常见设置中效果良好。
启动 MySQL 数据库
为简单起见,我们将在 Docker 容器中为 Metastore 数据库运行 MySQL 数据库。
docker run -d --name mysql-server -p 3306:3306 -e MYSQL_ROOT_PASSWORD=passwd mysql:5.6
mysql --user=root --password=passwd --host=127.0.0.1 -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
创建本地目录
我们需要创建两个新的本地目录:
- 用于由所有 Pod 共享的 PersistentVolume
- 用于 ContainerWorker Pod 写入中间数据的 hostPath 卷
为 PersistentVolume 创建本地目录。在我们的示例中,我们使用 /data1/gla/workdir。
mkdir /data1/gla/workdir
chmod 777 /data1/gla/workdir
为 ContainerWorker Pod 的 hostPath 卷创建本地目录。在我们的示例中,我们使用 /data1/gla/k8s。
mkdir -p /data1/gla/k8s
chmod 777 /data1/gla/k8s
配置 Pod
创建新文件 hive/values-minikube.yaml 并更新以下字段以覆盖 values.yaml 中的默认值。
docker.image设置为除 ContainerWorker Pod 外所有 Pod 的 Docker 镜像。docker.containerWorkerImage设置为 ContainerWorker Pod 的 Docker 镜像。docker.imagePullPolicy设置为IfNotPresent,因为我们从 DockerHub 下载 Docker 镜像。create.metastore设置为 true,因为我们将要创建 Metastore Pod。metastore.databaseHost设置为 MySQL 数据库运行所在主机的地址。metastore.initSchema设置为 true,因为这是首次运行 Metastore。对于后续运行,用户可以将其设置为 false。hive.externalIp设置为 HiveServer2 Pod 的 Service 的 IP 地址。workDir.volumeStr设置为先前创建的 PersistentVolume 的本地目录。
设置 HiveServer2 和 Metastore Pod 的资源。heapSize 指定 Java 进程的内存大小(以 MB 为单位),应设置为与 resources.requests.memory 等效的值。
vi hive/values-minikube.yaml
docker:
image: mr3project/hive:4.0.0.mr3.2.4
containerWorkerImage: mr3project/hive:4.0.0.mr3.2.4
imagePullPolicy: IfNotPresent
create:
metastore: true
metastore:
databaseHost: 192.168.10.1 # 使用您的 IP 地址(MySQL 数据库运行的地址)
warehouseDir: file:///opt/mr3-run/work-dir/warehouse
initSchema: true
resources:
requests:
cpu: 1
memory: 4Gi
limits:
cpu: 1
memory: 4Gi
heapSize: 4096
hive:
externalIp: 192.168.10.1 # 使用您的 IP 地址
resources:
requests:
cpu: 1
memory: 8Gi
limits:
cpu: 1
memory: 8Gi
heapSize: 8192
workDir:
isNfs: false
volumeStr: "hostPath:\n path: /home/gla/workdir"
更新 hive/templates/metastore.yaml 以删除 nodeAffinity,因为我们不使用节点亲和性规则。
vi hive/templates/metastore.yaml
affinity:
# nodeAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# nodeSelectorTerms:
# - matchExpressions:
# - key: roles
# operator: In
# values:
# - "masters"
DAGAppMaster Pod 的资源
默认情况下,我们为 DAGAppMaster Pod 分配 16GB 内存和 4 个 CPU。要调整资源,请更新 conf/mr3-site.xml。
vi conf/mr3-site.xml
<property>
<name>mr3.am.resource.memory.mb</name>
<value>16384</value>
</property>
<property>
<name>mr3.am.resource.cpu.cores</name>
<value>4</value>
</property>
配置 MR3 DAGAppMaster 和 ContainerWorker Pod
打开 hive/conf/mr3-site.xml 并将配置键 mr3.k8s.pod.image.pull.policy 设置为 IfNotPresent,因为我们从 DockerHub 下载 Docker 镜像。将配置键 mr3.k8s.pod.worker.hostpaths 设置为 hostPath PersistentVolume 的本地目录。
vi hive/conf/mr3-site.xml
<property>
<name>mr3.k8s.pod.image.pull.policy</name>
<value>IfNotPresent</value>
</property>
<property>
<name>mr3.k8s.pod.worker.hostpaths</name>
<value>/data1/gla/k8s</value>
</property>
配置安全
更新 hive/conf/hive-site.xml 中的以下配置键。
- 两个配置键
javax.jdo.option.ConnectionUserName和javax.jdo.option.ConnectionPassword应与 MySQL 服务器用于 Metastore 的用户名和密码匹配。 hive.metastore.pre.event.listeners设置为空,因为我们在 Metastore 端未启用安全。hive.security.authorization.manager设置为使用SQLStdHiveAuthorizerFactory。
vi hive/conf/hive-site.xml
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>passwd</value>
</property>
<property>
<name>hive.metastore.pre.event.listeners</name>
<value></value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
</property>
配置资源
在 hive/conf/hive-site.xml 中,以下配置键指定分配给 Map Task、Reduce Task 或 ContainerWorker 的资源。在我们的示例中,我们为 Map Task、Reduce Task 和 ContainerWorker 分配 2GB 内存和单个核心。
vi hive/conf/hive-site.xml
<property>
<name>hive.mr3.map.task.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>hive.mr3.map.task.vcores</name>
<value>1</value>
</property>
<property>
<name>hive.mr3.reduce.task.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>hive.mr3.reduce.task.vcores</name>
<value>1</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.vcores</name>
<value>1</value>
</property>
更新这些配置键时,应满足以下要求:
hive.mr3.map.task.memory.mb≤hive.mr3.all-in-one.containergroup.memory.mbhive.mr3.map.task.vcores≤hive.mr3.all-in-one.containergroup.vcoreshive.mr3.reduce.task.memory.mb≤hive.mr3.all-in-one.containergroup.memory.mbhive.mr3.reduce.task.vcores≤hive.mr3.all-in-one.containergroup.vcores
配置 Minikube
在启动 Hive on MR3 之前,用户应从 minikube 节点删除标签 node-role.kubernetes.io/master。这是因为 Hive on MR3 在估计 ContainerWorker Pod 的资源时不计算主节点的资源。由于 minikube 节点是 Minikube 集群中唯一的节点且是主节点,我们应该将其降级为普通节点,以便为 ContainerWorker Pod 保障资源。因此,为了能够在 minikube 节点中创建 ContainerWorker Pod,用户应执行以下命令:
kubectl label node minikube node-role.kubernetes.io/master-
启动 Hive on MR3
hive/values-hive.yaml 不应包含两个针对同一键的单独部分。在以下示例中,字段 metastore.databaseHost 被忽略,因为第二个部分针对键 metastore。
metastore:
databaseHost: 192.168.10.1
metastore:
initSchema: true
在启动 Hive on MR3 之前,确保命名空间 hivemr3 中没有 ConfigMaps 和 Services。例如,用户可能会看到从上一次运行留下的 ConfigMaps 和 Services。
kubectl get configmaps -n hivemr3
NAME DATA AGE
mr3conf-configmap-master 1 7m12s
mr3conf-configmap-worker 1 7m7s
kubectl get svc -n hivemr3
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-master-6730-0 ClusterIP 10.97.29.191 <none> 80/TCP,9890/TCP 7m32s
service-worker ClusterIP None <none> <none> 7m29s
在这种情况下,请手动删除这些 ConfigMaps 和 Services。
kubectl delete configmap -n hivemr3 mr3conf-configmap-master mr3conf-configmap-worker
kubectl delete svc -n hivemr3 service-master-6730-0 service-worker
使用 hive/values-minikube.yaml 安装 Hive on MR3 的 Helm chart。我们使用 hivemr3 作为命名空间。Metastore 自动从 https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-8.0.28.tar.gz 下载 MySQL 连接器。
helm install --namespace hivemr3 hive -f hive/values-minikube.yaml
2025/03/19 20:15:15 found symbolic link in path: /data1/gla/mr3/helm/hive/conf resolves to /data1/gla/mr3/kubernetes/conf
2025/03/19 20:15:15 found symbolic link in path: /data1/gla/mr3/helm/hive/key resolves to /data1/gla/mr3/kubernetes/key
NAME: romping-rattlesnake
LAST DEPLOYED: Wed Mar 19 20:15:15 2025
NAMESPACE: hivemr3
STATUS: DEPLOYED
...
==> v1/ConfigMap
NAME DATA AGE
client-am-config 4 0s
env-configmap 1 0s
hivemr3-conf-configmap 18 0s
...
检查所有 ConfigMaps 是否非空。如果 hivemr3-conf-configmap 的 DATA 列为 0,请尝试删除配置目录 conf 中的不必要文件。这通常发生在安装 Helm chart 时保留了一个临时文件(例如 .hive-site.xml.swp)时。
在 Minikube 集群中找到三个正在运行的 Pod:Metastore、HiveServer2 和 MR3 DAGAppMaster。HiveServer2 Pod 在 readiness probe 联系后变为就绪状态。根据 readiness probe 的配置,HiveServer2 可能会在正常运行之前重启一次。在提交查询之前不会创建任何 ContainerWorkers Pod。
kubectl get pods -n hivemr3
NAME READY STATUS RESTARTS AGE
hivemr3-hiveserver2-78d455fb76-jrqgt 1/1 Running 0 2m26s
hivemr3-metastore-0 1/1 Running 0 2m26s
mr3master-4798-0-68459c444f-lzmjl 1/1 Running 0 53s
运行 Beeline
用户可以使用任意客户端程序(不一定是 MR3 release 中包含的 Beeline)通过 Helm 创建的 Service 连接到 HiveServer2(默认打开 Thrift 端口 9852 和 HTTP 端口 10001)。在我们的示例中,我们在 Hiveserver2 Pod 内运行 Beeline。
下载示例数据集并将其复制到 PersistentVolume 的目录。
wget https://github.com/mr3project/mr3/releases/download/v2.0/pokemon.csv
cp pokemon.csv /data1/gla/workdir
chmod 777 /data1/gla/workdir/pokemon.csv
用户可以验证示例数据集在 HiveServer2 Pod 内可访问。
kubectl exec -n hivemr3 -it hivemr3-hiveserver2-78d455fb76-jrqgt -- /bin/bash -c "ls /opt/mr3-run/work-dir/pokemon.csv"
/opt/mr3-run/work-dir/pokemon.csv
运行 Beeline。
kubectl exec -n hivemr3 -it hivemr3-hiveserver2-78d455fb76-jrqgt -- /bin/bash -c 'export PS1="$ "; exec /bin/bash'
export USER=root
/opt/mr3-run/hive/run-beeline.sh
Output directory: /opt/mr3-run/hive/run-result/hivemr3-2025-03-19-11-18-36
# Running Beeline using Hive-MR3
...
Connecting to jdbc:hive2://hivemr3-hiveserver2-78d455fb76-jrqgt:9852/;;
Connected to: Apache Hive (version 4.0.0)
Driver: Hive JDBC (version 4.0.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 4.0.0 by Apache Hive
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7>
使用默认数据库。
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> show databases;
...
+----------------+
| database_name |
+----------------+
| default |
+----------------+
1 row selected (1.999 seconds)
创建一个名为 pokemon 的表。
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> CREATE TABLE pokemon (Number Int,Name String,Type1 String,Type2 String,Total Int,HP Int,Attack Int,Defense Int,Sp_Atk Int,Sp_Def Int,Speed Int) row format delimited fields terminated BY ',' lines terminated BY '\n' tblproperties("skip.header.line.count"="1");
导入示例数据集。
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> load data local inpath '/opt/mr3-run/work-dir/pokemon.csv' INTO table pokemon;
执行查询。
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> select avg(HP) from pokemon;
...
+---------------------+
| _c0 |
+---------------------+
| 144.84882280049567 |
+---------------------+
1 row selected (20.693 seconds)
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> create table pokemon1 as select *, IF(HP>160.0,'strong',IF(HP>140.0,'moderate','weak')) AS power_rate from pokemon;
...
0: jdbc:hive2://hivemr3-hiveserver2-78d455fb7> select COUNT(name), power_rate from pokemon1 group by power_rate;
...
+------+-------------+
| _c0 | power_rate |
+------+-------------+
| 108 | moderate |
| 363 | strong |
| 336 | weak |
+------+-------------+
3 rows selected (1.426 seconds)
用户可以看到已创建 ContainerWorker Pod。
kubectl get pods -n hivemr3
NAME READY STATUS RESTARTS AGE
hivemr3-hiveserver2-78d455fb76-jrqgt 1/1 Running 0 5m43s
hivemr3-metastore-0 1/1 Running 0 5m43s
mr3master-4798-0-68459c444f-lzmjl 1/1 Running 0 4m10s
mr3worker-ccbd-1 1/1 Running 0 67s
mr3worker-ccbd-2 1/1 Running 0 16s
用户可以找到仓库目录 /data1/gla/workdir/warehouse。
ls /data1/gla/workdir/warehouse
pokemon pokemon1
停止 Hive on MR3
为了终止 Hive on MR3,用户应首先删除 DAGAppMaster Pod,然后删除 Helm chart,而不是相反。这是因为删除 Helm chart 会撤销 DAGAppMaster 用于删除 ContainerWorker Pod 的 ServiceAccount 对象。因此,如果用户先删除 Helm chart,则必须手动删除所有剩余的 Pod。
删除 DAGAppMaster 的 Deployment,这会自动删除所有 ContainerWorker Pod。
kubectl get deployment -n hivemr3
NAME READY UP-TO-DATE AVAILABLE AGE
hivemr3-hiveserver2 1/1 1 1 6m3s
mr3master-4798-0 1/1 1 1 4m30s
kubectl -n hivemr3 delete deployment mr3master-4798-0
deployment.extensions "mr3master-4798-0" deleted
删除 Helm chart。
helm delete romping-rattlesnake
release "romping-rattlesnake" deleted
作为最后一步,用户将发现属于命名空间 hivemr3 的以下对象仍然存在:
- 两个 ConfigMaps
mr3conf-configmap-master和mr3conf-configmap-worker - DAGAppMaster 的 Service,例如
service-master-4798-0 - Service
service-worker
kubectl get configmaps -n hivemr3
NAME DATA AGE
mr3conf-configmap-master 1 5m23s
mr3conf-configmap-worker 1 5m18s
kubectl get svc -n hivemr3
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service-master-4798-0 ClusterIP 10.104.212.174 <none> 80/TCP,9890/TCP 5m36s
service-worker ClusterIP None <none> <none> 5m32s
这些 ConfigMaps 和 Services 没有被命令 helm delete 删除,因为它们不是由 Helm 而是由 HiveServer2 和 DAGAppMaster 创建的。因此,用户应手动删除这些 ConfigMaps 和 Services。
kubectl delete configmap -n hivemr3 mr3conf-configmap-master mr3conf-configmap-worker
configmap "mr3conf-configmap-master" deleted
configmap "mr3conf-configmap-worker" deleted
kubectl delete svc -n hivemr3 service-master-4798-0 service-worker
service "service-master-4798-0" deleted
service "service-worker" deleted