使用 Nvidia Spark-RAPIDS Accelerator for Spark - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用 Nvidia Spark-RAPIDS Accelerator for Spark

对于 Amazon EMR 发行版 6.2.0 及更高版本,您可以使用 Nvidia 的 RAPIDS Accelerator for Apache Spark 插件来通过 EC2 图形处理器(GPU)实例类型加速 Spark。Rapids Accelerator 将通过 GPU 加速您的 Apache Spark 3.0 数据科学管道,无需更改代码,并将加快数据处理和模型训练,同时大幅降低基础设施成本。

以下部分将引导您完成配置 EMR 集群来使用 Spark-RAPIDS Plugin for Spark。

选择实例类型

要将 Nvidia Spark-RAPIDS 插件用于 Spark,核心实例组和任务实例组必须使用符合 Spark-RAPIDS 的硬件要求的 EC2 GPU 实例类型。要查看 EMR 支持的 GPU 实例类型的完整列表,请参阅《Amazon EMR 管理指南》中的支持的实例类型。主实例组的实例类型可以是 GPU 或非 GPU 类型,但不支持 ARM 实例类型。

为集群设置应用程序配置

1. 使 Amazon EMR 能在您的新集群上安装插件

要安装插件,请在创建集群时提供以下配置:

{ "Classification":"spark", "Properties":{ "enableSparkRapids":"true" } }

2. 将 YARN 配置为使用 GPU

有关在 YARN 上使用 GPU 的详细信息,请参阅 Apache Hadoop 文档中的 Using GPU On YARN。下面是示例配置:

{ "Classification":"yarn-site", "Properties":{ "yarn.nodemanager.resource-plugins":"yarn.io/gpu", "yarn.resource-types":"yarn.io/gpu", "yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices":"auto", "yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables":"/usr/bin", "yarn.nodemanager.linux-container-executor.cgroups.mount":"true", "yarn.nodemanager.linux-container-executor.cgroups.mount-path":"/sys/fs/cgroup", "yarn.nodemanager.linux-container-executor.cgroups.hierarchy":"yarn", "yarn.nodemanager.container-executor.class":"org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor" } }, { "Classification":"container-executor", "Properties":{ }, "Configurations":[ { "Classification":"gpu", "Properties":{ "module.enabled":"true" } }, { "Classification":"cgroups", "Properties":{ "root":"/sys/fs/cgroup", "yarn-hierarchy":"yarn" } } ] }

3. 将 Spark 配置为使用 RAPIDS

以下是使 Spark 能够使用 RAPIDS 插件所需的配置:

{ "Classification":"spark-defaults", "Properties":{ "spark.plugins":"com.nvidia.spark.SQLPlugin", "spark.sql.sources.useV1SourceList":"", "spark.executor.resource.gpu.discoveryScript":"/usr/lib/spark/scripts/gpu/getGpusResources.sh", "spark.executor.extraLibraryPath":"/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/compat/lib:/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native" } }

在您的集群上启用 Spark RAPIDS 插件后,XGBoost 文档中提供的 XGBoost4J-Spark 库也可以使用。您可以使用以下配置将 XGBoost 与您的 Spark 任务集成:

{ "Classification":"spark-defaults", "Properties":{ "spark.submit.pyFiles":"/usr/lib/spark/jars/xgboost4j-spark_3.0-1.0.0-0.2.0.jar" } }

有关可用于优化 GPU 加速的 EMR 集群的其他 Spark 配置,请参阅 Nvidia.github.io 文档中的 RAPIDS Accelerator for Apache Spark Tuning Guide

4. 配置 YARN 容量调度器

DominantResourceCalculator必须配置 来启用 GPU 调度和隔离。有关详细信息,请参阅 Apache Hadoop 文档中的 Using GPU On YARN

{ "Classification":"capacity-scheduler", "Properties":{ "yarn.scheduler.capacity.resource-calculator":"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" } }

5. 创建一个 JSON 文件以包含您的所有配置

您可以创建一个 JSON 文件,在其中包含您的配置,以便为 Spark 集群使用 RAPIDS 插件。您稍后在启动集群时需提供该文件。

