ローカルマシンでAmazon EMRクラスターを再現しようとしています。そのために、 現在のHadoopの最新の安定バージョン-2.6. をインストールしました。ここで、EMRクラスター内で行うように、S3バケットにアクセスしたいと思います。
Core-site.xmlにaws認証情報を追加しました:
<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>
注:キーにはいくつかのスラッシュがあるため、%2Fでエスケープしました
バケットの内容をリストしようとすると:
hadoop fs -ls s3://some-url/bucket/
私はこのエラーを受け取ります:
ls:スキームのファイルシステム:s3
Core-site.xmlを再度編集し、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>
今回は別のエラーが発生します:
-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)
どういうわけか、Yarnディストリビューションには、S3を読み取るために必要なjarが含まれていないのではないかと疑っていますが、どこで入手できるのかわかりません。この方向へのポインタは大歓迎です。
何らかの理由で、hadoop-aws-[version].jar
への実装を含むNativeS3FileSystem
は、バージョン2.6および2.7ではデフォルトでhadoopのclasspath
に存在しません。したがって、hadoop-env.sh
にある$HADOOP_HOME/etc/hadoop/hadoop-env.sh
に次の行を追加して、クラスパスに追加してみてください。
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$HADOOP_HOME/share/hadoop/tools/lib/*
Apache Hadoop 2.6または2.7を使用していると仮定します
ところで、次を使用してHadoopのクラスパスを確認できます。
bin/hadoop classpath
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")
@Ashrithの答えは、1つの変更で機能しました。Ubuntuでv2.6を実行するときは、_$HADOOP_PREFIX
_ではなく_$HADOOP_HOME
_を使用する必要がありました。おそらく、これは_$HADOOP_HOME
_が 非推奨 ?
_export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:${HADOOP_PREFIX}/share/hadoop/tools/lib/*
_
そうは言っても、Homebrew経由でインストールされたv2.6を搭載したMacでは、どちらもうまくいきませんでした。その場合、私はこの非常にぎこちないエクスポートを使用しています。
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$(brew --prefix hadoop)/libexec/share/hadoop/tools/lib/*
この問題を解決するために、上記のすべてを試してみましたが、失敗しました(とにかく私の環境では)。
ただし、上記の2つのjarをツールdirからcommon/libにコピーすることで、機能させることができました。
その後はうまくいきました。
HDP 2.x以降を使用している場合は、AmbariのMapReduce2構成設定で次のプロパティを変更してみてください。
mapreduce.application.classpath
既存の文字列の最後に次の値を追加します。
/usr/hdp/${hdp.version}/hadoop-mapreduce/*