¿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.
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
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")
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/*
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.
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 / *
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