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.

Buscando una solución para acelerar el procesamiento de `pyspark.sql.GroupedData.applyInPandas` en un conjunto de datos grande.

Estoy trabajando con un conjunto de datos almacenados en un cubo S3 (archivos Parquet) que consta de un total de ~165 millones de registros (con ~30 columnas). Ahora, el requisito es primero agrupar una cierta columna de ID y luego generar más de 250 características para cada uno de estos registros agrupados en función de los datos. La construcción de estas características es bastante compleja utilizando múltiples funcionalidades de Pandas junto con más de 10 funciones de soporte. La función groupby deberá generar ~5-6 millones de registros, por lo que la salida final deberá ser un dataframe con forma de 6M x 250.

Ahora, he probado el código en una muestra más pequeña y funciona bien. El problema es que, cuando lo implemento en el conjunto de datos completo, lleva mucho tiempo; la barra de progreso en la pantalla de Spark no cambia incluso después de más de 4 horas de ejecución. Estoy ejecutando esto en un portátil AWS EMR conectado a un clúster (1 Master m5.xlarge y 2 Nodos Core m5.xlarge).

He probado con combinaciones como 1 Master m5.4xlarge y 2 Nodos Core m5.4xlarge, así como 1 Master m5.xlarge y 8 Nodos Core m5.xlarge, entre otros. Ninguno de ellos ha mostrado ningún progreso.

He intentado ejecutarlo en memoria en mi máquina local con Pandas para ~650k registros, la velocidad fue de ~3.5 iteraciones/segundo, lo que supuso una ETA de ~647 horas.

Entonces, la pregunta es: ¿alguien puede compartir una mejor solución para reducir el tiempo de consumo y acelerar el procesamiento? ¿Debería usarse otro tipo de clúster para este caso de uso? ¿Debería refactorizarse o se debe eliminar el uso del dataframe de Pandas u otra sugerencia sería realmente útil?

¡Muchas gracias de antemano!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en tecnología de la información especializado en Python, Pandas, Amazon Web Services (AWS), Pyspark y big data, recomiendo explorar las siguientes opciones para reducir el consumo de tiempo y acelerar el procesamiento de este conjunto de datos almacenado en un bucket de S3:

    1. Utilice AWS Glue o AWS EMR con Pyspark para el procesamiento paralelo: AWS ofrece servicios como AWS Glue o AWS EMR con Pyspark que pueden ayudar en el procesamiento paralelo y distribuir la carga de trabajo entre múltiples nodos. Esto puede ayudar a reducir significativamente el tiempo de procesamiento.
    2. Utilice Dask o Koalas para el procesamiento distribuido: Dask y Koalas son bibliotecas que pueden ayudar en el procesamiento distribuido de conjuntos de datos grandes. Estas bibliotecas están diseñadas para trabajar con dataframes similares a Pandas y se pueden utilizar para realizar las operaciones de agrupación y creación de características requeridas.

    3. Utilice AWS Lambda para la computación sin servidor: AWS Lambda ofrece una solución de computación sin servidor que puede ayudar en el procesamiento de conjuntos de datos grandes de manera paralela. Dividiendo el conjunto de datos en fragmentos más pequeños y procesándolos en paralelo utilizando funciones Lambda, se puede reducir el tiempo de procesamiento general.

    4. Optimice el código y utilice algoritmos más eficientes: El código para generar las características se puede optimizar aún más para mejorar su rendimiento. Esto puede implicar el uso de algoritmos o llamadas de función más eficientes, reduciendo la cantidad de operaciones realizadas o utilizando estructuras de datos más adecuadas para los datos.

    5. Utilice AWS S3 Select para filtrar los datos: AWS S3 Select es un servicio que puede ayudar a filtrar los datos almacenados en los buckets de S3 sin tener que descargar todo el conjunto de datos. Esto puede ayudar a reducir la cantidad de datos que necesita ser procesada, y por lo tanto, reducir el tiempo de procesamiento.

    En resumen, existen múltiples formas de reducir el consumo de tiempo y acelerar el procesamiento de conjuntos de datos grandes almacenados en buckets de S3. Estas pueden implicar el uso de procesamiento paralelo, procesamiento distribuido, computación sin servidor, optimización del código, uso de algoritmos más eficientes o filtrado de los datos antes del procesamiento. La solución más adecuada dependerá de los requisitos y limitaciones específicas del caso de uso.

Comments are closed.