2016-07-07 42 views
2

我在參數中帶有目的地的RDD [String]上調用此方法。 (Scala)Spark RDD方法「saveAsTextFile」拋出異常即使在刪除輸出目錄之後。 org.apache.hadoop.mapred.FileAlreadyExistsException

即使在開始之前刪除目錄後,該過程也會出現此錯誤。 我在輸出位置位於aws S3的EMR羣集上運行此過程。 下面是使用命令:

spark-submit --deploy-mode cluster --class com.hotwire.hda.spark.prd.pricingengine.PRDPricingEngine --conf spark.yarn.submit.waitAppCompletion=true --num-executors 21 --executor-cores 4 --executor-memory 20g --driver-memory 8g --driver-cores 4 s3://bi-aws-users/sbatheja/hotel-shopper-0.0.1-SNAPSHOT-jar-with-dependencies.jar -d 3 -p 100 --search-bucket s3a://hda-prod-business.hotwire.hotel.search --prd-output-path s3a://bi-aws-users/sbatheja/PRD/PriceEngineOutput/ 

登錄:

16/07/07 11:27:47 INFO BlockManagerMaster: BlockManagerMaster stopped 
16/07/07 11:27:47 INFO OutputCommitCoordinator$OutputCommitCoordinatorEndpoint: OutputCommitCoordinator stopped! 
16/07/07 11:27:47 INFO SparkContext: Successfully stopped SparkContext 
16/07/07 11:27:47 INFO ApplicationMaster: Unregistering ApplicationMaster with FAILED (diag message: User class threw exception: **org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory s3a://bi-aws-users/sbatheja/PRD/PriceEngineOutput already exists)** 
16/07/07 11:27:47 INFO RemoteActorRefProvider$RemotingTerminator: Shutting down remote daemon. 
16/07/07 11:27:47 INFO RemoteActorRefProvider$RemotingTerminator: Remote daemon shut down; proceeding with flushing remote transports. 
16/07/07 11:27:47 INFO AMRMClientImpl: Waiting for application to be successfully unregistered. 
16/07/07 11:27:47 INFO RemoteActorRefProvider$RemotingTerminator: Remoting shut down. 
16/07/07 11:27:47 INFO ApplicationMaster: Deleting staging directory .sparkStaging/application_1467889642439_0001 
16/07/07 11:27:47 INFO ShutdownHookManager: Shutdown hook called 
16/07/07 11:27:47 INFO ShutdownHookManager: Deleting directory /mnt/yarn/usercache/hadoop/appcache/application_1467889642439_0001/spark-7f836950-a040-4216-9308-2bb4565c5649 

它創建中的位置,其中包含空白部分文件 「_temporary」 目錄。

+0

你確定你運行作業之前,文件夾不存在?你爲什麼使用's3a'而不是's3'或's3n'? –

+0

是的,我在一切之前刪除了目錄。基本原因是s3支持高達5gb,s3a沒有這樣的限制。也嘗試過s3。同樣的問題:( – saurabh7389

+0

也許你的問題是在代碼中的其他地方失敗,這就是爲什麼臨時文件,並且你有一些重試機制,試圖再次運行代碼,然後失敗,因爲該目錄已經存在與以前的嘗試和遺漏了嗎? –

回答

1

總之,一句話:
確保的spark-corescala-library是一致的階版本。


我遇到了同樣的問題。 當我將文件保存到HDFS時,它會拋出一個異常:org.apache.hadoop.mapred.FileAlreadyExistsException
然後我檢查了HDFS文件目錄,有一個空的臨時文件夾:TARGET_DIR/_temporary/0

您可以提交作業,打開詳細配置:./spark-submit --verbose。 然後看完整的上下文和日誌,一定有其他錯誤引起的。 我在RUNNING狀態的工作,第一個錯誤被拋出:

17/04/23 11:47:02 ERROR executor.Executor: Exception in task 1.0 in stage 0.0 (TID 1) 
java.lang.NoSuchMethodError: scala.Predef$.refArrayOps([Ljava/lang/Object;)[Ljava/lang/Object; 

然後工作將是重試和重新執行。在這個時候,重新執行作業,它會發現剛剛創建的目錄。並且還會引發該目錄已經存在。

確認第一個錯誤是版本兼容性問題後。 火花版本是2.1.0,相應的spark-core scala版本是2.11,而且scala版本的scala-library依賴關係是2.12.xx

當兩個scala版本的變化是一致的(通常修改scala-library版本),可以解決第一個異常問題,那麼作業可以正常FINISHED
pom.xml例如:

<!-- Spark --> 
<dependency> 
    <groupId>org.apache.spark</groupId> 
    <artifactId>spark-core_2.11</artifactId> 
    <version>2.1.0</version> 
</dependency> 
<!-- scala --> 
<dependency> 
    <groupId>org.scala-lang</groupId> 
    <artifactId>scala-library</artifactId> 
    <version>2.11.7</version> 
</dependency>