5 に答える
はい、s3n
代わりに使用する必要がありs3
ます。s3
S3の奇妙な乱用であり、その利点は私には不明です。
sc.hadoopFile
認証情報をまたはsc.newAPIHadoopFile
呼び出しに渡すことができます。
rdd = sc.hadoopFile('s3n://my_bucket/my_file', conf = {
'fs.s3n.awsAccessKeyId': '...',
'fs.s3n.awsSecretAccessKey': '...',
})
から資格情報を読み取る方法の解決策を次に示します~/.aws/credentials
。これは、クレデンシャル ファイルが Python の configparser で解析できる INI ファイルであるという事実を利用しています。
import os
import configparser
config = configparser.ConfigParser()
config.read(os.path.expanduser("~/.aws/credentials"))
aws_profile = 'default' # your AWS profile to use
access_id = config.get(aws_profile, "aws_access_key_id")
access_key = config.get(aws_profile, "aws_secret_access_key")
https://gist.github.com/asmaier/5768c7cda3620901440a62248614bbd0の私の要点も参照してください。
この問題は、実際には Amazon のboto
Python モジュールのバグでした。問題は、MacPort のバージョンが実際には古いという事実に関連していました: boto
pip を介してインストールすると問題が解決しました:~/.aws/credentials
正しく読み取られました。
より多くの経験を積んだ今、一般的に (2015 年末の時点で) Amazon Web Services ツールと Spark/PySpark にはパッチの多いドキュメントがあり、非常に簡単に遭遇する深刻なバグがいくつかあると言えます。最初の問題については、最初にawsコマンドラインインターフェースを更新し、boto
何か奇妙なことが起こるたびにSparkを更新することをお勧めします.これにより、すでにいくつかの問題が「魔法のように」解決されました.
環境変数のセットアップが役立ちます。
Spark FAQの「S3 のデータにアクセスするにはどうすればよいですか?」という質問の下にあります。環境変数AWS_ACCESS_KEY_ID
を設定することをお勧めします。AWS_SECRET_ACCESS_KEY
hadoopFile 関数に渡さなければならない Java オブジェクトについて多くを語ることはできませんが、この関数はすでに一部の「newAPIHadoopFile」で廃止されているようです。これに関するドキュメントは非常に大ざっぱで、すべてが何を意味するのかを本当に理解するには、Scala/Java を知る必要があると思います。その間、s3 データを実際に pyspark に取り込む方法を見つけたので、その結果を共有したいと思いました。このドキュメント: Spark API ドキュメントでは、Java 構成 (XML) に変換される dict を使用すると書かれています。Java の構成を見つけました。これはおそらく、dict に入力する必要がある値を反映しているはずです: How to access S3/S3n from local hadoop installation
bucket = "mycompany-mydata-bucket"
prefix = "2015/04/04/mybiglogfile.log.gz"
filename = "s3n://{}/{}".format(bucket, prefix)
config_dict = {"fs.s3n.awsAccessKeyId":"FOOBAR",
"fs.s3n.awsSecretAccessKey":"BARFOO"}
rdd = sc.hadoopFile(filename,
'org.apache.hadoop.mapred.TextInputFormat',
'org.apache.hadoop.io.Text',
'org.apache.hadoop.io.LongWritable',
conf=config_dict)
このコード スニペットは、最初の 2 行で指定されたバケットとプレフィックス (バケット内のファイル パス) からファイルを読み込みます。