Spark在本地运行但在YARN中运行时找不到文件

Posted

技术标签:

【中文标题】Spark在本地运行但在YARN中运行时找不到文件【英文标题】:Spark runs in local but can't find file when running in YARN 【发布时间】:2017-11-07 12:17:15 【问题描述】:

我一直在尝试提交一个简单的 python 脚本以在带有 YARN 的集群中运行它。当我在本地执行作业时,没有问题,一切正常,但是当我在集群中运行时,它失败了。

我使用以下命令执行了提交:

spark-submit --master yarn --deploy-mode cluster test.py

我收到的日志错误如下:

17/11/07 13:02:48 INFO yarn.Client: Application report for application_1510046813642_0010 (state: ACCEPTED)
17/11/07 13:02:49 INFO yarn.Client: Application report for application_1510046813642_0010 (state: ACCEPTED)
17/11/07 13:02:50 INFO yarn.Client: Application report for application_1510046813642_0010 (state: FAILED)
17/11/07 13:02:50 INFO yarn.Client: 
     client token: N/A
     diagnostics: Application application_1510046813642_0010 failed 2 times due to AM Container for appattempt_1510046813642_0010_000002 exited with  exitCode: -1000
For more detailed output, check application tracking page:http://myserver:8088/proxy/application_1510046813642_0010/Then, click on links to logs of each attempt.
**Diagnostics: File does not exist: hdfs://myserver:8020/user/josholsan/.sparkStaging/application_1510046813642_0010/test.py**
java.io.FileNotFoundException: File does not exist: hdfs://myserver:8020/user/josholsan/.sparkStaging/application_1510046813642_0010/test.py
    at org.apache.hadoop.hdfs.DistributedFileSystem$20.doCall(DistributedFileSystem.java:1266)
    at org.apache.hadoop.hdfs.DistributedFileSystem$20.doCall(DistributedFileSystem.java:1258)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:1258)
    at org.apache.hadoop.yarn.util.FSDownload.copy(FSDownload.java:251)
    at org.apache.hadoop.yarn.util.FSDownload.access$000(FSDownload.java:61)
    at org.apache.hadoop.yarn.util.FSDownload$2.run(FSDownload.java:359)
    at org.apache.hadoop.yarn.util.FSDownload$2.run(FSDownload.java:357)
    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:1917)
    at org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:356)
    at org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:60)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Failing this attempt. Failing the application.
     ApplicationMaster host: N/A
     ApplicationMaster RPC port: -1
     queue: root.users.josholsan
     start time: 1510056155796
     final status: FAILED
     tracking URL: http://myserver:8088/cluster/app/application_1510046813642_0010
     user: josholsan
Exception in thread "main" org.apache.spark.SparkException: Application application_1510046813642_0010 finished with failed status
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:1025)
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1072)
    at org.apache.spark.deploy.yarn.Client.main(Client.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:730)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
17/11/07 13:02:50 INFO util.ShutdownHookManager: Shutdown hook called
17/11/07 13:02:50 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-5cc8bf5e-216b-4d9e-b66d-9dc01a94e851

我特别注意这一行

诊断:文件不存在:hdfs://myserver:8020/user/josholsan/.sparkStaging/application_1510046813642_0010/test.py

不知道为什么找不到test.py,我也试过放到HDFS中执行job的用户目录下:/user/josholsan/

为了完成我的帖子,我还想分享我的 test.py 脚本:

from pyspark import SparkContext

file="/user/josholsan/concepts_copy.csv"
sc = SparkContext("local","Test app")
textFile = sc.textFile(file).cache()

linesWithOMOP=textFile.filter(lambda line: "OMOP" in line).count()
linesWithICD=textFile.filter(lambda line: "ICD" in line).count()

print("Lines with OMOP: %i, lines with ICD9: %i" % (linesWithOMOP,linesWithICD))

错误是否也在这里?:

sc = SparkContext("本地","测试应用")

非常感谢您提前提供的帮助。

【问题讨论】:

路径对整个集群可见吗?在 mesos 中,您使用 --py-files 参数来提交 python 附加资源并运行 test.py 文件,您需要提供每个工作人员都可以访问和查看的路径,例如spark-submit --master yarn --deploy-mode cluster http://myfiles/test.py 另外,你使用什么版本的 pyspark?因为,还有另一种方法可以实例化 sparkContext(另外,afaik,"local" 不应指定,因为它会覆盖命令行设置) 我将 Spark 1.6 与 Python 2.7 一起使用。你是对的,首先我第一次将集群中的每台机器与所有其他机器连接起来,然后我再次启动了这项工作。这次也失败了,但出现了不同的错误(信息不多)。然后我通过执行以下操作编辑了我的脚本: sc = SparkContext() 这一次一切正常。最后一个问题:我对这些东西很陌生,所以......我怎样才能检索到工作的结果?既然只是印刷品?或者我应该将它保存在一个文件或类似的东西中以获得结果?再次感谢您。 顺便说一句,您可以将您的评论作为回复,以便我将其设置为解决方案吗? 我很高兴它有帮助,我很快就会把它作为答案:) 至于结果,我对在yarn 上运行不是很熟悉,但经过搜索我发现有将显示作业输出的命令yarn logs。更多here 【参考方案1】:

转自 cmets 部分:

sc = SparkContext("local","Test app"):这里有"local" 将覆盖任何命令行设置;来自docs:

任何指定为标志或属性文件中的值都将传递给应用程序并与通过 SparkConf 指定的值合并。直接在 SparkConf 上设置的属性具有最高优先级,然后是传递给 spark-submit 或 spark-shell 的标志,然后是 spark-defaults.conf 文件中的选项。

test.py 文件必须放置在整个集群中可见的某个位置。例如。 spark-submit --master yarn --deploy-mode cluster http://somewhere/accessible/to/master/and/workers/test.py

可以使用--py-files 参数指定任何其他文件和资源(不幸的是在mesos 中测试,而不是在yarn 中测试),例如--py-files http://somewhere/accessible/to/all/extra_python_code_my_code_uses.zip

编辑:正如@desertnaut 评论的那样,此参数应该在要执行的脚本之前使用。

yarn logs -applicationId <app ID> 将为您提供提交作业的输出。更多 here 和 here

希望这会有所帮助,祝你好运!

【讨论】:

好建议(+1,添加了文档链接和摘录)。只是要补充一点,命令行中的任何 --py-files 参数都应该放在要执行的脚本之前:***.com/questions/47101375/… @desertnaut 谢谢!编辑并在答案正文中添加了您的评论。

以上是关于Spark在本地运行但在YARN中运行时找不到文件的主要内容,如果未能解决你的问题,请参考以下文章

System.NullReferenceException 用于在 Windows 服务器 IIS 上运行但在 Visual Studio IIS Express 中运行时在本地运行的 .NET 服务

在终端中运行时找不到phpize命令[重复]

在 docker 容器中运行时找不到 curl 命令

想要运行在 windows 中制作的 kivy 应用程序,但在 mac os 中运行时显示错误

sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类

UITests 在组中运行时失败,但在独立运行时成功