如何在 Kubernetes 中安装 Hive Metastore?



我正在做一个关于 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 部署配置。元存储服务连接到关系数据库以存储元数据。以下是步骤:

  1. 在 Kubernetes 上设置 Hive 元存储

    • 使用 YAML 文件创建用于metastore-standalone的 Kubernetes Pod。此 Pod 应包括: 下载
      • 应用程序所需依赖项的Init Containers。此容器使用busybox:1.28映像并运行 shell 命令从 Maven 存储库下载hadoop-awsaws-java-sdk-bundleJAR 文件。
      • 运行apache/hive:3.1.3映像的Main Container。此容器配置为运行 Hive 元存储服务。元存储服务管理 Hive 表和分区的元数据。
      • Hive 元存储服务的几个Environment VariablesSERVICE_NAME设置为metastore。还设置了AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY,将用于访问 AWS S3。
      • 首先将下载的 JAR 文件从/jars目录移动到/opt/hadoop/share/hadoop/common目录的Command。然后,它使用 Derby 作为数据库初始化元存储架构。最后,它运行 Hive 元存储服务。
  2. 使用远程数据库:此设置中的 Hive 元存储服务使用本地/嵌入式元存储数据库 (Derby(,该数据库适用于测试或开发目的。但是,对于生产用途,建议使用远程元存储数据库。Metastore 服务支持多种类型的数据库,包括 MySQL、Postgres、Oracle 和 MS SQL Server。您需要调整schematool命令并提供其他配置才能使用远程数据库。

  3. 将 Spark 配置为使用远程 Hive 元存储和 S3 作为仓库

    • 若要将 Spark 指向 Hive 元存储服务,请在提交 Spark 应用程序时提供某些配置。这可以使用 Spark 配置来完成。这些配置包括您的 AWS 凭证、S3 存储桶名称和hadoop-aws程序包,这允许 Spark 与 S3 交互。
    • 配置spark.hadoop.fs.s3a.access.keyspark.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。
  4. 解决常见问题

    • 问题 1:如果 Docker 映像入口点中存在错误,最有效的解决方法是在 Kubernetes 配置的containers部分中使用自定义命令覆盖默认命令。此命令初始化 Derby 数据库的架构,然后启动 Hive 元存储服务。
    • 问题 2:如果 Hive 的默认 Docker 映像不包含与 AWS 相关的 JAR 文件(这些文件对于将元存储服务连接到 S3 存储桶至关重要(,请在 Kubernetes 配置中添加 init 容器。此 init 容器基于busybox映像,从 Maven 存储库下载必要的 AWS JAR 文件,并将其存储在共享卷中。然后,将这些 JAR 添加到主 Hive 元存储容器的类路径中。 请记住,这些说明非常笼统,您可能需要调整它们以适应您的特定需求和环境。

此外,请记住将 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: {}

我希望这有帮助!如果您有任何问题,请告诉我。

最新更新