Estoy utilizando una actividad de EMR en la canalización de datos de AWS. Esta actividad de EMR está ejecutando un script de colmena en el clúster de EMR. Toma Dynamo DB como entrada y almacena datos en S3.
Este es el paso EMR utilizado en EMR Activity
s3://elasticmapreduce/libs/script-runner/script-runner.jar,s3://elasticmapreduce/libs/hive/hive-script,--run-hive-script,--hive-versions,latest,--args,-f,s3://my-s3-bucket/hive/my_hive_script.q,-d,DYNAMODB_INPUT_TABLE1=MyTable,-d,S3_OUTPUT_BUCKET=#{output.directoryPath}dónde
out.direcoryPath es:
s3://my-s3-bucket/output/#{format(@scheduledStartTime,"YYYY-MM-dd")} Entonces esto crea una carpeta y un archivo en S3. (técnicamente hablando, crea dos claves 2017-03-18/<some_random_number> y 2017-03-18_$folder$ )
2017-03-18 2017-03-18_$folder$ Cómo evitar la creación de estos archivos _$folder$ extra vacíos.
EDITAR: Encontré una solución enumerada en https://issues.apache.org/jira/browse/HADOOP-10400 pero no sé cómo implementarla en la canalización de datos de AWS.
use s3a mientras escribe en el depósito s3, eliminará $folder$ . He probado este pegamento. No estoy seguro de si se aplicará en los clústeres de EMR.
Crédito: - respondido por alguien en reddit
from pyspark.sql import SparkSession spark=SparkSession.builder.getOrCreate() df=spark.read.format("parquet").load("s3://testingbucket/") df.write.format("parquet").save("s3a://testingbucket/parttest/") spark.stop()EMR no parece proporcionar una forma de evitar esto.
Dado que S3 usa un sistema de almacenamiento de pares clave-valor, el sistema de archivos Hadoop implementa la compatibilidad con directorios en S3 mediante la creación de archivos vacíos con el sufijo "_$folder$".
Puede eliminar de forma segura cualquier archivo vacío con el sufijo
<directoryname>_$folder$que aparece en sus depósitos de S3. Estos archivos vacíos son creados por el marco de Hadoop en tiempo de ejecución, pero Hadoop está diseñado para procesar datos incluso si se eliminan estos archivos vacíos.https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/
Está en el código fuente de Hadoop, por lo que podría arreglarse, pero aparentemente no está arreglado en EMR.
Si se siente inteligente, puede crear una notificación de evento S3 que coincida con el sufijo _$folder$ y hacer que active una función Lambda para eliminar los objetos después de que se creen.
No hay forma en S3 de crear realmente una carpeta vacía. S3 es un almacén de objetos, por lo que todo es un objeto allí.
Cuando Hadoop lo usa como un sistema de archivos, requiere organizar esos objetos para que aparezcan como un árbol del sistema de archivos, por lo que crea algunos objetos especiales para marcar un objeto como un directorio.
Solo almacena archivos de datos, pero puede elegir organizar esos archivos de datos en rutas, lo que crea un concepto similar a las carpetas para atravesar.
Algunas herramientas, incluida la Consola de administración de AWS, imitan las carpetas al interpretar /s en los nombres de los objetos. La consola de Amazon S3 admite el concepto de carpeta como medio para agrupar objetos. Lo mismo ocurre con el Bucket Explorer.
Si simplemente no crea una carpeta, sino que coloca los archivos en la ruta que desea, eso debería funcionar para usted.
No tiene que crear una carpeta antes de escribir archivos en ella en S3 porque /all/path/including/filename - es una clave completa en el almacenamiento de S3.