web-dev-qa-db-ja.com

ローカルのHadoop 2.6インストールからS3 / S3nにアクセスするにはどうすればよいですか?

ローカルマシンで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が含まれていないのではないかと疑っていますが、どこで入手できるのかわかりません。この方向へのポインタは大歓迎です。

31
doublebyte

何らかの理由で、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
53
Ashrith
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
ksindi

@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/*

3
Matt K

この問題を解決するために、上記のすべてを試してみましたが、失敗しました(とにかく私の環境では)。

ただし、上記の2つのjarをツールdirからcommon/libにコピーすることで、機能させることができました。

その後はうまくいきました。

2
null

HDP 2.x以降を使用している場合は、AmbariのMapReduce2構成設定で次のプロパティを変更してみてください。

mapreduce.application.classpath

既存の文字列の最後に次の値を追加します。

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

1