El entorno de ejecución de Amazon EMR 7.5 para Apache Spark e Iceberg puede ejecutar cargas de trabajo de Spark 3.6 veces más rápido que Spark 3.5.3 e Iceberg 1.6.1

Como
Gustó

Fecha:

El Tiempo de ejecución de Amazon EMR para Apache Spark ofrece un entorno de ejecución de alto rendimiento al tiempo que mantiene una compatibilidad de API del 100 % con el formato de tabla de código abierto Apache Spark y Apache Iceberg. Amazon EMR en EC2, Amazon EMR sin servidor, Amazon EMR en Amazon EKS, Amazon EMR en puestos avanzados de AWS y Pegamento AWS todos utilizan los tiempos de ejecución optimizados.

En esta publicación, demostramos los beneficios de rendimiento que se obtienen al utilizar el EMR de Amazon Tiempo de ejecución de 7.5 para Spark e Iceberg en comparación con Spark 3.5.3 de código abierto con tablas de Iceberg 1.6.1 en el benchmark TPC-DS 3TB v2.13.

Iceberg es un formato de alto rendimiento de código abierto popular para tablas analíticas de gran tamaño. Nuestros puntos de referencia demuestran que Amazon EMR puede ejecutar cargas de trabajo de 3 TB de TPC-DS 3.6 veces más rápido, lo que reduce el tiempo de ejecución de 1.54 horas a 0.42 horas. Además, la rentabilidad mejora 2.9 veces, y el coste total disminuye de 16.00 USD a 5.39 USD cuando se utiliza Nube informática elástica de Amazon (Amazon EC2) Instancias On-Demand r5d.4xlarge, que proporcionan ganancias observables para tareas de procesamiento de datos.

Este es un aumento adicional del 32 % con respecto a las optimizaciones incluidas en Amazon EMR 7.1 que se trataron en una publicación anterior. El tiempo de ejecución de Amazon EMR 7.1 para Apache Spark e Iceberg puede ejecutar cargas de trabajo de Spark 2.7 veces más rápido que Apache Spark 3.5.1 y Iceberg 1.5.2.Desde entonces, hemos seguido agregando más soporte para DataSource V2 para ocho optimizaciones de consultas existentes más en el entorno de ejecución de EMR para Spark.

Además de estas mejoras específicas de DataSource V2, hemos realizado más optimizaciones en los operadores de Spark desde Amazon EMR 7.1 que también contribuyen a la aceleración adicional.

Resultados de referencia de Amazon EMR 7.5 en comparación con Spark 4 y Iceberg 3.5.3 de código abierto

Para evaluar el rendimiento del motor Spark con el formato de tabla Iceberg, realizamos pruebas comparativas utilizando el Conjunto de datos TPC-DS de 3 TB, versión 2.13 (nuestros resultados derivados del conjunto de datos TPC-DS no son directamente comparables con los resultados oficiales de TPC-DS debido a diferencias de configuración). Las pruebas comparativas para el entorno de ejecución de EMR para Spark e Iceberg se realizaron en clústeres EC7.5 de Amazon EMR 2 frente a Spark 3.5.3 de código abierto e Iceberg 1.6.1 en clústeres EC2.

Las instrucciones de configuración y los detalles técnicos están disponibles en nuestro Repositorio GitHub. Minimizar la influencia de catálogos externos como Pegamento AWS y Hive, utilizamos el catálogo de Hadoop para las tablas Iceberg. Esto utiliza el sistema de archivos subyacente, específicamente Amazon S3, como catálogo. Podemos definir esta configuración configurando la propiedad spark.sql.catalog.<catalog_name>.type. Las tablas de hechos utilizaron la partición predeterminada por la columna de fecha, que tiene un número de particiones que varía entre 200 y 2,100. No se utilizaron estadísticas precalculadas para estas tablas.

Ejecutamos un total de 104 consultas SparkSQL en tres rondas secuenciales y se tomó el tiempo de ejecución promedio de cada consulta en estas rondas para comparar. El tiempo de ejecución promedio de las tres rondas en Amazon EMR 7.5 con Iceberg habilitado fue de 0.42 horas, lo que demuestra un aumento de velocidad 3.6 veces en comparación con el código abierto Spark 3.5.3 e Iceberg 1.6.1. La siguiente figura presenta los tiempos de ejecución totales en segundos.

