2016-08-03 30 views
3

S3A URIを使用してS3にデータを書き込むためにSparkを使用しています。
私もs3external-1.amazonaws.comエンドポイントを利用して、us-east1の最終的な一貫性の問題を回避しています。Spark 1.6.1 S3 MultiObjectDeleteException

S3にいくつかのデータを書き込もうとするときは、次の問題は、(それが実際に移動操作です)が起こる:

com.amazonaws.services.s3.model.MultiObjectDeleteException: Status Code: 0, AWS Service: null, AWS Request ID: null, AWS Error Code: null, AWS Error Message: One or more objects could not be deleted, S3 Extended Request ID: null 
    at com.amazonaws.services.s3.AmazonS3Client.deleteObjects(AmazonS3Client.java:1745) 
    at org.apache.hadoop.fs.s3a.S3AFileSystem.delete(S3AFileSystem.java:687) 
    at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.cleanupJob(FileOutputCommitter.java:381) 
    at org.apache.hadoop.mapreduce.lib.output.FileOutputCommitter.commitJob(FileOutputCommitter.java:314) 
    at org.apache.spark.sql.execution.datasources.BaseWriterContainer.commitJob(WriterContainer.scala:230) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply$mcV$sp(InsertIntoHadoopFsRelation.scala:151) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply(InsertIntoHadoopFsRelation.scala:108) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation$$anonfun$run$1.apply(InsertIntoHadoopFsRelation.scala:108) 
    at org.apache.spark.sql.execution.SQLExecution$.withNewExecutionId(SQLExecution.scala:56) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelation.run(InsertIntoHadoopFsRelation.scala:108) 
    at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult$lzycompute(commands.scala:58) 
    at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult(commands.scala:56) 
    at org.apache.spark.sql.execution.ExecutedCommand.doExecute(commands.scala:70) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:132) 
    at org.apache.spark.sql.execution.SparkPlan$$anonfun$execute$5.apply(SparkPlan.scala:130) 
    at org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:150) 
    at org.apache.spark.sql.execution.SparkPlan.execute(SparkPlan.scala:130) 
    at org.apache.spark.sql.execution.QueryExecution.toRdd$lzycompute(QueryExecution.scala:55) 
    at org.apache.spark.sql.execution.QueryExecution.toRdd(QueryExecution.scala:55) 
    at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:256) 
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:148) 
    at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:139) 
    at org.apache.spark.sql.DataFrameWriter.orc(DataFrameWriter.scala:346) 
    at com.mgmg.memengine.stream.app.persistentEventStreamBootstrap$$anonfun$setupSsc$3.apply(persistentEventStreamBootstrap.scala:122) 
    at com.mgmg.memengine.stream.app.persistentEventStreamBootstrap$$anonfun$setupSsc$3.apply(persistentEventStreamBootstrap.scala:112) 
    at org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3.apply(DStream.scala:661) 
    at org.apache.spark.streaming.dstream.DStream$$anonfun$foreachRDD$1$$anonfun$apply$mcV$sp$3.apply(DStream.scala:661) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(ForEachDStream.scala:50) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(ForEachDStream.scala:50) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(ForEachDStream.scala:50) 
    at org.apache.spark.streaming.dstream.DStream.createRDDWithLocalProperties(DStream.scala:426) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply$mcV$sp(ForEachDStream.scala:49) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply(ForEachDStream.scala:49) 
    at org.apache.spark.streaming.dstream.ForEachDStream$$anonfun$1.apply(ForEachDStream.scala:49) 
    at scala.util.Try$.apply(Try.scala:161) 

オブジェクト(複数可):

+0

スパーク以外のストリーミングジョブで同じ問題が発生しています。 Spark 1.6.2、Hadoop 2.6直接出力コミッターでも動作しません。 – Luke

答えて

2

これは、> 1プロセスがパスを削除しようとする競合状態によっても発生する可能性があります。 HADOOP-14101はそれを示しています。

この場合、hadoopオプションをfs.s3a.multiobjectdelete.enableに設定して、スタックトレースをなくすことができます。false

アップデートは、2017年2月23日

は、このためのいくつかのテストを書いたので、私は存在しないパスの削除のためにそれを複製することができていませんしましたが、アクセス許可の問題のためにそれを行っています。それが今の原因だと仮定してください。しかし、より多くのスタックトレースを歓迎して、問題の特定に役立ててください。 HADOOP-11572は、ドキュメントのパッチや問題のより良いログ(つまり、失敗したパスと特定のエラーのログ)など、問題をカバーしています。

4

私はスパークにアップグレードしたときに、私はこの問題に遭遇しました2.0.0であり、S3の権限がないことが判明しました。私は現在、aws-java-sdk-1.7.4とhadoop-aws-2.7.2を依存関係として使用してSpark 2.0.0を実行しています。

問題を解決するには、s3:Delete*アクションを対応するIAMポリシーに追加する必要がありました。環境の設定方法によっては、S3バケットに関するポリシー、Hadoop s3aライブラリがSECRET_KEYに接続しているユーザのポリシー、Sparkが実行されているEC2インスタンスのIAMロールポリシーなどが考えられます。私の場合は

は、私の作業IAMロールポリシーは、次のようになります。

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:Delete*", "s3:Get*", "s3:List*", "s3:PutObject" 
      ], 
      "Resource": "arn:aws:s3:::mybucketname/*" 
     } 
    ] 
} 

これは、S3またはIAM AWSコンソールのどちらかを迅速に変更され、スパーククラスタの再起動を必要とせず、すぐに適用する必要があります。ポリシーの編集方法がわからない場合は、もう少し詳細を提供しましたhere

関連する問題