我正在做一个关于 Kubernetes 的项目,我使用 Spark SQL 创建表,我想将分区和模式添加到 Hive 元存储中。但是,我没有找到任何合适的文档来在 Kubernetes 上安装 Hive Metastore。知道我已经安装了PostGreSQL数据库是否有可能?如果是,你能帮我提供任何官方文件吗?
提前谢谢。
MR3 上的 Hive 允许用户在 Kubernetes 上的 Pod 中运行 Metastore。该指令可能看起来很复杂,但是一旦正确配置了 Pod,就很容易在 Kubernetes 上启动元存储。您还可以在 Docker Hub 上找到预构建的 Docker 映像。还提供了舵图。
https://mr3docs.datamonad.com/docs/k8s/guide/run-metastore/
https://mr3docs.datamonad.com/docs/k8s/helm/run-metastore/
该文档假定使用MySQL,但我们也使用PostgreSQL对其进行了测试。
要在 Kubernetes上安装 Hive Metastore,您需要一个运行 Metastore 服务的 Docker 镜像和一个 Kubernetes 部署配置。元存储服务连接到关系数据库以存储元数据。以下是步骤:
在 Kubernetes 上设置 Hive 元存储:
- 使用 YAML 文件创建用于
metastore-standalone
的 Kubernetes Pod。此 Pod 应包括: 下载- 应用程序所需依赖项的
Init Containers
。此容器使用busybox:1.28
映像并运行 shell 命令从 Maven 存储库下载hadoop-aws
和aws-java-sdk-bundle
JAR 文件。 - 运行
apache/hive:3.1.3
映像的Main Container
。此容器配置为运行 Hive 元存储服务。元存储服务管理 Hive 表和分区的元数据。 - Hive 元存储服务的几个
Environment Variables
。SERVICE_NAME
设置为metastore
。还设置了AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
,将用于访问 AWS S3。 - 首先将下载的 JAR 文件从
/jars
目录移动到/opt/hadoop/share/hadoop/common
目录的Command
。然后,它使用 Derby 作为数据库初始化元存储架构。最后,它运行 Hive 元存储服务。
- 应用程序所需依赖项的
- 使用 YAML 文件创建用于
使用远程数据库:此设置中的 Hive 元存储服务使用本地/嵌入式元存储数据库 (Derby(,该数据库适用于测试或开发目的。但是,对于生产用途,建议使用远程元存储数据库。Metastore 服务支持多种类型的数据库,包括 MySQL、Postgres、Oracle 和 MS SQL Server。您需要调整
schematool
命令并提供其他配置才能使用远程数据库。将 Spark 配置为使用远程 Hive 元存储和 S3 作为仓库:
- 若要将 Spark 指向 Hive 元存储服务,请在提交 Spark 应用程序时提供某些配置。这可以使用 Spark 配置来完成。这些配置包括您的 AWS 凭证、S3 存储桶名称和
hadoop-aws
程序包,这允许 Spark 与 S3 交互。 - 配置
spark.hadoop.fs.s3a.access.key
和spark.hadoop.fs.s3a.secret.key
提供与 AWS S3 交互所需的访问密钥。spark.hadoop.fs.s3a.endpoint
配置将终端节点设置为访问 S3 服务。 spark.sql.catalogImplementation
配置设置为hive
,这意味着应用程序将使用 Hive 的目录实现。spark.hadoop.hive.metastore.uris
配置设置用于连接到 Hive 元存储的 URI。
- 若要将 Spark 指向 Hive 元存储服务,请在提交 Spark 应用程序时提供某些配置。这可以使用 Spark 配置来完成。这些配置包括您的 AWS 凭证、S3 存储桶名称和
解决常见问题:
- 问题 1:如果 Docker 映像入口点中存在错误,最有效的解决方法是在 Kubernetes 配置的
containers
部分中使用自定义命令覆盖默认命令。此命令初始化 Derby 数据库的架构,然后启动 Hive 元存储服务。 - 问题 2:如果 Hive 的默认 Docker 映像不包含与 AWS 相关的 JAR 文件(这些文件对于将元存储服务连接到 S3 存储桶至关重要(,请在 Kubernetes 配置中添加 init 容器。此 init 容器基于
busybox
映像,从 Maven 存储库下载必要的 AWS JAR 文件,并将其存储在共享卷中。然后,将这些 JAR 添加到主 Hive 元存储容器的类路径中。 请记住,这些说明非常笼统,您可能需要调整它们以适应您的特定需求和环境。
- 问题 1:如果 Docker 映像入口点中存在错误,最有效的解决方法是在 Kubernetes 配置的
此外,请记住将 YAML 配置和 Spark 提交命令中的 AWS 访问密钥和私有密钥占位符替换为您的实际 AWS 凭证。
下面是一个简单的例子:
apiVersion: v1
kind: Pod
spec:
initContainers:
- name: download-dependencies
image: busybox:1.28
command:
- /bin/sh
- -c
- |
wget -P /jars https://repo1.maven.org/maven2/org/apache/hadoop/hadoop-aws/3.1.0/hadoop-aws-3.1.0.jar https://repo1.maven.org/maven2/com/amazonaws/aws-java-sdk-bundle/1.11.271/aws-java-sdk-bundle-1.11.271.jar
volumeMounts:
- name: jar-volume
mountPath: /jars
containers:
- name: hive-metastore
image: apache/hive:3.1.3
ports:
- containerPort: 9083
command: ["/bin/bash", "-c", "mv /jars/* /opt/hadoop/share/hadoop/common && /opt/hive/bin/schematool -dbType derby -initSchema && exec /opt/hive/bin/hive --skiphadoopversion --skiphbasecp --service metastore --hiveconf fs.s3a.endpoint=your-s3-endpoint"]
volumeMounts:
- name: jar-volume
mountPath: /jars
volumes:
- name: jar-volume
emptyDir: {}
我希望这有帮助!如果您有任何问题,请告诉我。