Actualmente estoy escribiendo código para usar la API REST S3 de Amazon y noto un comportamiento diferente donde la única diferencia parece ser el URI del punto final de Amazon que uso, por ejemplo, https://s3.amazonaws.com vs. https://s3-us-west-2.amazonaws.com .
Ejemplos de diferentes comportamientos para la llamada GET Bucket (List Objects):
Usando un punto final, incluye la "carpeta" en los resultados, por ejemplo:
/path/subfolder/ /path/subfolder/file1.txt /path/subfolder/file2.txty, utilizando el otro extremo, no incluye la "carpeta" en los resultados:
/path/subfolder/file1.txt /path/subfolder/file2.txt Usando un punto final, representa "carpetas" usando un final / como se muestra arriba y, usando el otro punto final, usa un final _$folder$ :
/path/subfolder_$folder$ /path/subfolder/file1.txt /path/subfolder/file2.txt¿Por qué las diferencias? ¿Cómo puedo hacer que devuelva resultados de manera consistente, independientemente del punto final?
Tenga en cuenta que obtengo estos mismos resultados extraños incluso si uso el propio cliente AWS S3 de línea de comandos de Amazon, por lo que no es mi código.
Y el contenido de los cubos debería ser irrelevante de todos modos.
A pesar de su afirmación, su problema es exactamente sobre el contenido de los cubos, y no algo que S3 esté haciendo: la API de S3 no tiene concepto de carpetas. Ninguna. La consola S3 puede mostrar carpetas, pero esto es por conveniencia, las carpetas no están realmente allí, o si hay entidades similares a carpetas, son irrelevantes y no son necesarias.
En Amazon S3, los depósitos y los objetos son los recursos principales, donde los objetos se almacenan en depósitos. Amazon S3 tiene una estructura plana sin jerarquía como la que vería en un sistema de archivos típico. Sin embargo, en aras de la simplicidad organizativa, la consola de Amazon S3 admite el concepto de carpeta como medio para agrupar objetos. Amazon S3 hace esto mediante el uso de prefijos de nombres clave para objetos.
http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html
Entonces, ¿por qué estás viendo esto?
O ha estado usando EMR/Hadoop, o algún otro código escrito por alguien que tomó un mal ejemplo y lo ejecutó... o está haciendo algo diferente de lo que debería haberse hecho durante bastante tiempo.
Amazon EMR es un servicio web que utiliza un marco Hadoop administrado para procesar, distribuir e interactuar con datos en almacenes de datos de AWS, incluido Amazon S3. Dado que S3 utiliza un sistema de almacenamiento de pares clave-valor, el sistema de archivos de Hadoop implementa la compatibilidad con directorios en S3 mediante la creación de archivos vacíos con el sufijo
<directoryname>_$folder$.https://aws.amazon.com/premiumsupport/knowledge-center/emr-s3-empty-files/
Esto puede haber sido algo que hizo la consola S3 hace muchos años, y aparentemente (dado que no informa haberlos visto en la consola) todavía admite la visualización de objetos como carpetas en la consola... pero la consola S3 ya no los crea. de esta manera, si alguna vez lo hizo.
Reflejé exactamente el diseño de la "carpeta" del depósito.
Si crea una carpeta en la consola, se crea un objeto vacío con la clave "nombre de carpeta/". Esto, a su vez, se usa para mostrar una carpeta a la que puede navegar y cargar objetos con claves que comienzan con ese nombre de carpeta como prefijo.
La consola de Amazon S3 trata todos los objetos que tienen un carácter de barra inclinada "/" como el último carácter (posterior) en el nombre de la clave como una carpeta.
http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html
Si solo crea objetos usando la API, entonces "mi/objeto.txt" aparece en la consola como "objeto.txt" dentro de la carpeta "mi" aunque no haya ningún objeto "mi/" creado... así que si los objetos se crean con la API, no verá ningún estilo de "carpeta" en la lista de objetos.
Probablemente sea un error en el punto final de la API que incluye la "carpeta": S3 internamente no tiene una estructura de carpetas, sino que es solo un conjunto de claves asociadas con archivos, donde las claves (por conveniencia) pueden contener barras separadas. rutas que luego aparecen como "carpetas" en la interfaz web. Existe la opción en la API para especificar un prefijo , que creo que puede ser cualquier parte de la clave hasta incluir parte del nombre del archivo.
El cliente s3 de EMR no es el de Apache, por lo que no puedo hablar con precisión al respecto.
En versiones de ASF hadoop (y HDP, CDH)
$folder$ como delimitador de carpeta.Los clientes de S3A eliminan todos los marcadores de carpeta cuando enumera cosas; S3A los usa para simular directorios vacíos y elimina todos los marcadores principales cuando crea entradas de archivos/directorios secundarios.
Independientemente de lo que tenga, los procesos GET deben ignorar las entradas con "/" o $folder al final.
En cuanto a por qué son diferentes, el EMRFS local es una ruta de código diferente, que usa dínamo para implementar consistencia. Supongo que no necesita simular directorios vacíos, ya que las tablas DDB alojarán todas las entradas del directorio.