¿Cómo puedo acceder a S3 / S3n desde una instalación local de Hadoop 2.6?


Estoy intentando reproducir un clúster de Amazon EMR en mi máquina local. Para ello, he instalado la última versión estable de Hadoop a partir de ahora - 2.6.0. Ahora me gustaría acceder a un bucket S3, como lo hago dentro del clúster EMR.

He agregado las credenciales de aws en core-site.xml:

<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>some id</value>
</property>

<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>some key</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>some key</value>
</property>

Nota: Dado que hay algunas barras en la clave, las he escapado con %2F

Si intento enumerar el contenido del cubo:

hadoop fs -ls s3://some-url/bucket/

Consigo este error:

ls: No hay sistema de archivos para scheme: s3

Edité core-site.xml de nuevo, y se agregó información relacionada con el fs:

<property>
  <name>fs.s3.impl</name>
  <value>org.apache.hadoop.fs.s3.S3FileSystem</value>
</property>

<property>
  <name>fs.s3n.impl</name>
  <value>org.apache.hadoop.fs.s3native.NativeS3FileSystem</value>
</property>

Esta vez obtengo un error diferente:

-ls: Fatal internal error
java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3.S3FileSystem not found
        at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2074)
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2578)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2591)

De alguna manera sospecho que la distribución de hilo no tiene los frascos necesarios para poder leer S3, pero no tengo idea de dónde conseguirlos. Cualquier indicación en esta dirección sería muy apreciada.

Author: Greg Dubicki, 2015-01-19

5 answers

Por alguna razón, el jar hadoop-aws-[version].jar que contiene la implementación de NativeS3FileSystem no está presente en el classpath de hadoop por defecto en la versión 2.6 y 2.7. Por lo tanto, intente agregarlo al classpath agregando la siguiente línea en hadoop-env.sh que se encuentra en $HADOOP_HOME/etc/hadoop/hadoop-env.sh:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*

Asumiendo que está usando Apache Hadoop 2.6 o 2.7

Por cierto, puedes comprobar el classpath de Hadoop usando:

bin/hadoop classpath
 50
Author: Ashrith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-13 15:30:37
import os
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.10.34,org.apache.hadoop:hadoop-aws:2.6.0 pyspark-shell'

import pyspark
sc = pyspark.SparkContext("local[*]")

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

hadoopConf = sc._jsc.hadoopConfiguration()
myAccessKey = input() 
mySecretKey = input()
hadoopConf.set("fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem")
hadoopConf.set("fs.s3.awsAccessKeyId", myAccessKey)
hadoopConf.set("fs.s3.awsSecretAccessKey", mySecretKey)

df = sqlContext.read.parquet("s3://myBucket/myKey")
 8
Author: ksindi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-26 12:37:22

La respuesta de@Ashrith funcionó para mí con una modificación: tuve que usar $HADOOP_PREFIX en lugar de $HADOOP_HOME al ejecutar v2.6 en Ubuntu. Tal vez esto es porque suena como $HADOOP_HOME está siendo en desuso?

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${HADOOP_PREFIX}/share/hadoop/tools/lib/*

Dicho esto, ninguno funcionó para mí en mi Mac con v2.6 instalado a través de Homebrew. En ese caso, estoy usando esta exportación extremadamente torpe:

export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$(brew --prefix hadoop)/libexec/share/hadoop/tools/lib/*

 3
Author: Matt K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:44

Para resolver este problema probé todo lo anterior, que falló (para mi entorno de todos modos).

Sin embargo, pude hacerlo funcionar copiando los dos frascos mencionados anteriormente del directorio de herramientas y en common/lib.

Funcionó bien después de eso.

 2
Author: null,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-14 13:06:42

Si está utilizando HDP 2.x o superior puede intentar modificar la siguiente propiedad en la configuración de MapReduce2 en Ambari.

Mapreduce.aplicación.classpath

Añada el siguiente valor al final de la cadena existente:

/usr/hdp/{{hdp.version} / hadoop-mapreduce / *

 1
Author: David Kjerrumgaard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-09 22:39:20