Tiempo de ejecución de EMR frente a OSS

La siguiente tabla resume las métricas.

Métricos Amazon EMR 7.5 en EC2 Amazon EMR 7.1 en EC2 Código abierto Spark 3.5.3 e Iceberg 1.6.1
Tiempo de ejecución promedio en segundos 1535.62 2033.17 5546.16
Media geométrica sobre consultas en segundos 8.30046 10.13153 20.40555
Costo* $5.39 $7.18 $16.00

*Las estimaciones de costos detalladas se analizan más adelante en esta publicación.

El siguiente gráfico muestra la mejora del rendimiento por consulta de Amazon EMR 7.5 en relación con Spark 3.5.3 de código abierto e Iceberg 1.6.1. El grado de aceleración varía de una consulta a otra, siendo la más rápida hasta 9.4 veces más rápida para q93, y Amazon EMR supera a Spark de código abierto con tablas Iceberg. El eje horizontal organiza las consultas de referencia de TPC-DS 3TB en orden descendente según la mejora del rendimiento observada con Amazon EMR, y el eje vertical representa la magnitud de esta aceleración como una proporción.

Costo por consulta de EMR vs OSS

Comparación de costos

Nuestro punto de referencia proporciona el tiempo de ejecución total y los datos de la media geométrica para evaluar el rendimiento de Spark e Iceberg en un escenario complejo de soporte de decisiones del mundo real. Para obtener información adicional, también examinamos el aspecto de los costes. Calculamos estimaciones de costos utilizando fórmulas que tienen en cuenta las instancias EC2 On-Demand, Tienda de bloques elásticos de Amazon (Amazon EBS) y gastos de Amazon EMR.

  • Costo de Amazon EC2 (incluye costo de SSD) = número de instancias * tarifa por hora de r5d.4xlarge * tiempo de ejecución del trabajo en horas
    • r5d.4xlarge tarifa por hora = $1.152 por hora en us-east-1
  • Costo raíz de Amazon EBS = número de instancias * tarifa de Amazon EBS por GB por hora * tamaño del volumen raíz de EBS * tiempo de ejecución del trabajo en horas
  • Costo de Amazon EMR = número de instancias * costo de r5d.4xlarge Amazon EMR * tiempo de ejecución del trabajo en horas
    • Costo de Amazon EMR 4xlarge = $0.27 por hora
  • Costo total = costo de Amazon EC2 + costo raíz de Amazon EBS + costo de Amazon EMR

Los cálculos revelan que el punto de referencia de Amazon EMR 7.5 produce una mejora de rentabilidad 2.9 veces mayor que el código abierto Spark 3.5.3 y Iceberg 1.6.1 al ejecutar el trabajo de punto de referencia.

Métricos AmazonEMR 7.5 AmazonEMR 7.1 Código abierto Spark 3.5.1 e Iceberg 1.5.2
Tiempo de ejecución en horas 0.426 0.564 1.540

Número de instancias EC2

(Incluye nodo primario)

9 9 9
Tamaño de Amazon EBS 20gb 20gb 20gb

Amazon EC2

(Costo total de ejecución)

$4.35 $5.81 $15.97
Costo de Amazon EBS $0.01 $0.01 $0.04
Costo de Amazon EMR $1.02 $1.36 $0
El costo total $5.38 $7.18 $16.01
En ahorro de costes Amazon EMR 7.5 es 2.9 veces mejor Amazon EMR 7.1 es 2.2 veces mejor Base

Además de las métricas basadas en el tiempo que se analizaron hasta ahora, los datos de los registros de eventos de Spark muestran que Amazon EMR analizó aproximadamente 3.4 veces menos datos de Amazon S3 y 4.1 veces menos registros que la versión de código abierto en el punto de referencia TPC-DS de 3 TB. Esta reducción en el análisis de datos de Amazon S3 contribuye directamente a ahorrar costos en las cargas de trabajo de Amazon EMR.

