我正在尝试在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)?
更新
Application application_1496243466754_0007 failed 2 times due to AM Container for appattempt_1496243466754_0007_000002 exited with exitCode: 0
。 '0'似乎是正确的退出代码,日志文件显示没有错误。现在我不知道为什么这份工作失败了。答案 0 :(得分:0)
我得到了完全相同的错误。阅读你的问题我意识到我们有一个共同点就是我还有一个2节点集群,其中包含1个主节点和1个核心节点。在3节点集群上重复我的工作(EMR的默认设置)会导致问题消失。如果这也解决了您的问题并且是实际的解决方案,则可能存在针对集群部署模式的最小节点/集群数量的错误或限制,至少在EMR上。