与 Google Cloud Storage 和 BigQuery 集成
本文档描述了如何在 SparkApplication
中使用 Google Cloud 服务(例如 Google Cloud Storage (GCS) 和 BigQuery)作为数据源或数据汇。有关构建访问 GCS 和 BigQuery 的 Spark 应用程序的详细教程,请参阅 使用 Kubernetes Engine 上的 Spark 处理 BigQuery 中的数据。
Spark 应用程序需要 GCS 和 BigQuery 连接器才能使用 Hadoop FileSystem
API 访问 GCS 和 BigQuery。使连接器可用于驱动程序和执行程序的一种方法是使用内置这些连接器的自定义 Spark 镜像,如这个示例 Dockerfile 所示。从这个 Dockerfile 构建的镜像位于 gcr.io/ynli-k8s/spark:v2.3.0-gcs
。
连接器需要正确设置某些 Hadoop 属性才能工作。设置 Hadoop 属性可以通过自定义 Hadoop 配置文件(即自定义镜像中的 core-site.xml
),或通过 SparkApplication
中的 spec.hadoopConf
部分来完成。上面提到的示例 Dockerfile 展示了如何使用自定义的 core-site.xml
和自定义的 spark-env.sh
,后者将环境变量 HADOOP_CONF_DIR
指向容器中 core-site.xml
所在的目录。示例 core-site.xml
和 spark-env.sh
可在此处找到。
GCS 和 BigQuery 连接器在使用 GCS 和 BigQuery 服务之前需要进行身份验证。连接器支持使用 GCP 服务账号 JSON 密钥文件进行身份验证。该服务账号必须被授予访问 GCS 和/或 BigQuery 所需的 IAM 角色。该教程详细介绍了如何创建服务账号、授予正确的角色、提供密钥以及下载 JSON 密钥文件。要告知连接器使用服务 JSON 密钥文件进行身份验证,必须设置以下 Hadoop 配置属性
google.cloud.auth.service.account.enable=true
google.cloud.auth.service.account.json.keyfile=<path to the service account JSON key file in the container>
将服务账号 JSON 密钥文件放入驱动程序和执行程序容器中最常见的方法是通过 Kubernetes Secret 卷挂载密钥文件。关于如何创建 Secret 的详细信息可以在教程中找到。
下面是一个使用 gcr.io/ynli-k8s/spark:v2.3.0-gcs
自定义镜像的示例 SparkApplication
,该镜像内置了 GCS/BigQuery 连接器和上面提到的自定义 Hadoop 配置文件。请注意,一些必需的 Hadoop 配置属性是使用 spec.hadoopConf
设置的。这些 Hadoop 配置属性是内置 core-site.xml
中设置的属性的补充。将它们设置在此处而不是 core-site.xml
中是因为它们具有应用程序特定的性质。在 core-site.xml
中设置的属性适用于所有使用该镜像的应用程序。另请注意,存储服务账号 JSON 密钥文件的名为 gcs-bg
的 Kubernetes Secret 如何同时挂载到驱动程序和执行程序中。使用 gcr.io/ynli-k8s/spark:v2.3.0-gcs
镜像时,必须设置环境变量 GCS_PROJECT_ID
。
apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
name: foo-gcs-bg
spec:
type: Java
mode: cluster
image: gcr.io/ynli-k8s/spark:v2.3.0-gcs
imagePullPolicy: Always
hadoopConf:
"fs.gs.project.id": "foo"
"fs.gs.system.bucket": "foo-bucket"
"google.cloud.auth.service.account.enable": "true"
"google.cloud.auth.service.account.json.keyfile": "/mnt/secrets/key.json"
driver:
cores: 1
secrets:
- name: "gcs-bq"
path: "/mnt/secrets"
secretType: GCPServiceAccount
envVars:
GCS_PROJECT_ID: foo
serviceAccount: spark
executor:
instances: 2
cores: 1
memory: "512m"
secrets:
- name: "gcs-bq"
path: "/mnt/secrets"
secretType: GCPServiceAccount
envVars:
GCS_PROJECT_ID: foo