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