Google Cloud Dataproc 部署指南#

Dataproc 是 Google Cloud 的完全托管式 Apache Spark 和 Hadoop 服务。NVIDIA RAPIDS 加速器(用于 Apache Spark)在 Dataproc 上可用,允许用户使用 GPU 加速数据处理和机器学习工作负载。此集成完全受 Google Cloud 支持,并使用户能够以优化的性能和效率运行其 Spark 工作负载。

步骤概述#

本指南提供了有关开始使用 RAPIDS 加速器(用于 Dataproc 集群)的分步说明。我们从基于 Ubuntu 的操作系统开始,运行 Google CLI 以连接 Dataproc 集群和 Google Storage 存储桶并与之交互。然后,我们使用 spark-rapids Java 存档 (jar) 文件来集成必要的依赖项和类,这些依赖项和类启用 Apache Spark 工作负载的 GPU 加速。jar 文件上传到 Google Cloud Storage 存储桶,然后在集群创建时加载。集群创建完成后,我们就可以提交 GPU 加速的 Spark 作业/应用程序。

先决条件#

在开始使用 Dataproc 上的 RAPIDS 加速器(用于 Apache Spark)之前,请确保您具备以下先决条件

注意

其他操作系统也可以使用,但以下步骤需要 Ubuntu。

连接性#

从具有上述先决条件的 Ubuntu 操作系统中,使用 gcloud init 命令来验证和连接到启用了 Dataproc 的 Google Cloud 项目和区域。

gcloud dataproc clusters list

利用具有所需 GPU 实例的区域。完整列表请参见此处: https://cloud.google.com/compute/docs/gpus/gpu-regions-zones

配置 gcloud 以使用您的首选区域。

以下是将区域设置为 us-central1 的示例。

1export REGION=us-central1
2gcloud config set compute/region ${REGION}

注意

您可能需要为指定的区域请求额外的 GPU 资源使用配额。有关更多信息,请参阅 Google Cloud 资源使用配额和权限管理文档

将 Jar 上传到云端(GCP 存储桶)#

为了加快集群创建速度,请将 jar 文件上传到集群所在区域内的 GCP 存储桶。设置终端变量并使用 gsutil 命令创建 GCS 存储桶。

提示

从 NGC 目录将 jar 文件拉取到您的本地计算机。请回顾访问 NVIDIA AI Enterprise RAPIDS 加速器部分

根据需要更改 exampleuser1rapids-4-spark_2.12-23.02.0.jar

1export USER_NAME=exampleuser1
2export JAR_NAME=rapids-4-spark_2.12-23.02.0.jar

将 jar 放在您当前的工作目录中并设置位置变量。

export LOCAL_JAR_LOCATION=./${JAR_NAME}

导出变量,以便将 jar 放置在 GCP 存储桶中。

1export GCS_BUCKET=${USER_NAME}-bucket
2export GCS_JAR_LOCATION=gs://$GCS_BUCKET/jars/${JAR_NAME}

将 jar 复制到 GCP 存储桶。

1gsutil mkdir gs://${GCS_BUCKET}
2gsutil cp ${LOCAL_JAR_LOCATION} ${GCS_JAR_LOCATION}

注意

如果需要,Google Cloud Console 具有传输文件的功能。

创建集群并更新 Dataproc Jar#

在本节中,您将使用 gcloud 命令创建 Dataproc 集群,然后将现有 jar 替换为 RAPIDS 加速器 jar。

使用 export 命令设置适当的集群配置变量。以下是示例变量。替换以下变量以匹配您的环境。

注意

某些区域没有 GPU 实例。

1export REGION=us-central1
2export ZONE=us-central1-a
3export CLUSTER_NAME=${USER_NAME}-gpu
4export MASTER_MACHINE_TYPE=n1-standard-16
5export WORKER_MACHINE_TYPE=n1-highmem-32
6export NUM_WORKERS=4
7export NUM_WORKER_SSDS=2
8export WORKER_ACCEL_TYPE=nvidia-tesla-t4
9export NUM_GPUS_PER_WORKER=2

既然已设置上述变量,请使用以下命令创建具有上述配置的集群。

 1gcloud dataproc clusters create ${CLUSTER_NAME} \
 2        --image-version=2.1.2-ubuntu20 \
 3        --region ${REGION}\
 4        --zone ${ZONE} \
 5        --master-machine-type ${MASTER_MACHINE_TYPE} \
 6        --num-workers ${NUM_WORKERS} \
 7        --worker-accelerator type=${WORKER_ACCEL_TYPE},count=${NUM_GPUS_PER_WORKER} \
 8        --worker-machine-type ${WORKER_MACHINE_TYPE} \
 9        --num-worker-local-ssds ${NUM_WORKER_SSDS} \
10        --worker-local-ssd-interface=NVME \
11        --initialization-actions gs://goog-dataproc-initialization-actions-${REGION}/spark-rapids/spark-rapids.sh \
12        --optional-components=JUPYTER,ZEPPELIN \
13        --properties 'spark:spark.eventLog.enabled=true,spark:spark.eventLog.compress=true' \
14        --bucket ${GCS_BUCKET} \
15        --enable-component-gateway \
16        --subnet=default \
17        --no-shielded-secure-boot

注意

GPU 集群创建时间可能需要 15 分钟以上。

从 Dataproc 中删除任何现有的 RAPIDS 加速器和 cudf jar。替换为 RAPIDS 加速器 jar。

1WORKER_LIST=$(echo $(for n in $(seq 0 $((NUM_WORKERS - 1))); do echo -n w-${n} ' '; done))
2for node in m $WORKER_LIST; do gcloud compute ssh ${CLUSTER_NAME}-${node} --command="sudo rm /usr/lib/spark/jars/cudf-*.jar" ;gcloud compute ssh ${CLUSTER_NAME}-${node} --command="sudo rm /usr/lib/spark/jars/rapids-4-spark_*.jar" ; gcloud compute ssh ${CLUSTER_NAME}-${node} --command="sudo gsutil cp ${GCS_JAR_LOCATION} /usr/lib/spark/jars/" ; done

验证#

现在,您可以像提交任何其他集群一样向该集群提交作业了。有关提交示例作业,请参见此处

此作业将显示 jar 已成功加载。

1gcloud dataproc jobs submit spark \
2    --cluster=${CLUSTER_NAME} \
3    --region=${REGION} \
4    --class=org.apache.spark.examples.SparkPi \
5    --properties=spark.rapids.sql.explain=ALL \
6    --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \
7    -- 1000

有关所有配置选项、与 Apache Spark 的兼容性主题以及 NVIDIA 运算符支持的完整列表,请参见配置附录支持的运算符附录

集群清理#

可以通过以下方式删除集群

gcloud dataproc clusters delete -q $CLUSTER_NAME

提示

如果不再需要,请删除您的 GCP 存储桶。

gsutil -m rm -rf gs://<Your-Bucket-Name>