

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Apache Spark용 Nvidia RAPIDS 액셀러레이터 사용
<a name="emr-spark-rapids"></a>

Amazon EMR 릴리스 6.2.0 이상에서는 Nvidia의 [Apache Spark용 RAPIDS 액셀러레이터](https://docs.nvidia.com/spark-rapids/user-guide/latest/overview.html) 플러그인을 통해 EC2 그래픽 처리 장치(GPU) 인스턴스 유형을 사용하여 Spark를 가속화할 수 있습니다. RAPIDS Accelerator는 코드 변경 없이 Apache Spark 3.0 데이터 과학 파이프라인에서 GPU를 가속화하고, 데이터 처리 및 모델 교육 속도를 높이는 동시에 인프라 비용을 크게 절감합니다.

다음 섹션에서는 Spark용 Spark RAPIDS 플러그인을 사용하도록 EMR 클러스터를 구성하는 방법을 안내합니다.

## 인스턴스 유형 선택
<a name="emr-spark-rapids-instancetypes"></a>

Spark용 Nvidia Spark RAPIDS 플러그인을 사용하려면 코어 및 태스크 인스턴스 그룹에서 Spark-RAPIDS의 [하드웨어 요구 사항](https://nvidia.github.io/spark-rapids/)을 충족하는 EC2 GPU 인스턴스 유형을 사용해야 합니다. Amazon EMR에서 지원되는 GPU 인스턴스 유형의 전체 목록을 보려면 *Amazon EMR 관리 안내서*에서 [지원되는 인스턴스 유형](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-supported-instance-types.html)을 참조하세요. 기본 인스턴스 그룹의 인스턴스 유형은 GPU 또는 비GPU 유형일 수 있지만 ARM 인스턴스 유형은 지원되지 않습니다.

## 클러스터의 애플리케이션 구성 설정
<a name="emr-spark-rapids-appconfig"></a>

**1: Amazon EMR을 활성화하여 새 클러스터에 플러그인 설치**

플러그인을 설치하려면 클러스터를 생성할 때 다음 구성을 제공합니다.

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

**2. GPU를 사용하도록 YARN 구성**

YARN 기반 GPU를 사용하는 방법에 대한 자세한 내용은 Apache Hadoop 설명서에서 [YARN에서 GPU 사용](https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn/hadoop-yarn-site/UsingGpus.html)을 참조하세요. 다음 예에서는 Amazon EMR 6.x 및 7.x 릴리스를 위한 샘플 YARN 구성을 보여줍니다.

------
#### [ Amazon EMR 7.x ]

**Amazon EMR 7.x용 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":"/spark-rapids-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":"/spark-rapids-cgroup",
                "yarn-hierarchy":"yarn"
            }
        }
    ]
}
```

------
#### [ Amazon EMR 6.x ]

**Amazon EMR 6.x용 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. RAPIDS를 사용하도록 Spark 구성**

Spark에서 RAPIDS 플러그인을 사용하려면 다음 구성이 필요합니다.

```
{
	"Classification":"spark-defaults",
	"Properties":{
		"spark.plugins":"com.nvidia.spark.SQLPlugin",
		"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"
	}
}
```

XGBoost 설명서의 [XGBoost4J-Spark 라이브러리](https://xgboost.readthedocs.io/en/latest/jvm/xgboost4j_spark_tutorial.html)는 클러스터에서 Spark RAPIDS 플러그인이 활성화된 경우에도 사용할 수 있습니다. 다음 구성을 사용하여 XGBoost를 Spark 작업과 통합할 수 있습니다.

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

GPU 가속 EMR 클러스터를 튜닝하는 데 사용할 수 있는 추가 Spark 구성은 Nvidia.github.io 설명서에서 [Rapids Accelerator for Apache Spark 튜닝 안내서](https://docs.nvidia.com/spark-rapids/user-guide/latest/tuning-guide.html)를 참조하세요.

**4. YARN 용량 스케줄러 구성**

GPU 예약 및 격리를 활성화하도록 `DominantResourceCalculator`를 구성해야 합니다. 자세한 내용은 Apache Hadoop 설명서에서 [Using GPU on YARN](https://hadoop.apache.org/docs/r3.2.1/hadoop-yarn/hadoop-yarn-site/UsingGpus.html)을 참조하세요.

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

**5. 구성을 포함하도록 JSON 파일 생성**

Spark 클러스터용 RAPIDS 플러그인을 사용하기 위한 구성이 포함된 JSON 파일을 생성할 수 있습니다. 나중에 클러스터를 시작할 때 파일을 제공합니다.

파일을 로컬 또는 S3에 저장할 수 있습니다. 클러스터에 애플리케이션 구성을 제공하는 방법에 대한 자세한 내용은 [애플리케이션 구성](emr-configure-apps.md) 섹션을 참조하세요.

다음 샘플 파일을 템플릿으로 사용하고 고유한 구성을 만드세요.

------
#### [ Amazon EMR 7.x ]

**Amazon EMR 7.x용 예제 `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":"/spark-rapids-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":"/spark-rapids-cgroup",
                    "yarn-hierarchy":"yarn"
                }
            }
        ]
    },
    {
        "Classification":"spark-defaults",
        "Properties":{
            "spark.plugins":"com.nvidia.spark.SQLPlugin",
            "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.4.2-0.3.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"
        }
    }
]
```

------
#### [ Amazon EMR 6.x ]

**Amazon EMR 6.x용 예제 `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.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.4.2-0.3.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"
        }
    }
]
```

------

## 클러스터에 대한 부트스트랩 작업 추가
<a name="emr-spark-rapids-bootstrap"></a>

클러스터를 생성할 때 부트스트랩 작업 스크립트를 제공하는 방법에 대한 자세한 내용은 *Amazon EMR 관리 안내서*에서 [부트스트랩 작업 기본 사항](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-plan-bootstrap.html#bootstrapUses)을 참조하세요.

다음 예제 스크립트에서는 Amazon EMR 6.x 및 7.x용 부트스트랩 작업 파일을 만드는 방법을 확인할 수 있습니다.

------
#### [ Amazon EMR 7.x ]

**Amazon EMR 7.x용 예제 `my-bootstrap-action.sh` 파일**

YARN을 사용하여 Amazon EMR 7.x 릴리스에서 GPU 리소스를 관리하기 위해서는 클러스터에 CGroup v1을 수동으로 마운트해야 합니다. 이 예제처럼 부트스트랩 작업 스크립트를 이용하여 이 작업을 할 수 있습니다.

```
#!/bin/bash
set -ex
 
sudo mkdir -p /spark-rapids-cgroup/devices
sudo mount -t cgroup -o devices cgroupv1-devices /spark-rapids-cgroup/devices
sudo chmod a+rwx -R /spark-rapids-cgroup
```

------
#### [ Amazon EMR 6.x ]

**Amazon EMR 6.x용 예제 `my-bootstrap-action.sh` 파일**

Amazon EMR 6.x 릴리스의 경우에는 클러스터에서 YARN에 대한 CGroup 권한을 열어야 합니다. 이 예제처럼 부트스트랩 작업 스크립트를 이용하여 이 작업을 할 수 있습니다.

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

------

## 클러스터 시작
<a name="emr-spark-rapids-launchcluster"></a>

마지막 단계는 위에서 언급한 클러스터 구성으로 클러스터를 시작하는 것입니다. 다음은 Amazon EMR CLI에서 클러스터를 시작하는 예제 명령입니다.

```
 aws emr create-cluster \
--release-label emr-7.12.0 \
--applications Name=Hadoop Name=Spark \
--service-role EMR_DefaultRole_V2 \
--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://amzn-s3-demo-bucket/my-bootstrap-action.sh
```