web-dev-qa-db-ja.com

Amazon s3aは、Spark

チェックアウトの目的で、AmazonS3バケットをチェックポイントファイルとして設定しようとしています。

val checkpointDir = "s3a://bucket-name/checkpoint.txt"
val sc = new SparkContext(conf)
sc.setLocalProperty("spark.default.parallelism", "30")
sc.hadoopConfiguration.set("fs.s3a.access.key", "xxxxx")
sc.hadoopConfiguration.set("fs.s3a.secret.key", "xxxxx")
sc.hadoopConfiguration.set("fs.s3a.endpoint", "bucket-name.s3-website.eu-central-1.amazonaws.com")
val ssc = new StreamingContext(sc, Seconds(10))
ssc.checkpoint(checkpointDir)

しかし、それはこの例外で停止します

Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Status Code: 400, AWS Service: Amazon S3, AWS Request ID: 9D8E8002H3BBDDC7, AWS Error Code: null, AWS Error Message: Bad Request, S3 Extended Request ID: Qme5E3KAr/KX0djiq9poGXPJkmr0vuXAduZujwGlvaAl+oc6vlUpq7LIh70IF3LNgoewjP+HnXA=
at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.Java:798)
at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.Java:421)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.Java:232)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.Java:3528)
at com.amazonaws.services.s3.AmazonS3Client.headBucket(AmazonS3Client.Java:1031)
at com.amazonaws.services.s3.AmazonS3Client.doesBucketExist(AmazonS3Client.Java:994)
at org.Apache.hadoop.fs.s3a.S3AFileSystem.initialize(S3AFileSystem.Java:154)
at org.Apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.Java:2596)
at org.Apache.hadoop.fs.FileSystem.access$200(FileSystem.Java:91)
at org.Apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.Java:2630)
at org.Apache.hadoop.fs.FileSystem$Cache.get(FileSystem.Java:2612)
at org.Apache.hadoop.fs.FileSystem.get(FileSystem.Java:370)
at org.Apache.hadoop.fs.Path.getFileSystem(Path.Java:296)
at org.Apache.spark.streaming.StreamingContext.checkpoint(StreamingContext.scala:232)
at com.misterbell.shiva.StreamingApp$.main(StreamingApp.scala:89)
at com.misterbell.shiva.StreamingApp.main(StreamingApp.scala)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:497)
at org.Apache.spark.deploy.SparkSubmit$.org$Apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:664)
at org.Apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:169)
at org.Apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:192)
at org.Apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:111)
at org.Apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

このエラーが発生した理由がわかりません。例が見つかりません。

9
crak

このメッセージは、「不良エンドポイント」や不良署名バージョンのサポートなどに対応しています。

見たように ここ フランクフルトは署名バージョン2をサポートしていない唯一のものです。私はそれを選びます。

もちろん、私の研究では署名バージョンが何であるかを言うことができませんが、ドキュメントでは明らかではありません。しかし、V2はs3aで動作するようです。

S3インターフェースに表示されるエンドポイントは、実際のエンドポイントではなく、単なるWebエンドポイントです。

一度使用する必要があります theses そのようなエンドポイントsc.hadoopConfiguration.set("fs.s3a.endpoint", "s3-eu-west-1.amazonaws.com")

ただし、デフォルトでは米国のエンドポイントで機能します

19
crak

とにかくsparkでSignature V4をサポートするリージョンを使用したい場合は、実行時にフラグ-Dcom.amazonaws.services.s3.enableV4をドライバーオプションとエグゼキューターオプションに渡すことができます。例:

spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    ... (other spark options)

この設定を使用すると、Sparkは、それほど新鮮ではないAWS sdkバージョン(私の場合はcom.amazonaws:aws-Java-sdk:1.7.4)でもフランクフルト(および他のV4のみのリージョン)に書き込むことができます

1
Mariusz