Athrun Data Intelligence


El Tiempo de ejecución de Amazon EMR para Apache Spark ofrece un entorno de ejecución de parada rendimiento y al mismo tiempo mantiene una compatibilidad API del 100 % con el formato de tabla de código descubierto 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 de usar el EMR de Amazon 7.5 para Spark e Iceberg en comparación con Spark 3.5.3 de código descubierto con tablas Iceberg 1.6.1 en el punto de narración TPC-DS 3TB v2.13.

Iceberg es un formato popular de código descubierto de parada rendimiento para tablas analíticas grandes. Nuestros puntos de narración demuestran que Amazon EMR puede ejecutar cargas de trabajo TPC-DS de 3 TB 3,6 veces más rápido, lo que reduce el tiempo de ejecución de 1,54 horas a 0,42 horas. Adicionalmente, la eficiencia de costos perfeccionamiento 2,9 veces, y el costo total disminuye de $16,00 a $5,39 al usar Aglomeración 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 cubiertas en una publicación preparatorio. 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 más existentes en el tiempo de ejecución de EMR para Spark.

Adicionalmente de estas mejoras específicas de DataSource V2, hemos realizado más optimizaciones para los operadores de Spark desde Amazon EMR 7.1 que incluso contribuyen a la rapidez adicional.

Resultados comparativos de Amazon EMR 7.5 en comparación con 4 Spark 3.5.3 y Iceberg 1.6.1 de código descubierto

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, interpretación 2.13 (Nuestros resultados derivados del conjunto de datos de TPC-DS no son directamente comparables con los resultados oficiales de TPC-DS adecuado a diferencias de configuración). Las pruebas comparativas para el tiempo de ejecución de EMR para Spark e Iceberg se realizaron en clústeres EC2 de Amazon EMR 7.5 frente a Spark 3.5.3 e Iceberg 1.6.1 de código descubierto en clústeres EC2.

Las instrucciones de configuración y los detalles técnicos están disponibles en nuestro repositorio de 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 concretar esta configuración configurando la propiedad spark.sql.catalog..type. Las tablas de hechos utilizaron la partición predeterminada por la columna de época, que tiene un número de particiones que varía entre 200 y 2100. 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 facultado fue de 0,42 horas, lo que demuestra un aumento de velocidad 3,6 veces en comparación con el código descubierto Spark 3.5.3 e Iceberg 1.6.1. La ulterior figura presenta los tiempos de ejecución totales en segundos.

Tiempo de ejecución de EMR frente a OSS

La ulterior tabla resume las métricas.

Métrico Amazon EMR 7.5 en EC2 Amazon EMR 7.1 en EC2 Código descubierto Spark 3.5.3 y 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 delante en esta publicación.

El ulterior esquema demuestra la perfeccionamiento del rendimiento por consulta de Amazon EMR 7.5 en relación con el código descubierto Spark 3.5.3 y Iceberg 1.6.1. El envergadura de la rapidez 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 superó a Spark de código descubierto con tablas Iceberg. El eje horizontal organiza las consultas de narración de TPC-DS de 3 TB en orden descendente según la perfeccionamiento de rendimiento observada con Amazon EMR, y el eje derecho representa la magnitud de esta rapidez como una proporción.

EMR vs OSS por costo de consulta

Comparación de costos

Nuestro punto de narración 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 tablas difícil de soporte de decisiones del mundo auténtico. Para obtener información adicional, incluso examinamos el aspecto de los costos. 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
    • Tarifa por hora r5d.4xlarge = $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 cuerpo 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 narración de Amazon EMR 7.5 produce una perfeccionamiento de rentabilidad 2,9 veces longevo que el código descubierto Spark 3.5.3 y Iceberg 1.6.1 al ejecutar el trabajo de punto de narración.

Métrico AmazonEMR 7.5 AmazonEMR 7.1 Código descubierto 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 20 gb 20 gb 20 gb

AmazonEC2

