Técnicamente, ¿cuál es la diferencia entre s3n, s3a y s3?

121

Soy consciente de la existencia de https://wiki.apache.org/hadoop/AmazonS3 y las siguientes palabras:

S3 Native FileSystem (esquema de URI: s3n) Un sistema de archivos nativo para leer y escribir archivos normales en S3. La ventaja de este sistema de archivos es que puede acceder a archivos en S3 que fueron escritos con otras herramientas. Por el contrario, otras herramientas pueden acceder a archivos escritos con Hadoop. La desventaja es el límite de 5 GB en el tamaño de archivo impuesto por S3.

S3A (esquema URI: s3a) Un sucesor del S3 Native, s3n fs, el sistema S3a: usa las bibliotecas de Amazon para interactuar con S3. Esto permite que S3a admita archivos más grandes (no más límite de 5 GB), operaciones de mayor rendimiento y más. El sistema de archivos está destinado a ser un reemplazo de / sucesor de S3 Native: todos los objetos accesibles desde s3n: // URL también deberían ser accesibles desde s3a simplemente reemplazando el esquema de URL.

S3 Block FileSystem (esquema URI: s3) Un sistema de archivos basado en bloques respaldado por S3. Los archivos se almacenan como bloques, al igual que en HDFS. Esto permite la implementación eficiente de cambios de nombre. Este sistema de archivos requiere que dediques un depósito para el sistema de archivos; no debes usar un depósito existente que contenga archivos ni escribir otros archivos en el mismo depósito. Los archivos almacenados por este sistema de archivos pueden tener un tamaño superior a 5 GB, pero no son interoperables con otras herramientas de S3.

¿Por qué un cambio de letra en el URI podría hacer tanta diferencia? Por ejemplo

val data = sc.textFile("s3n://bucket-name/key")

a

val data = sc.textFile("s3a://bucket-name/key")

¿Cuál es la diferencia técnica subyacente a este cambio? ¿Hay algún buen artículo que pueda leer sobre esto?

Hola muchacho
fuente

Respuestas:

136

El cambio de letra en el esquema de URI hace una gran diferencia porque hace que se utilice un software diferente para interactuar con S3. Algo parecido a la diferencia entre http y https: es solo un cambio de una letra, pero desencadena una gran diferencia en el comportamiento.

La diferencia entre s3 y s3n / s3a es que s3 es una superposición basada en bloques sobre Amazon S3, mientras que s3n / s3a no lo son (están basados ​​en objetos).

La diferencia entre s3n y s3a es que s3n admite objetos de hasta 5 GB de tamaño, mientras que s3a admite objetos de hasta 5 TB y tiene un mayor rendimiento (ambos se deben a que utiliza carga de varias partes). s3a es el sucesor de s3n.

Si está aquí porque desea comprender qué sistema de archivos S3 debe usar con Amazon EMR, lea este artículo de Amazon (solo disponible en la máquina wayback). La red es: use s3: // porque s3: // y s3n: // son funcionalmente intercambiables en el contexto de EMR, mientras que s3a: // no es compatible con EMR.

Para obtener más consejos, lea Trabajar con sistemas de almacenamiento y archivos .

jarmod
fuente
13
El artículo de soporte de Amazon parece estar aún actualizado, pero ahora puedo escribir a S3 desde trabajos de EMR usando el s3aesquema. Es posible que la respuesta deba revisarse.
mlg
1
@mig Si bien s3a podría funcionar, y parece que funciona en mi experiencia, no es técnicamente compatible con AWS. Entonces, creo que lo usaría bajo su propio riesgo.
jarmod
@jarmod, el artículo que citó aquí ya no funciona. ¿Podrías actualizar el enlace?
christang
@christang Parece que ya no está disponible, así que proporcioné un enlace a la máquina de retorno.
jarmod
2
Básicamente, el soporte de AWS recomienda s3: // un lugar de s3a: // para cualquier ticket de soporte
Abhi
56

en Apache Hadoop, "s3: //" se refiere al cliente S3 original, que usaba una estructura no estándar para la escalabilidad. Esa biblioteca está obsoleta y pronto se eliminará.

s3n es su sucesor, que usaba nombres de ruta directos a los objetos, por lo que puede leer y escribir datos con otras aplicaciones. Como s3: //, usa jets3t.jar para hablar con S3.

En el servicio EMR de Amazon, s3: // se refiere al propio cliente S3 de Amazon, que es diferente. Una ruta en s3: // en EMR se refiere directamente a un objeto en el almacén de objetos.

En Apache Hadoop, S3N y S3A son ambos conectores a S3, siendo S3A el sucesor creado con el propio AWS SDK de Amazon. ¿Por qué el nuevo nombre? para que pudiéramos enviarlo junto con el que era estable. S3A es donde va todo el trabajo en curso sobre escalabilidad, rendimiento, seguridad, etc. S3N se deja solo para que no lo rompamos. S3A se envió en Hadoop 2.6, pero todavía se estaba estabilizando hasta la 2.7, principalmente con algunos problemas menores que surgieron.

Si está usando Hadoop 2.7 o posterior, use s3a. Si está utilizando Hadoop 2.5 o anterior. s3n, si está utilizando Hadoop 2.6, es una elección más difícil. -Probaría s3a y volvería a s3n si hubiera problemas-

Para obtener más información sobre la historia, consulte http://hortonworks.com/blog/history-apache-hadoops-support-amazon-s3/

2017-03-14 Actualización en realidad, la partición está rota en S3a en Hadoop 2.6, ya que el tamaño de bloque devuelto en una listFiles()llamada es 0: cosas como Spark & ​​pig dividen el trabajo en una tarea / byte. No puede usar S3a para el trabajo de análisis en Hadoop 2.6, incluso si las operaciones centrales del sistema de archivos y la generación de datos son felices. Hadoop 2.7 corrige eso.

2018-01-10 Actualización Hadoop 3.0 ha reducido sus implementaciones s3: y s3n: s3a es todo lo que obtienes. Ahora es significativamente mejor que su predecesor y funciona tan bien como la implementación de Amazon. El "s3:" de Amazon todavía lo ofrece EMR, que es su cliente de código cerrado. Consulte los documentos de EMR para obtener más información.

stevel
fuente