对于HDFS上的__spark_config__.zip,EMR 5.5.0上的简单spark-submit作业因FileNotFoundException而失败

时间:2017-05-31 17:51:01

标签: python apache-spark pyspark yarn emr

我正在尝试在AWS ERM 5.5.0上部署运行Python 3 Spark应用程序。我读了一些关于如何配置集群以要求Python 3的文章。我想测试是否正确设置,所以我创建了一个简单的应用程序来打印sys.version。然后我将这份工作提交给集群。

当我使用spark-submit --deploy-mode client /local/path/to/version.py或在客户端模式下提交步骤在主服务器上运行它时,它可以工作,我在stdout上看到版本信息(Python 3,yay!)。

当我使用spark-submit --deploy-mode cluster /local/path/to/version.py在群集(1个主服务器,1个核心)上运行或通过在群集模式下提交步骤时,它会失败。来自作业的stderr日志在几个地方说“容器退出时带有非零退出代码1”。仔细查看,我被引导到yarn logs获取实际的容器日志。看看那些,我看到两个容器的日志集。

在容器container_1496243466754_0004_01_000001的stdout日志中,我看到我的实际python代码运行并报告了python版本(Python 3,再次yay!)。自从代码运行以来,我希望这项工作取得成功,但事实并非如此。

来自另一个容器container_1496243466754_0004_02_000001的日志在stderr日志的末尾显示以下内容:

17/05/31 17:11:58 INFO ApplicationMaster: Preparing Local resources
Exception in thread "main" java.io.FileNotFoundException: File does not exist: hdfs://ip-10-0-210-27.hwheel.in:8020/user/hadoop/.sparkStaging/application_1496243466754_0004/__spark_conf__.zip
        at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1309)
        at org.apache.hadoop.hdfs.DistributedFileSystem$22.doCall(DistributedFileSystem.java:1301)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1317)
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$6.apply(ApplicationMaster.scala:160)
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$6.apply(ApplicationMaster.scala:157)
        at scala.Option.foreach(Option.scala:257)
        at org.apache.spark.deploy.yarn.ApplicationMaster.<init>(ApplicationMaster.scala:157)
        at org.apache.spark.deploy.yarn.ApplicationMaster$$anonfun$main$1.apply$mcV$sp(ApplicationMaster.scala:765)
        at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:67)
        at org.apache.spark.deploy.SparkHadoopUtil$$anon$1.run(SparkHadoopUtil.scala:66)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
        at org.apache.spark.deploy.SparkHadoopUtil.runAsSparkUser(SparkHadoopUtil.scala:66)
        at org.apache.spark.deploy.yarn.ApplicationMaster$.main(ApplicationMaster.scala:764)
        at org.apache.spark.deploy.yarn.ApplicationMaster.main(ApplicationMaster.scala)

我认为这会导致我的工作失败。从另一个容器中跳回到stderr,我看到了:

17/05/31 17:11:52 INFO ApplicationMaster: Deleting staging directory hdfs://ip-10-0-210-27.hwheel.in:8020/user/hadoop/.sparkStaging/application_1496243466754_0004 

所以在我看来容器_1496243466754_0004_01_000001在应用程序完成时从HDFS中删除了暂存目录,但是这会抢占另一个容器,然后在6秒后在该目录中查找该文件。

我已经看到一些(可能是过时的)解释,由于Java版本不匹配(Java 8中的应用程序,Java 7中的spark),可能会发生此类错误。但是,我相信EMR在Java 8中运行,这是集群的默认设置,我不是直接在我的应用程序中调用Java。

我该如何解决这个问题?我的应用程序是否刚刚完成并快速删除暂存文件(它只是一行python)?

更新

  • 我在我的一行程序结束时添加了time.sleep(10),以确保不是我的程序完成得太快的情况。没有区别。
  • 我找到了spark.yarn.preserve.staging.files的文档。我在spark-defaults.conf中将其设置为true。我在集群模式下再次运行相同的工作。这一次,容器运行完成没有错误。没有问题w / FileNotFound spark_conf .zip。我可以验证此文件是否存在于HDFS上的预期位置。但是,整个作业仍然报告为失败Application application_1496243466754_0007 failed 2 times due to AM Container for appattempt_1496243466754_0007_000002 exited with exitCode: 0。 '0'似乎是正确的退出代码,日志文件显示没有错误。现在我不知道为什么这份工作失败了。

1 个答案:

答案 0 :(得分:0)

我得到了完全相同的错误。阅读你的问题我意识到我们有一个共同点就是我还有一个2节点集群,其中包含1个主节点和1个核心节点。在3节点集群上重复我的工作(EMR的默认设置)会导致问题消失。如果这也解决了您的问题并且是实际的解决方案,则可能存在针对集群部署模式的最小节点/集群数量的错误或限制,至少在EMR上。