2016-12-15 9 views
5

私はS3 SignatureDoesNotMatchに遭遇し、SparkでS3にデータフレームを書き込もうとしています。スパークS3に書き込むV4 SignatureDoesNotMatchエラー

症状/物事は試してみました:

  • コードは時々に失敗したが時々に動作します。
  • コードが問題なくS3からを読み、S3A/enableV4 /間違ったキーのような間違ったコンフィグ設定を除外され、随時S3に書くことができるようにすることができます/リージョンエンドポイントなど
  • S3AエンドポイントはS3文書S3 Endpointに従って設定されていました。
  • AWS_SECRETY_KEYには、英数字以外の英数字は含まれていません。here
  • NTPを使用してサーバ時間が同期していることを確認しました。
  • 以下はEC2 m3.xlargeでローカルモードで動作するspark-2.0.2-bin-hadoop2.7でテストされました。
  • ファイルがローカルfsに書き込まれると、問題はなくなります。
  • 今すぐ回避策は、バケットをs3fsでマウントしてそこに書き込むことです。しかし、これは理想的ではありません。なぜなら、s3fsはSparkのストレスからかなりの頻度で死ぬからです。

    spark-submit\ 
        --verbose\ 
        --conf spark.hadoop.fs.s3n.impl=org.apache.hadoop.fs.s3native.NativeS3FileSystem \ 
        --conf spark.hadoop.fs.s3.impl=org.apache.hadoop.fs.s3.S3FileSystem \ 
        --conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem\ 
        --packages org.apache.hadoop:hadoop-aws:2.7.3\ 
        --driver-java-options '-Dcom.amazonaws.services.s3.enableV4'\ 
        foobar.py 
    
    
    # foobar.py 
    sc = SparkContext.getOrCreate() 
    sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", 'xxx') 
    sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", 'xxx') 
    sc._jsc.hadoopConfiguration().set("fs.s3a.endpoint", 's3.dualstack.ap-southeast-2.amazonaws.com') 
    
    hc = SparkSession.builder.enableHiveSupport().getOrCreate() 
    dataframe = hc.read.parquet(in_file_path) 
    
    dataframe.write.csv(
        path=out_file_path, 
        mode='overwrite', 
        compression='gzip', 
        sep=',', 
        quote='"', 
        escape='\\', 
        escapeQuotes='true', 
    ) 
    

    スパークerror次流出:

をコードまで沸騰させることができます。 VERBOSEする


セットのlog4j、次のことが起こっていた表示されます。

  • 各個人がS3 /_temporary/foorbar.part-xxx上の場所をstaingに出力されます。
  • PUTを呼び出すと、パーティションが最終的な場所に移動します。
  • いくつかのPUT呼び出しが成功した後、403のために後続のPUT呼び出しがすべて失敗しました。
  • reuqetsがaws-java-sdkによって作成されたため、アプリケーションレベルで何をすべきかわからないため、 - 以下のログは、まったく同じエラーの別のイベントからのものです。

>> PUT XXX/part-r-00025-ae3d5235-932f-4b7d-ae55-b159d1c1343d.gz.parquet HTTP/1.1 
>> Host: XXX.s3-ap-southeast-2.amazonaws.com 
>> x-amz-content-sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 
>> X-Amz-Date: 20161104T005749Z 
>> x-amz-metadata-directive: REPLACE 
>> Connection: close 
>> User-Agent: aws-sdk-java/1.10.11 Linux/3.13.0-100-generic OpenJDK_64-Bit_Server_VM/25.91-b14/1.8.0_91 com.amazonaws.services.s3.transfer.TransferManager/1.10.11 
>> x-amz-server-side-encryption-aws-kms-key-id: 5f88a222-715c-4a46-a64c-9323d2d9418c 
>> x-amz-server-side-encryption: aws:kms 
>> x-amz-copy-source: /XXX/_temporary/0/task_201611040057_0001_m_000025/part-r-00025-ae3d5235-932f-4b7d-ae55-b159d1c1343d.gz.parquet 
>> Accept-Ranges: bytes 
>> Authorization: AWS4-HMAC-SHA256 Credential=AKIAJZCSOJPB5VX2B6NA/20161104/ap-southeast-2/s3/aws4_request, SignedHeaders=accept-ranges;connection;content-length;content-type;etag;host;last-modified;user-agent;x-amz-content-sha256;x-amz-copy-source;x-amz-date;x-amz-metadata-directive;x-amz-server-side-encryption;x-amz-server-side-encryption-aws-kms-key-id, Signature=48e5fe2f9e771dc07a9c98c7fd98972a99b53bfad3b653151f2fcba67cff2f8d 
>> ETag: 31436915380783143f00299ca6c09253 
>> Content-Type: application/octet-stream 
>> Content-Length: 0 
DEBUG wire: << "HTTP/1.1 403 Forbidden[\r][\n]" 
DEBUG wire: << "x-amz-request-id: 849F990DDC1F3684[\r][\n]" 
DEBUG wire: << "x-amz-id-2: 6y16TuQeV7CDrXs5s7eHwhrpa1Ymf5zX3IrSuogAqz9N+UN2XdYGL2FCmveqKM2jpGiaek5rUkM=[\r][\n]" 
DEBUG wire: << "Content-Type: application/xml[\r][\n]" 
DEBUG wire: << "Transfer-Encoding: chunked[\r][\n]" 
DEBUG wire: << "Date: Fri, 04 Nov 2016 00:57:48 GMT[\r][\n]" 
DEBUG wire: << "Server: AmazonS3[\r][\n]" 
DEBUG wire: << "Connection: close[\r][\n]" 
DEBUG wire: << "[\r][\n]" 
DEBUG DefaultClientConnection: Receiving response: HTTP/1.1 403 Forbidden 
<< HTTP/1.1 403 Forbidden 
<< x-amz-request-id: 849F990DDC1F3684 
<< x-amz-id-2: 6y16TuQeV7CDrXs5s7eHwhrpa1Ymf5zX3IrSuogAqz9N+UN2XdYGL2FCmveqKM2jpGiaek5rUkM= 
<< Content-Type: application/xml 
<< Transfer-Encoding: chunked 
<< Date: Fri, 04 Nov 2016 00:57:48 GMT 
<< Server: AmazonS3 
<< Connection: close 
DEBUG requestId: x-amzn-RequestId: not available 
+0

'X-AMZ-日:20161104T005749Z'は1ヶ月以上前のことでした。このログエントリも古いものですか? –

+1

@ Michael-sqlbotはい、当時(11月初旬)に特定のマジックナンバー(そのインスタンスでは11)の下でパーティションサイズを小さくすることでこれを回避する前に、この問題が発生しました。(aws-java-sdk冗長な)ログはその時からだった。根本的な原因は決して特定されておらず、今問題が再浮上してしまったので、私はここで例としてそれらのログを掘り出している。 –

+0

'df.repartition (10).write.parquet( "s3a://" + s3_bucket_out + "/"、mode = "overwrite"、compression = "snappy"))はこの問題を回避するようです。 – asmaier

答えて

1
  1. あなたは "S3A" ダイをどういう意味ですか?私はそれについて興味がある。スタックトレースがある場合、それらをApache JIRAサーバ、HADOOP、コンポーネントfs/s3にファイルします。
  2. s3nはv4 APIをサポートしていません。エンドポイントの問題ではなく、新しいシグネチャメカの問題です。セキュリティ上の理由を除いて、jets3tライブラリをアップグレードすることはありませんので、その作業をやめてください。完了するために、O(バイト)を取る名前の変更、およびPUTとLISTの間に遅れ一貫することができますが、スパークは関係なく、ドライバの、S3を持ってしようとしていること

一つの問題は、それが最終的に一貫性のあるオブジェクトストアは、ということですコミットを破る。もっとsuccintly:Sparkは、あなたがファイルシステムに何かを書き込んだ後、lsの親ディレクトリを実行すると、あなたが書き込んだものを見つけることを前提としています。 S3はこれを提供しないので、最終的に一貫性という言葉が使われます。さて、HADOOP-13786ではより良いものにしようとしています。HADOOP-13345は、Amazon Dynamoを使って世界をより速く一貫して見ることはできません。しかし、あなたはその機能のためにダイナモッドプレミアムを支払わなければならないでしょう。

最後に、403エラーの原因を含むs3aのトラブルシューティングについて現在知られているすべてがis onlineです。うまくいけば助けになるでしょう、あなたが特定する別の原因があれば、パッチは歓迎です

+0

こんにちはスティーブ、私は[s3fs](https://github.com/s3fs-fuse/s3fs-fuse)が死ぬことを意味しました。 –

+0

私たちが使用しているs3 uriは 's3a'のものです;最終的な一貫性については、ログからはsdk(またはSpark)が十分にスマートであることが実際に分かりましたオブジェクトがステージング場所に正常に書き込まれたことを確認するための複数のHEAD呼び出し(S3は404の代わりに200を返します)を呼び出してからPUT呼び出しを実行して、最終宛先に移動します。 –

1

私はまったく同じ問題を経験し、this articleother resourcesは同じ方向を指しています)の助けを借りて解決策を見つけました。これらの設定オプションを設定すると、S3への書き込みが成功しました。

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2 
spark.speculation false 

私はHadoop 2.7でSpark 2.1.1を使用しています。私の最後の火花-submitコマンドは、このように見えた:

spark-submit 
--packages com.amazonaws:aws-java-sdk:1.7.4,org.apache.hadoop:hadoop-aws:2.7.3 
--conf spark.hadoop.fs.s3a.endpoint=s3.eu-central-1.amazonaws.com 
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem 
--conf spark.executor.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true 
--conf spark.driver.extraJavaOptions=-Dcom.amazonaws.services.s3.enableV4=true 
--conf spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version=2 
--conf spark.speculation=false 
... 

はまた、私は、これらの環境変数を定義した:

AWS_ACCESS_KEY_ID=**** 
AWS_SECRET_ACCESS_KEY=**** 
関連する問題