cluster aws hadoop amazon-web-services amazon-s3 yarn hadoop2

hadoop - aws - cluster emr



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

La respuesta de @ Ashrith funcionó para mí con una modificación: tuve que usar $HADOOP_PREFIX lugar de $HADOOP_HOME al ejecutar v2.6 en Ubuntu. ¿Quizás esto se $HADOOP_HOME que parece que $HADOOP_HOME está en deprecated ?

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

Dicho esto, ninguno de los dos 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/*

Estoy tratando de reproducir un clúster de Amazon EMR en mi máquina local. Para ese fin, 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 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 trato de enumerar el contenido del cubo:

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

Me sale este error:

ls: No FileSystem para esquema: s3

Edité core-site.xml nuevamente y agregué información relacionada con 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 me sale 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 Yarn no tiene los frascos necesarios para poder leer S3, pero no tengo idea de dónde conseguirlos. Cualquier sugerencia en esta dirección sería muy apreciada.


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.


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 las versiones 2.6 y 2.7. Entonces, 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/*

Suponiendo que está utilizando Apache Hadoop 2.6 o 2.7

Por cierto, puedes verificar el classpath de Hadoop usando:

bin/hadoop classpath


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

mapreduce.application.classpath

Agregue el siguiente valor al final de la cadena existente:

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


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")