(Costo total del tiempo 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
Costo total $5.38 $7.18 $16.01
Parquedad de costos Amazon EMR 7.5 es 2,9 veces mejor Amazon EMR 7.1 es 2,2 veces mejor Cojín

Adicionalmente de las métricas basadas en el tiempo analizadas hasta ahora, los datos de los registros de eventos de Spark muestran que Amazon EMR escaneó aproximadamente 3,4 veces menos datos de Amazon S3 y 4,1 veces menos registros que la interpretación de código descubierto en el punto de narración TPC-DS de 3 TB. Esta reducción en el escaneo de datos de Amazon S3 contribuye directamente al parquedad de costos para las cargas de trabajo de Amazon EMR.

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

Usamos clústeres EC2 separados, cada uno equipado con nueve instancias r5d.4xlarge, para probar tanto Spark 3.5.3 de código descubierto como 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 trabajadores 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 agraciado típica y ajustamos mínimamente la configuración de Spark e Iceberg para perseverar una comparación equilibrada.

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

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

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-benchmarkconfigure los datos de origen de TPC-DS en su depósito S3 y en su computadora locorregional.
  2. Cree la aplicación de narración siguiendo los pasos proporcionados en Pasos para crear una aplicación de ensamblaje Spark-benchmark y copie la aplicación de narración a su depósito S3. Alternativamente, copie Spark-benchmark-ensamblaje-3.5.3.jar a su depósito 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 ulterior código utiliza un clúster EMR 7.5 con Iceberg facultado para crear las tablas:
aws emr add-steps 
--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:////,
--conf,spark.sql.catalog.hadoop_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO,
s3:////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,,true,true),ActionOnFailure=CONTINUE --region 

Tenga en cuenta la ubicación del almacén del catálogo de Hadoop y el nombre de la pulvínulo de datos del paso preparatorio. Usamos las mismas tablas iceberg para ejecutar pruebas comparativas con Amazon EMR 7.5 y Spark de código descubierto.

Esta aplicación de narración está construida a partir de la rama. tpcds-v2.13_iceberg. Si está creando una nueva aplicación de narración, cambie a la rama correcta a posteriori 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 descubierto en Amazon EC2, siga las instrucciones del repositorio de GitHub emr-spark-benchmark para crear un clúster Spark de código descubierto 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úrate de reemplazar el señalador de posición en el yarn-site.xml archivo, con la dirección IP del nodo principal de su clúster Flintrock.

Ejecute el punto de narración TPC-DS con Spark 3.5.3 y Iceberg 1.6.1

Complete los siguientes pasos para ejecutar el punto de narración TPC-DS:

  1. Inicie sesión en el nodo principal del clúster de código descubierto usando 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 pulvínulo de datos que tenga las tablas de Iceberg creadas.
    2. Los resultados se crean en s3:///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.locorregional=org.apache.iceberg.spark.SparkCatalog    
--conf spark.sql.catalog.locorregional.type=hadoop  
--conf spark.sql.catalog.locorregional.warehouse=s3a://// 
--conf spark.sql.defaultCatalog=locorregional   
--conf spark.sql.catalog.locorregional.io-impl=org.apache.iceberg.aws.s3.S3FileIO   
spark-benchmark-assembly-3.5.3.jar   
s3:///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  > /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:///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 crencha de comandos de AWS (AWS CLI). La aplicación de narración Spark organiza los datos creando una carpeta de marca de tiempo y colocando un archivo de recopilación internamente 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 mayor

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 narración.

Ejecute el punto de narración 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 previos:

  1. Pasar 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 narración en Amazon S3.

Implemente el clúster EMR y ejecute el trabajo de narración

Complete los siguientes pasos para ejecutar el trabajo de narración:

  1. Utilice el comando AWS CLI como se muestra en Implemente EMR en EC2 Cluster y ejecute un trabajo de narración para poner en marcha un EMR en el clúster EC2. Asegúrate de habilitar Iceberg. Ver Crear un clase de Iceberg para más detalles. Elija la interpretación correcta de Amazon EMR, el tamaño del cuerpo raíz y la misma configuración de medios que la configuración de código descubierto 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 ulterior paso.
  3. Envíe el trabajo de narración 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 narración está en s3:///spark-benchmark-assembly-3.5.3.jar.
    3. Elija la ubicación correcta del almacén del catálogo de Iceberg y la pulvínulo 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 descubierto TPC-DS.
    4. Los resultados estarán en s3:///benchmark_run.
aws emr add-steps   --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.locorregional=org.apache.iceberg.spark.SparkCatalog,
--conf,spark.sql.catalog.locorregional.type=hadoop,
--conf,spark.sql.catalog.locorregional.warehouse=s3:///,
--conf,spark.sql.defaultCatalog=locorregional,
--conf,spark.sql.catalog.locorregional.io-impl=org.apache.iceberg.aws.s3.S3FileIO,
s3:///spark-benchmark-assembly-3.5.3.jar,
s3:///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,),ActionOnFailure=CONTINUE --region 

Resumir los resultados

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

Lavar

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

Sumario

Amazon EMR perfeccionamiento 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 el código descubierto Spark 3.5.3 y Iceberg 1.6.1 con EMR 7.5 en TPC-DS 3 TB, v2.13. Este es un aumento adicional del 32% desde EMR 7.1. Le recomendamos que se mantenga actualizado con las últimas versiones de Amazon EMR para beneficiarse plenamente de las mejoras continuas de rendimiento.

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


Acerca de los autores

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

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *