¿Cómo acceder a los archivos s3a: // desde Apache Spark?

Hadoop 2.6 no es compatible con s3a de fábrica, por lo que he intentado una serie de soluciones y soluciones, que incluyen:

implementar con hadoop-aws y aws-java-sdk => no se puede leer la variable de entorno para las credenciales agregar hadoop-aws en maven => diversos conflictos de dependencia transitiva

¿Alguien ha logrado que ambos funcionen correctamente?

Habiendo experimentado de primera mano la diferencia entre s3a y s3n – 7.9GB de datos transferidos en s3a fue de aproximadamente ~ 7 minutos, mientras que 7.9GB de datos en s3n tardaron 73 minutos [us-east-1 en us-west-1 desafortunadamente en ambos casos; Redshift y Lambda siendo nosotros-este-1 en este momento] esta es una pieza muy importante de la stack para corregir y vale la pena la frustración.

Estas son las partes clave, a partir de diciembre de 2015:

  1. Su clúster Spark necesitará una versión 2.xo superior de Hadoop. Si usa las secuencias de comandos de configuración de Spark EC2 y tal vez no las haya utilizado, el interruptor para usar algo que no sea 1.0 es especificar --hadoop-major-version 2 (que usa CDH 4.2 a partir de esta redacción).

  2. Deberá incluir lo que al principio puede parecer una biblioteca AWS SDK desactualizada (construida en 2014 como versión 1.7.4) para versiones de Hadoop tan tardías como 2.7.1 (estable): aws-java-sdk 1.7 .4. Por lo que puedo decir, el uso de esto junto con AWS SDK JAR específicos para 1.10.8 no ha roto nada.

  3. También necesitarás el hadoop-aws 2.7.1 JAR en classpath. Este JAR contiene la clase org.apache.hadoop.fs.s3a.S3AFileSystem .

  4. En spark.properties es probable que desee algunas configuraciones que se ven así:

     spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.access.key=ACCESSKEY spark.hadoop.fs.s3a.secret.key=SECRETKEY 

He detallado esta lista con más detalle en una publicación que escribí mientras trabajaba en este proceso. Además, he cubierto todos los casos de excepción que encontré en el camino y lo que creo que es la causa de cada uno y cómo solucionarlos.

Lo conseguí trabajando usando el binario precomstackdo Spark 1.4.1 con hadoop 2.6. Asegúrese de establecer tanto spark.driver.extraClassPath como spark.executor.extraClassPath apuntando a los dos jars (hadoop-aws y aws-java-sdk). Si ejecuta en un clúster, asegúrese de que sus ejecutores tengan acceso a los archivos jar en el clúster.

Estamos usando spark 1.6.1 con Mesos y estábamos teniendo muchos problemas para escribir en S3 desde la chispa. Doy crédito a cfeduke por la respuesta. El ligero cambio que hice fue agregar coordenadas maven a la configuración spark.jar en el archivo spark-defaults.conf. Intenté con hadoop-aws: 2.7.2 pero seguía recibiendo muchos errores, así que volvimos a 2.7.1. A continuación se muestran los cambios en spark-defaults.conf que nos funcionan:

 spark.jars.packages net.java.dev.jets3t:jets3t:0.9.0,com.google.guava:guava:16.0.1,com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.1 spark.hadoop.fs.s3a.impl org.apache.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.access.key  spark.hadoop.fs.s3a.secret.key  spark.hadoop.fs.s3a.fast.upload true 

Gracias, cfeduke por tomarte el tiempo de escribir tu publicación. Fue muy útil.

Estoy escribiendo esta respuesta para acceder a los archivos con S3A de Spark 2.0.1 en Hadoop 2.7.3

Copie los hadoop-aws-2.7.3.jar AWS ( hadoop-aws-2.7.3.jar y aws-java-sdk-1.7.4.jar ) que se enviaron por defecto con Hadoop.

  • Sugerencia: si las ubicaciones de jar no están seguras? ejecutar find command como privileged puede ser útil, los comandos pueden ser …

      find / -name hadoop-aws*.jar find / -name aws-java-sdk*.jar 

en la ruta de clases de chispa que contiene todos los flasks de chispas

  • Sugerencia: no podemos señalar directamente la ubicación (debe estar en el archivo de propiedades) ya que quiero que la respuesta sea genérica para las distribuciones y los sabores de Linux. El classpath de chispa se puede identificar mediante el comando find a continuación

      find / -name spark-core*.jar 

en spark-defaults.conf

Sugerencia: (En su mayoría se colocará en /etc/spark/conf/spark-defaults.conf )

 #make sure jars are added to CLASSPATH spark.yarn.jars=file://{spark/home/dir}/jars/*.jar,file://{hadoop/install/dir}/share/hadoop/tools/lib/*.jar spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem spark.hadoop.fs.s3a.access.key={s3a.access.key} spark.hadoop.fs.s3a.secret.key={s3a.secret.key} #you can set above 3 properties in hadoop level `core-site.xml` as well by removing spark prefix. 

