使用适用于 Spark 的 Nvidia Spark-RAMIDS 加速器 - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用适用于 Spark 的 Nvidia Spark-RAMIDS 加速器

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

以下部分将指导您配置 EMR 集群以使用 Spark 的 Spark-RAMIDS 插件。

选择实例类型

要使用适用于 Spark 的 Nvidia Spark-RAMIDS 插件,核心和任务实例组必须使用满足 Spark-RAMIDS 的硬件要求的 EC2 GPU 实例类型。要查看 EMR 支持的 GPU 实例类型的完整列表,请参阅 https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-supported-instance-types.html 中的Amazon EMR 管理指南支持的实例类型。主实例组的实例类型可以是 GPU 或非 GPU 类型,但不支持 ARM 实例类型。

为集群设置应用程序配置

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

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

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

2. 配置 YARN 以使用 GPU

有关在 YARN 上使用 GPU 的详细信息,请参阅 Apache Hadoop 文档中的在 YARN https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn/hadoop-yarn-site/UsingGpus.html 上使用 GPU。以下是示例配置:

{ "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 以使用 SharePointS

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

{ "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 HTTPS 插件时XGBoost4J 库也可用。 XGBoost 您可以使用以下配置将 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 优化指南

4. 配置 YARN 容量计划程序

DominantResourceCalculator 必须配置为启用 GPU 计划和隔离。有关更多信息,请参阅 Apache Hadoop 文档中的在 YARN 上使用 GPU。

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

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

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

该文件可存储在本地或 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 的 cgroups 权限,这可使用 EMR 引导操作脚本完成。

有关如何在创建集群时提供引导操作脚本的更多信息,请参阅 https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-plan-bootstrap.html#bootstrapUses 中的Amazon EMR 管理指南引导操作基础知识

以下是名为 的示例脚本my-bootstap-action.json

#!/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