As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Uso do RAPIDS Accelerator do NVIDIA para Apache Spark
Com o Amazon EMR versão 6.2.0 e posterior, você pode usar o plug-in RAPIDS Accelerator for Apache Spark da Nvidia para acelerar o Spark usando EC2 tipos de instância de unidade de processamento gráfico (GPU). O RAPIDS Accelerator acelerará, por meio da GPU, seus pipelines de ciência de dados do Apache Spark 3.0 sem alterações no código, bem como o processamento de dados e o treinamento de modelos, enquanto reduz substancialmente os custos de infraestrutura.
As seções a seguir orientam você na configuração do cluster do EMR para usar o plug-in Spark-RAPIDS para Spark.
Selecionar tipos de instância
Para usar o plug-in Nvidia Spark-rapids para Spark, os grupos de instâncias principais e de tarefas devem usar tipos de instância de EC2 GPU que atendam aos requisitos de hardware do Spark-rapids. Para ver uma lista completa dos tipos de instâncias de GPU compatíveis com o Amazon EMR, consulte Tipos de instâncias compatíveis no Guia de gerenciamento do Amazon EMR. O tipo de instância do grupo primário de instâncias pode ser do tipo GPU ou não GPU, mas os tipos de instâncias ARM não são compatíveis.
Definir as configurações da aplicação para o cluster
1. Permitir que o Amazon EMR instale os plug-ins no novo cluster
Para instalar plug-ins, forneça a seguinte configuração ao criar o cluster:
{
"Classification":"spark",
"Properties":{
"enableSparkRapids":"true"
}
}
2. Configurar o YARN para usar a GPU
Para obter detalhes sobre como usar a GPU no YARN, consulte Using GPU on YARN na documentação do Apache Hadoop. Os seguintes exemplos são de configurações do YARN para as versões 6.x e 7.x do Amazon EMR:
- Amazon EMR 7.x
-
Exemplo de configuração do YARN para o Amazon EMR 7.x
{
"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
-
Exemplo de configuração do YARN para o Amazon EMR 6.x
{
"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. Configurar o Spark para usar o RAPIDS
Veja as configurações necessárias para habilitar o Spark para usar o plugin 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"
}
}
XGBoost4A biblioteca J-Spark na XGBoost documentação também está disponível quando o plug-in Spark RAPIDS está habilitado em seu cluster. Você pode usar a seguinte configuração para se integrar XGBoost ao seu trabalho do Spark:
{
"Classification":"spark-defaults",
"Properties":{
"spark.submit.pyFiles":"/usr/lib/spark/jars/xgboost4j-spark_3.0-1.4.2-0.3.0.jar"
}
}
Para conhecer configurações adicionais do Spark que você pode usar para ajustar um cluster do EMR acelerado por GPU, consulte o Guia de ajuste do acelerador Rapids para Apache Spark na documentação do Nvidia.github.io.
4. Configurar o YARN Capacity Scheduler
DominantResourceCalculator
deve estar configurado para permitir a programação e o isolamento da GPU. Para obter mais informações, consulte Usar GPU no YARN na documentação do Apache Hadoop.
{
"Classification":"capacity-scheduler",
"Properties":{
"yarn.scheduler.capacity.resource-calculator":"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
}
}
5. Criação de um arquivo JSON para incluir as configurações
Você pode criar um arquivo JSON que contenha sua configuração para usar o plug-in RAPIDS no cluster do Spark. Você fornece o arquivo posteriormente ao executar o cluster.
Você pode armazenar o arquivo localmente ou no S3. Para obter mais informações sobre como fornecer configurações de aplicações para os clusters, consulte Configurar aplicações.
Use os exemplos de arquivos a seguir como modelos para criar suas próprias configurações.
- Amazon EMR 7.x
-
Arquivo de exemplo my-configurations.json
para o Amazon EMR 7.x
[
{
"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
-
Arquivo de exemplo my-configurations.json
para o Amazon EMR 6.x
[
{
"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"
}
}
]
Adicionar uma ação de bootstrap para o cluster
Para obter mais informações sobre como fornecer scripts de ação de bootstrap ao criar o cluster, consulte Bootstrap action basics no Guia de gerenciamento do Amazon EMR.
Os seguintes exemplos de scripts mostram como criar um arquivo de ação de bootstrap para o Amazon EMR 6.x e 7.x:
- Amazon EMR 7.x
-
Arquivo de exemplo my-bootstrap-action.sh
para o Amazon EMR 7.x
Para usar o YARN para gerenciar recursos de GPU com as versões 7.x do Amazon EMR, você deve montar manualmente CGroup v1 no seu cluster. Isso pode ser feito com um script de ação de bootstrap, conforme mostrado neste exemplo.
#!/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
-
Arquivo de exemplo my-bootstrap-action.sh
para o Amazon EMR 6.x
Para versões 6.x do Amazon EMR, você deve abrir CGroup permissões para o YARN em seu cluster. Isso pode ser feito com um script de ação de bootstrap, conforme mostrado neste exemplo.
#!/bin/bash
set -ex
sudo chmod a+rwx -R /sys/fs/cgroup/cpu,cpuacct
sudo chmod a+rwx -R /sys/fs/cgroup/devices
Iniciar o cluster
A última etapa é iniciar o cluster com as configurações de cluster mencionadas acima. Veja um exemplo de comando para executar um cluster pela CLI do Amazon EMR:
aws emr create-cluster \
--release-label emr-7.6.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