Ejecute pruebas comparativas de Spark de código abierto en tablas Iceberg

Usamos clústeres EC2 separados, cada uno equipado con nueve instancias r5d.4xlarge, para probar Spark 3.5.3 de código abierto y Amazon EMR 7.5 para la carga de trabajo Iceberg. El nodo principal estaba equipado con 16 vCPU y 128 GB de memoria, y los ocho nodos de trabajo juntos tenían 128 vCPU y 1024 GB de memoria. Realizamos pruebas utilizando la configuración predeterminada de Amazon EMR para mostrar la experiencia de usuario típica y ajustamos mínimamente la configuración de Spark e Iceberg para mantener una comparación equilibrada.

La siguiente tabla resume las configuraciones de Amazon EC2 para el nodo principal y ocho nodos trabajadores de tipo r5d.4xlarge.

Instancia EC2 CPU virtual Memoria (GiB) Almacenamiento de instancias (GB) Volumen raíz de EBS (GB)
r5d.4xgrande 16 128 2 SSD de 300 NVMe 20 GB

Requisitos previos

Se requieren los siguientes requisitos previos para ejecutar la evaluación comparativa:

  1. Usando las instrucciones en el repositorio de GitHub emr-spark-benchmark, configure los datos de origen de TPC-DS en su depósito S3 y en su computadora local.
  2. Cree la aplicación de referencia siguiendo los pasos proporcionados en Pasos para crear una aplicación de ensamblaje de referencia de chispa y copie la aplicación de referencia a su depósito S3. Alternativamente, copie chispa-benchmark-ensamblaje-3.5.3.jar a su cubo S3.
  3. Cree tablas Iceberg a partir de los datos fuente de TPC-DS. Siga las instrucciones en GitHub para crear tablas Iceberg utilizando el catálogo de Hadoop. Por ejemplo, el siguiente código utiliza un clúster EMR 7.5 con Iceberg habilitado para crear las tablas:
aws emr add-steps 
--cluster-id <cluster-id> --steps Type=Spark,Name="Create Iceberg Tables",
Args=[--class,com.amazonaws.eks.tpcds.CreateIcebergTables,--conf,spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,
--conf,spark.sql.catalog.hadoop_catalog=org.apache.iceberg.spark.SparkCatalog,
--conf,spark.sql.catalog.hadoop_catalog.type=hadoop,
--conf,spark.sql.catalog.hadoop_catalog.warehouse=s3://<bucket>/<warehouse_path>/,
--conf,spark.sql.catalog.hadoop_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO,
s3://<bucket>/<jar_location>/spark-benchmark-assembly-3.5.3.jar,s3://blogpost-sparkoneks-us-east-1/blog/BLOG_TPCDS-TEST-3T-partitioned/,
/home/hadoop/tpcds-kit/tools,parquet,3000,true,<database_name>,true,true],ActionOnFailure=CONTINUE --region <AWS region>

Tenga en cuenta la ubicación del almacén del catálogo de Hadoop y el nombre de la base de datos del paso anterior. Usamos las mismas tablas iceberg para ejecutar evaluaciones comparativas con Amazon EMR 7.5 y Spark de código abierto.

Esta aplicación de referencia está construida a partir de la rama. tpcds-v2.13_iceberg. Si está creando una nueva aplicación de referencia, cambie a la rama correcta después de descargar el código fuente del repositorio de GitHub.

Cree y configure un clúster YARN en Amazon EC2

Para comparar el rendimiento de Iceberg entre Amazon EMR en Amazon EC2 y Spark de código abierto en Amazon EC2, siga las instrucciones del repositorio de GitHub emr-spark-benchmark para crear un clúster Spark de código abierto en Amazon EC2 utilizando Flintrock con ocho nodos trabajadores.

Según la selección del clúster para esta prueba, se utilizan las siguientes configuraciones:

Asegúrese de reemplazar el marcador de posición <private ip of primary node>, En la yarn-site.xml archivo, con la dirección IP del nodo principal de su clúster Flintrock.

Ejecute el benchmark TPC-DS con Spark 3.5.3 y Iceberg 1.6.1