en el envío de chispa incluyen jar ( aws-java-sdk y hadoop-aws ) en --driver-class-path si es necesario.

 spark-submit --master yarn \ --driver-class-path {spark/jars/home/dir}/aws-java-sdk-1.7.4.jar \ --driver-class-path {spark/jars/home/dir}/hadoop-aws-2.7.3.jar \ other options 

Nota:

Asegúrese de que el usuario de Linux con privilegios de lectura, antes de ejecutar el comando find para evitar errores. Permiso denegado

Aquí están los detalles a partir de octubre de 2016, tal como se presentó en Spark Summit EU: Apache Spark and Object Stores .

Puntos clave

  • El committer de salida directa se ha ido de Spark 2.0 debido al riesgo / experiencia de corrupción de datos.
  • Hay algunas configuraciones en FileOutputCommitter para reducir el cambio de nombre, pero no eliminarlas
  • Estoy trabajando con algunos colegas para hacer un committer O (1), confiando en Apache Dynamo para que nos dé la coherencia que necesitamos.
  • Para usar S3a, obtenga su ruta de clases correcta.
  • Y estar en Hadoop 2.7.z; 2.6.x tuvo algunos problemas que fueron abordados por HADOOP-11571 .
  • Hay un PR bajo SPARK-7481 para llevar todo a una distribución de chispa que construyas tú mismo. De lo contrario, pida a quienquiera que suministre los binarios para que hagan el trabajo.
  • Hadoop 2.8 va a agregar importantes mejoras de rendimiento HADOOP-11694 .

Ubicación del producto: el lado de rendimiento de lectura de HADOOP-11694 está incluido en HDP2.5; La documentación de Spark y S3 podría ser de interés, especialmente las opciones de ajuste.

Utilizando Spark 1.4.1 preconstruido con Hadoop 2.6, puedo hacer que s3a: // funcione cuando se implementa en un clúster Spark independiente al agregar los archivos jar de hadoop-aws y aws-java-sdk de Hadoop 2.7.1 distro (que se encuentra en $ HADOOP_HOME / share / hadoop / tools / lib de Hadoop 2.7.1) a mi variable de entorno SPARK_CLASSPATH en mi archivo $ SPARK_HOME / conf / spark-env.sh.

como dijiste, hadoop 2.6 no es compatible con s3a, y la última versión de chispa 1.6.1 no es compatible con hadoop 2.7, pero la chispa 2.0 definitivamente no es un problema con hadoop 2.7 y s3a.

para la chispa 1.6.x, hicimos algunos hack sucios, con el controlador s3 de EMR … puedes echar un vistazo a este documento: https://github.com/zalando/spark-appliance#emrfs-support

si todavía quiere intentar usar s3a en la chispa 1.6.x, consulte la respuesta aquí: https://stackoverflow.com/a/37487407/5630352

También puede agregar las dependencias S3A al classpath usando spark-defaults.conf .

Ejemplo:

 spark.driver.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar spark.executor.extraClassPath /usr/local/spark/jars/hadoop-aws-2.7.5.jar spark.driver.extraClassPath /usr/local/spark/jars/aws-java-sdk-1.7.4.jar spark.executor.extraClassPath /usr/local/spark/jars/aws-java-sdk-1.7.4.jar 

O solo:

 spark.jars /usr/local/spark/jars/hadoop-aws-2.7.5.jar,/usr/local/spark/jars/aws-java-sdk-1.7.4.jar 

Solo asegúrese de hacer coincidir su versión de AWS SDK con la versión de Hadoop. Para obtener más información al respecto, consulte esta respuesta: No se puede acceder a los datos S3 con Spark 2.2

Aquí hay una solución para pyspark (posiblemente con proxy):

 def _configure_s3_protocol(spark, proxy=props["proxy"]["host"], port=props["proxy"]["port"], endpoint=props["s3endpoint"]["irland"]): """ Configure access to the protocol s3 https://sparkour.urizone.net/recipes/using-s3/ AWS Regions and Endpoints https://docs.aws.amazon.com/general/latest/gr/rande.html """ sc = spark.sparkContext sc._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", os.environ.get("AWS_ACCESS_KEY_ID")) sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", os.environ.get("AWS_SECRET_ACCESS_KEY")) sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.host", proxy) sc._jsc.hadoopConfiguration().set("fs.s3a.proxy.port", port) sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", endpoint) return spark 

Puede usar s3n: // y cambiar el compromiso de salida de chispa a uno que muestre directamente el archivo (vea este fragmento )