Cómo fusionar archivos pequeños en Amazon S3 usando Spark

Aquí hay un ejemplo en Python que combina archivos .lzo que contienen líneas de texto. Para otros tipos de compresión, deberá cambiar el formato de entrada y el códec de salida. Tenga en cuenta que este código también puede usarse para dividir archivos grandes en archivos pequeños.

de pyspark import SparkContext

ruta = ‘s3n: // / ‘
output_path = ‘s3n: // / ‘
num_output_files = 5

con SparkContext () como sc:
rdd = sc.newAPIHadoopFile (
camino,
‘com.hadoop.mapreduce.LzoTextInputFormat’,
‘org.apache.hadoop.io.LongWritable’,
‘org.apache.hadoop.io.Text’,
keyConverter = Ninguno
)
rdd = rdd.repartition (num_output_files)
rdd = rdd.map (lambda clave_val: clave_val [1])
rdd.saveAsTextFile (
ruta de salida,
compressCodecClass = ‘com.hadoop.compression.lzo.LzopCodec’
)

Puedo decirle que para las fuentes compatibles con Hadoop, como el sistema de archivos local y HDFS, (no estoy seguro si S3 es compatible como un esquema de URL, o si puede conectar dicho procesador de esquema para S3, pero,), CombineFileInputFormat es un Hadoop FileInputFormat , que, en lugar de crear 1 división de entrada por 1 archivo de entrada, crea 1 división de entrada por n archivos, donde n se decide dinámicamente en función del tamaño total de esos archivos de entrada, para crear divisiones de entrada de tamaño uniforme, alrededor del número que pasa como configuración, digamos 256 MB.

Quizás exista algo similar para S3, o primero puede sincronizar sus archivos de s3 al sistema de archivos local, desde el cual puede leer en map-reduce, o spark o lo que sea, a través de InputFormat discutido anteriormente. ¡Buena suerte!

Nos enfrentamos a un desafío similar, donde tenemos que leer miles de archivos json pequeños (pocos mb) de S3. Observamos una latencia enorme, cargar 300mb de datos en un marco de datos tomó 20 minutos.

Solución: no es la mejor, pero esto es lo que hicimos. Archivos combinados a nivel mensual y diario, ahora los tiempos de lectura tan rápido.

Tomando este problema con la gente en los ladrillos de datos. Se actualizará una vez que encuentre un mejor enfoque.