Complete los siguientes pasos para ejecutar el punto de referencia TPC-DS:

  1. Inicie sesión en el nodo principal del clúster de código abierto utilizando flintrock login $CLUSTER_NAME.
  2. Envíe su trabajo Spark:
    1. Elija la ubicación correcta del almacén del catálogo de Iceberg y la base de datos que tenga las tablas de Iceberg creadas.
    2. Los resultados se crean en s3://<YOUR_S3_BUCKET>/benchmark_run.
    3. Puedes seguir el progreso en /media/ephemeral0/spark_run.log.
spark-submit 
--master yarn 
--deploy-mode client 
--class com.amazonaws.eks.tpcds.BenchmarkSQL 
--conf spark.driver.cores=4 
--conf spark.driver.memory=10g 
--conf spark.executor.cores=16 
--conf spark.executor.memory=100g 
--conf spark.executor.instances=8 
--conf spark.network.timeout=2000 
--conf spark.executor.heartbeatInterval=300s 
--conf spark.dynamicAllocation.enabled=false 
--conf spark.shuffle.service.enabled=false 
--conf spark.hadoop.fs.s3a.aws.credentials.provider=com.amazonaws.auth.InstanceProfileCredentialsProvider 
--conf spark.hadoop.fs.s3.impl=org.apache.hadoop.fs.s3a.S3AFileSystem 
--conf spark.jars.packages=org.apache.hadoop:hadoop-aws:3.3.4,org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.6.1,org.apache.iceberg:iceberg-aws-bundle:1.6.1 
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions   
--conf spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog    
--conf spark.sql.catalog.local.type=hadoop  
--conf spark.sql.catalog.local.warehouse=s3a://<YOUR_S3_BUCKET>/<warehouse_path>/ 
--conf spark.sql.defaultCatalog=local   
--conf spark.sql.catalog.local.io-impl=org.apache.iceberg.aws.s3.S3FileIO   
spark-benchmark-assembly-3.5.3.jar   
s3://<YOUR_S3_BUCKET>/benchmark_run 3000 1 false  
q1-v2.13,q10-v2.13,q11-v2.13,q12-v2.13,q13-v2.13,q14a-v2.13,q14b-v2.13,q15-v2.13,q16-v2.13,
q17-v2.13,q18-v2.13,q19-v2.13,q2-v2.13,q20-v2.13,q21-v2.13,q22-v2.13,q23a-v2.13,q23b-v2.13,
q24a-v2.13,q24b-v2.13,q25-v2.13,q26-v2.13,q27-v2.13,q28-v2.13,q29-v2.13,q3-v2.13,q30-v2.13,
q31-v2.13,q32-v2.13,q33-v2.13,q34-v2.13,q35-v2.13,q36-v2.13,q37-v2.13,q38-v2.13,q39a-v2.13,
q39b-v2.13,q4-v2.13,q40-v2.13,q41-v2.13,q42-v2.13,q43-v2.13,q44-v2.13,q45-v2.13,q46-v2.13,
q47-v2.13,q48-v2.13,q49-v2.13,q5-v2.13,q50-v2.13,q51-v2.13,q52-v2.13,q53-v2.13,q54-v2.13,
q55-v2.13,q56-v2.13,q57-v2.13,q58-v2.13,q59-v2.13,q6-v2.13,q60-v2.13,q61-v2.13,q62-v2.13,
q63-v2.13,q64-v2.13,q65-v2.13,q66-v2.13,q67-v2.13,q68-v2.13,q69-v2.13,q7-v2.13,q70-v2.13,
q71-v2.13,q72-v2.13,q73-v2.13,q74-v2.13,q75-v2.13,q76-v2.13,q77-v2.13,q78-v2.13,q79-v2.13,
q8-v2.13,q80-v2.13,q81-v2.13,q82-v2.13,q83-v2.13,q84-v2.13,q85-v2.13,q86-v2.13,q87-v2.13,
q88-v2.13,q89-v2.13,q9-v2.13,q90-v2.13,q91-v2.13,q92-v2.13,q93-v2.13,q94-v2.13,q95-v2.13,
q96-v2.13,q97-v2.13,q98-v2.13,q99-v2.13,ss_max-v2.13    
true <database> > /media/ephemeral0/spark_run.log 2>&1 &!

Resumir los resultados

Una vez finalizado el trabajo de Spark, recupere el archivo de resultados de la prueba del depósito S3 de salida en s3://<YOUR_S3_BUCKET>/benchmark_run/timestamp=xxxx/summary.csv/xxx.csv. Esto se puede hacer a través de la consola de Amazon S3 navegando a la ubicación del depósito especificada o utilizando el Interfaz de línea de comandos de AWS (AWS CLI). La aplicación de referencia Spark organiza los datos creando una carpeta de marca de tiempo y colocando un archivo de resumen dentro de una carpeta etiquetada summary.csv. Los archivos CSV de salida contienen cuatro columnas sin encabezados:

  • Nombre de la consulta
  • tiempo medio
  • Tiempo minimo
  • Tiempo máximo

Con los datos de tres ejecuciones de prueba separadas con una iteración cada vez, podemos calcular el promedio y la media geométrica de los tiempos de ejecución de referencia.

Ejecute el punto de referencia TPC-DS con el tiempo de ejecución de EMR para Spark

La mayoría de las instrucciones son similares a Pasos para ejecutar Spark Benchmarking con algunos detalles específicos de Iceberg.

Requisitos previos

Complete los siguientes pasos de requisitos previos:

  1. Ejecutar aws configure para configurar el shell de AWS CLI para que apunte a la cuenta de AWS de evaluación comparativa. Referirse a Configurar la CLI de AWS para obtener instrucciones.
  2. Cargue el archivo JAR de la aplicación de referencia en Amazon S3.

Implemente el clúster de EMR y ejecute el trabajo de referencia

Complete los siguientes pasos para ejecutar el trabajo de referencia:

  1. Utilice el comando AWS CLI como se muestra en Implemente EMR en EC2 Cluster y ejecute un trabajo de referencia para poner en marcha un EMR en el clúster EC2. Asegúrate de habilitar Iceberg. Ver Crear un grupo de Iceberg para más detalles. Elija la versión correcta de Amazon EMR, el tamaño del volumen raíz y la misma configuración de recursos que la configuración de código abierto de Flintrock. Referirse a crear-cluster para obtener una descripción detallada de las opciones de AWS CLI.
  2. Almacene el ID del clúster de la respuesta. Necesitamos esto para el siguiente paso.
  3. Envíe el trabajo de referencia en Amazon EMR utilizando add-steps desde la CLI de AWS:
    1. Reemplazar con el ID del clúster del paso 2.
    2. La aplicación de referencia está en s3://<your-bucket>/spark-benchmark-assembly-3.5.3.jar.
    3. Elija la ubicación correcta del almacén del catálogo de Iceberg y la base de datos que tenga las tablas de Iceberg creadas. Este debería ser el mismo que el utilizado para la ejecución comparativa de código abierto TPC-DS.
    4. Los resultados estarán en s3://<your-bucket>/benchmark_run.
aws emr add-steps   --cluster-id <cluster-id>
--steps Type=Spark,Name="SPARK Iceberg EMR TPCDS Benchmark Job",
Args=[--class,com.amazonaws.eks.tpcds.BenchmarkSQL,
--conf,spark.driver.cores=4,
--conf,spark.driver.memory=10g,
--conf,spark.executor.cores=16,
--conf,spark.executor.memory=100g,
--conf,spark.executor.instances=8,
--conf,spark.network.timeout=2000,
--conf,spark.executor.heartbeatInterval=300s,
--conf,spark.dynamicAllocation.enabled=false,
--conf,spark.shuffle.service.enabled=false,
--conf,spark.sql.iceberg.data-prefetch.enabled=true,
--conf,spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,
--conf,spark.sql.catalog.local=org.apache.iceberg.spark.SparkCatalog,
--conf,spark.sql.catalog.local.type=hadoop,
--conf,spark.sql.catalog.local.warehouse=s3://<your-bucket>/<warehouse-path>,
--conf,spark.sql.defaultCatalog=local,
--conf,spark.sql.catalog.local.io-impl=org.apache.iceberg.aws.s3.S3FileIO,
s3://<your-bucket>/spark-benchmark-assembly-3.5.3.jar,
s3://<your-bucket>/benchmark_run,3000,1,false,
'q1-v2.13,q10-v2.13,q11-v2.13,q12-v2.13,q13-v2.13,q14a-v2.13,q14b-v2.13,q15-v2.13,q16-v2.13,q17-v2.13,q18-v2.13,q19-v2.13,q2-v2.13,q20-v2.13,q21-v2.13,q22-v2.13,q23a-v2.13,q23b-v2.13,q24a-v2.13,q24b-v2.13,q25-v2.13,q26-v2.13,q27-v2.13,q28-v2.13,q29-v2.13,q3-v2.13,q30-v2.13,q31-v2.13,q32-v2.13,q33-v2.13,q34-v2.13,q35-v2.13,q36-v2.13,q37-v2.13,q38-v2.13,q39a-v2.13,q39b-v2.13,q4-v2.13,q40-v2.13,q41-v2.13,q42-v2.13,q43-v2.13,q44-v2.13,q45-v2.13,q46-v2.13,q47-v2.13,q48-v2.13,q49-v2.13,q5-v2.13,q50-v2.13,q51-v2.13,q52-v2.13,q53-v2.13,q54-v2.13,q55-v2.13,q56-v2.13,q57-v2.13,q58-v2.13,q59-v2.13,q6-v2.13,q60-v2.13,q61-v2.13,q62-v2.13,q63-v2.13,q64-v2.13,q65-v2.13,q66-v2.13,q67-v2.13,q68-v2.13,q69-v2.13,q7-v2.13,q70-v2.13,q71-v2.13,q72-v2.13,q73-v2.13,q74-v2.13,q75-v2.13,q76-v2.13,q77-v2.13,q78-v2.13,q79-v2.13,q8-v2.13,q80-v2.13,q81-v2.13,q82-v2.13,q83-v2.13,q84-v2.13,q85-v2.13,q86-v2.13,q87-v2.13,q88-v2.13,q89-v2.13,q9-v2.13,q90-v2.13,q91-v2.13,q92-v2.13,q93-v2.13,q94-v2.13,q95-v2.13,q96-v2.13,q97-v2.13,q98-v2.13,q99-v2.13,ss_max-v2.13',
true,<database>],ActionOnFailure=CONTINUE --region <aws-region>

Resumir los resultados

Una vez completado el paso, puede ver el resultado de referencia resumido en s3://<YOUR_S3_BUCKET>/benchmark_run/timestamp=xxxx/summary.csv/xxx.csv de la misma manera que la ejecución anterior y calcule el promedio y la media geométrica de los tiempos de ejecución de la consulta.

Limpiar

Para evitar cargos futuros, elimine los recursos que creó siguiendo las instrucciones proporcionadas en el Sección de limpieza del repositorio de GitHub.

Resum

Amazon EMR mejora constantemente el tiempo de ejecución de EMR para Spark cuando se utiliza con tablas Iceberg, logrando un rendimiento 3.6 veces más rápido que Spark 3.5.3 e Iceberg 1.6.1 de código abierto con EMR 7.5 en TPC-DS 3 TB, v2.13. Esto representa un aumento adicional del 32 % con respecto a EMR 7.1. Le recomendamos que se mantenga actualizado con las últimas versiones de Amazon EMR para aprovechar al máximo las mejoras de rendimiento en curso.

Para mantenerse informado, suscríbase al blog de Big Data de AWS Fuente RSS, donde puede encontrar actualizaciones sobre el tiempo de ejecución de EMR para Spark e Iceberg, así como sugerencias sobre mejores prácticas de configuración y recomendaciones de ajuste.


Acerca de los autores

Atul Félix Payapilly es ingeniero de desarrollo de software para Amazon EMR en Amazon Web Services.

Udit Mehrotra es Gerente de ingeniería para EMR en Amazon Web Services.

Artículos relacionados

punto_img

Artículos Recientes

punto_img