es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El trabajo de Spark está tardando mucho tiempo en agregar datos a S3.

Estoy ejecutando un trabajo de Spark en EMR e intento convertir un archivo comprimido grande (15 GB) a parquet, pero está tardando mucho en escribir en S3.

Estoy usando una instancia r5 para el nodo principal (1 instancia) y el nodo de datos (3 instancias).
Aquí está mi código.

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, to_date

def main():
    spark = SparkSession \
        .builder \
        .appName("convertidor-csv-a-parquet") \
        .config("spark.sql.catalogimplementation", "hive") \
        .config("hive.metastore.connect.retries", 3) \
        .config("hive.metastore.client.factory.class", "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory") \
        .enableHiveSupport().getOrCreate()

    tgt_filename = 'ALGUN_Prefijo'
    src_path = 'RUTA_S3_ORIGEN'
    tgt_path = 'BUCKET_DESTINO' + tgt_filename

    df = spark.read.csv(src_path, header=True)
    partitioned_df = df.repartition(50)
    partitioned_df.write.mode('append').parquet(path=tgt_path)
    spark.stop()

if __name__ == "main":
    main()

Agradeceré cualquier sugerencia.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema principal que estás enfrentando es la lenta velocidad de escritura a S3. Aquí hay algunas sugerencias para mejorar el rendimiento de tu código:

    1. Aumenta el número de particiones: Actualmente estás reparticionando tus datos en 50 particiones. Dependiendo del tamaño de tus datos, esto podría no ser óptimo. Intenta aumentar el número de particiones para permitir un mejor paralelismo durante el proceso de escritura.
    2. Utiliza un tipo de instancia más potente: Si bien las instancias r5 son generalmente buenas para la mayoría de las tareas, trabajar con grandes conjuntos de datos en EMR podría requerir un tipo de instancia más potente. Considera utilizar un tipo de instancia con mayor rendimiento de red o disco para mejorar la velocidad de escritura.

    3. Utiliza el committer optimizado para S3 de EMRFS: Por defecto, PySpark utiliza el OutputCommitter de Hadoop para escribir datos en S3. Sin embargo, esto puede ser lento e ineficiente para grandes conjuntos de datos. Considera habilitar el committer optimizado para S3 de EMRFS, que está diseñado específicamente para escribir en S3 desde EMR.

    4. Utiliza un formato de archivo diferente: Si bien Parquet es un gran formato de archivo para muchos casos de uso, puede que no sea la mejor opción para tu escenario específico. Considera utilizar un formato de archivo diferente que pueda tener un mejor rendimiento de escritura, como ORC o Avro.

    Espero que estas sugerencias ayuden a mejorar el rendimiento de tu trabajo de Spark en EMR.

Comments are closed.