文件可以存储在本地或 S3 上。有关如何为集群提供应用程序配置的详细信息,请参阅配置应用程序

下面是一个文件示例,名称为 my-configurations.json。您可以将其用作模板,来开始构建自己的配置。

[ { "Classification":"spark", "Properties":{ "enableSparkRapids":"true" } }, { "Classification":"yarn-site", "Properties":{ "yarn.nodemanager.resource-plugins":"yarn.io/gpu", "yarn.resource-types":"yarn.io/gpu", "yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices":"auto", "yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables":"/usr/bin", "yarn.nodemanager.linux-container-executor.cgroups.mount":"true", "yarn.nodemanager.linux-container-executor.cgroups.mount-path":"/sys/fs/cgroup", "yarn.nodemanager.linux-container-executor.cgroups.hierarchy":"yarn", "yarn.nodemanager.container-executor.class":"org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor" } }, { "Classification":"container-executor", "Properties":{ }, "Configurations":[ { "Classification":"gpu", "Properties":{ "module.enabled":"true" } }, { "Classification":"cgroups", "Properties":{ "root":"/sys/fs/cgroup", "yarn-hierarchy":"yarn" } } ] }, { "Classification":"spark-defaults", "Properties":{ "spark.plugins":"com.nvidia.spark.SQLPlugin", "spark.sql.sources.useV1SourceList":"", "spark.executor.resource.gpu.discoveryScript":"/usr/lib/spark/scripts/gpu/getGpusResources.sh", "spark.executor.extraLibraryPath":"/usr/local/cuda/targets/x86_64-linux/lib:/usr/local/cuda/extras/CUPTI/lib64:/usr/local/cuda/compat/lib:/usr/local/cuda/lib:/usr/local/cuda/lib64:/usr/lib/hadoop/lib/native:/usr/lib/hadoop-lzo/lib/native:/docker/usr/lib/hadoop/lib/native:/docker/usr/lib/hadoop-lzo/lib/native", "spark.submit.pyFiles":"/usr/lib/spark/jars/xgboost4j-spark_3.0-1.0.0-0.2.0.jar", "spark.rapids.sql.concurrentGpuTasks":"1", "spark.executor.resource.gpu.amount":"1", "spark.executor.cores":"2", "spark.task.cpus ":"1", "spark.task.resource.gpu.amount":"0.5", "spark.rapids.memory.pinnedPool.size":"0", "spark.executor.memoryOverhead":"2G", "spark.locality.wait":"0s", "spark.sql.shuffle.partitions":"200", "spark.sql.files.maxPartitionBytes":"512m" } }, { "Classification":"capacity-scheduler", "Properties":{ "yarn.scheduler.capacity.resource-calculator":"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator" } } ]

为您的集群添加引导操作

为了在 GPU 上使用 YARN,您需要在集群上打开对 YARN 的 cgroup 权限,这可以使用 EMR 引导操作脚本来完成。

有关如何在创建集群时提供引导操作脚本的更多信息,请参阅《Amazon EMR 管理指南》中的引导操作基础

下面是一个名为 my-bootstap-action.sh 的示例脚本:

#!/bin/bash set -ex sudo chmod a+rwx -R /sys/fs/cgroup/cpu,cpuacct sudo chmod a+rwx -R /sys/fs/cgroup/devices

启动您的集群。

最后一步是使用上述集群配置启动您的集群。以下是一个通过 EMR CLI 启动集群的命令示例:

aws emr create-cluster \ --release-label emr-6.2.0 \ --applications Name=Hadoop Name=Spark \ --service-role EMR_DefaultRole \ --ec2-attributes KeyName=my-key-pair,InstanceProfile=EMR_EC2_DefaultRole \ --instance-groups InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m4.4xlarge \ InstanceGroupType=CORE,InstanceCount=1,InstanceType=g4dn.2xlarge \ InstanceGroupType=TASK,InstanceCount=1,InstanceType=g4dn.2xlarge \ --configurations file:///my-configurations.json \ --bootstrap-actions Name='My Spark Rapids Bootstrap action',Path=s3://my-bucket/my-bootstrap-action.sh