【问题标题】:Spark Job running on Yarn Cluster java.io.FileNotFoundException: File does not exits , eventhough the file exits on the master node在 Yarn Cluster java.io.FileNotFoundException 上运行的 Spark 作业:文件不存在,即使文件在主节点上退出
【发布时间】:2016-08-13 16:58:12
【问题描述】:

我对 Spark 还很陌生。我尝试搜索,但找不到合适的解决方案。我已经在两个盒子(一个主节点和另一个工作节点)上安装了 hadoop 2.7.2 我已经按照以下链接设置了集群http://javadev.org/docs/hadoop/centos/6/installation/multi-node-installation-on-centos-6-non-sucure-mode/ 我以 root 用户身份运行 hadoop 和 spark 应用程序来测试集群。

我已经在主节点上安装了 spark 并且 spark 正在启动,没有任何错误。但是,当我使用 spark submit 提交作业时,我收到 File Not Found 异常,即使该文件存在于错误中相同位置的主节点中。我在 Spark Submit 命令下执行,请在下面找到日志输出命令。

/bin/spark-submit  --class com.test.Engine  --master yarn --deploy-mode      cluster /app/spark-test.jar
16/04/21 19:16:13 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... 在适用的情况下使用内置 java 类 16/04/21 19:16:13 信息 RMProxy:在 /0.0.0.0:8032 连接到 ResourceManager 21 年 16 月 4 日 19:16:14 信息客户端:从具有 1 个节点管理器的集群请求新应用程序 16/04/21 19:16:14 INFO 客户端:验证我们的应用程序请求的内存容量不超过集群的最大内存容量(每个容器 8192 MB) 16/04/21 19:16:14 INFO 客户端:将分配 AM 容器,内存为 1408 MB,包括 384 MB 开销 16/04/21 19:16:14 INFO 客户端:为我们的 AM 设置容器启动上下文 16/04/21 19:16:14 INFO 客户端:为我们的 AM 容器设置启动环境 16/04/21 19:16:14 INFO 客户:为我们的 AM 容器准备资源 16/04/21 19:16:14 INFO 客户端:源文件系统和目标文件系统相同。不复制文件:/mi/spark/lib/spark-assembly-1.6.1-hadoop2.6.0.jar 16/04/21 19:16:14 INFO 客户端:源文件系统和目标文件系统相同。不复制文件:/app/spark-test.jar 16/04/21 19:16:14 INFO 客户端:源文件系统和目标文件系统相同。不复制文件:/tmp/spark-120aeddc-0f87-4411-9400-22ba01096249/__spark_conf__5619348744221830008.zip 16/04/21 19:16:14 INFO SecurityManager:将视图 acls 更改为:root 16/04/21 19:16:14 INFO SecurityManager:将修改 acls 更改为:root 21 年 16 月 4 日 19:16:14 信息安全管理器:安全管理器:身份验证已禁用; ui acls 禁用;具有查看权限的用户:Set(root);具有修改权限的用户:Set(root) 16/04/21 19:16:15 INFO 客户端:将应用程序 1 提交给 ResourceManager 16/04/21 19:16:15 INFO YarnClientImpl: 提交申请 application_1461246306015_0001 16/04/21 19:16:16 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:已接受) 16/04/21 19:16:16 信息客户: 客户令牌:不适用 诊断:不适用 ApplicationMaster 主机:不适用 ApplicationMaster RPC 端口:-1 队列:默认 开始时间:1461246375622 最终状态:UNDEFINEDsparkcluster01.testing.com 跟踪网址:http://sparkcluster01.testing.com:8088/proxy/application_1461246306015_0001/ 用户:根 16/04/21 19:16:17 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:已接受) 16/04/21 19:16:18 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:已接受) 16/04/21 19:16:19 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:已接受) 16/04/21 19:16:20 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:已接受) 16/04/21 19:16:21 INFO 客户端:application_1461246306015_0001 的应用程序报告(状态:失败) 16/04/21 19:16:21 信息客户: 客户令牌:不适用 诊断:应用程序 application_1461246306015_0001 失败 2 次,原因是应用程序尝试_1461246306015_0001_000002 的 AM 容器以 exitCode 退出:-1000 有关更详细的输出,请查看应用程序跟踪页面:http://sparkcluster01.testing.com:8088/cluster/app/application_1461246306015_0001然后,单击指向每次尝试日志的链接。 诊断:java.io.FileNotFoundException:文件文件:/app/spark-test.jar 不存在 这次尝试失败。申请失败。 ApplicationMaster 主机:不适用 ApplicationMaster RPC 端口:-1 队列:默认 开始时间:1461246375622 最终状态:失败 跟踪网址:http://sparkcluster01.testing.com:8088/cluster/app/application_1461246306015_0001 用户:根 线程“主”org.ap/app/spark-test.jarache.spark.SparkException 中的异常:应用程序 application_1461246306015_0001 以失败状态完成 在 org.apache.spark.deploy.yarn.Client.run(Client.scala:1034) 在 org.apache.spark.deploy.yarn.Client$.main(Client.scala:1081) 在 org.apache.spark.deploy.yarn.Client.main(Client.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

我什至尝试通过将我的应用程序放在 HDFS 上并在 Spark Submit 命令中提供 HDFS 路径来在 HDFS 文件系统上运行 spark。即使这样,它也会在某些 Spark Conf 文件上引发 File Not Found Exception。我在 Spark Submit 命令下执行,请在命令下找到日志输出。

 ./bin/spark-submit  --class com.test.Engine  --master yarn --deploy-mode cluster hdfs://sparkcluster01.testing.com:9000/beacon/job/spark-test.jar
16/04/21 18:11:45 信息 RMProxy:在 /0.0.0.0:8032 连接到 ResourceManager 21 年 16 月 4 日 18:11:46 信息客户端:从具有 1 个节点管理器的集群请求新应用程序 16/04/21 18:11:46 INFO 客户端:验证我们的应用程序请求的内存容量不超过集群的最大内存容量(每个容器 8192 MB) 16/04/21 18:11:46 INFO 客户端:将分配 AM 容器,内存为 1408 MB,包括 384 MB 开销 16/04/21 18:11:46 INFO 客户端:为我们的 AM 设置容器启动上下文 16/04/21 18:11:46 INFO Client: 为我们的 AM 容器设置启动环境 16/04/21 18:11:46 INFO 客户:为我们的 AM 容器准备资源 16/04/21 18:11:46 INFO 客户端:源文件系统和目标文件系统相同。不复制文件:/mi/spark/lib/spark-assembly-1.6.1-hadoop2.6.0.jar 16/04/21 18:11:47 INFO 客户端:上传资源 hdfs://sparkcluster01.testing.com:9000/beacon/job/spark-test.jar -> 文件:/root/.sparkStaging/application_1461234217994_0017/spark-测试.jar 16/04/21 18:11:49 INFO 客户端:源文件系统和目标文件系统相同。不复制文件:/tmp/spark-f4eef3ac-2add-42f8-a204-be7959c26f21/__spark_conf__6818051470272245610.zip 16/04/21 18:11:50 INFO SecurityManager:将视图 acls 更改为:root 16/04/21 18:11:50 INFO SecurityManager:将修改 acls 更改为:root 21 年 16 月 4 日 18:11:50 信息安全管理器:安全管理器:身份验证已禁用; ui acls 禁用;具有查看权限的用户:Set(root);具有修改权限的用户:Set(root) 16/04/21 18:11:50 INFO 客户端:将应用程序 17 提交到 ResourceManager 16/04/21 18:11:50 INFO YarnClientImpl: 提交申请 application_1461234217994_0017 16/04/21 18:11:51 INFO 客户端:application_1461234217994_0017 的应用程序报告(状态:已接受) 16/04/21 18:11:51 信息客户: 客户令牌:不适用 诊断:不适用 ApplicationMaster 主机:不适用 ApplicationMaster RPC 端口:-1 队列:默认 开始时间:1461242510849 最终状态:未定义 跟踪网址:http://sparkcluster01.testing.com:8088/proxy/application_1461234217994_0017/ 用户:根 16/04/21 18:11:52 INFO 客户端:application_1461234217994_0017 的应用程序报告(状态:已接受) 16/04/21 18:11:53 INFO 客户端:application_1461234217994_0017 的应用程序报告(状态:已接受) 16/04/21 18:11:54 INFO 客户端:application_1461234217994_0017 的应用程序报告(状态:失败) 16/04/21 18:11:54 信息客户: 客户令牌:不适用 诊断:应用程序 application_1461234217994_0017 由于 AM Container for appattempt_1461234217994_0017_000002 退出 2 次,exitCode:-1000 有关更详细的输出,请查看应用程序跟踪页面:http://sparkcluster01.testing.com:8088/cluster/app/application_1461234217994_0017然后,单击指向每次尝试日志的链接。 诊断:文件文件:/tmp/spark-f4eef3ac-2add-42f8-a204-be7959c26f21/__spark_conf__6818051470272245610.zip 不存在 java.io.FileNotFoundException:文件文件:/tmp/spark-f4eef3ac-2add-42f8-a204-be7959c26f21/__spark_conf__6818051470272245610.zip 不存在 在 org.apache.hadoop.fs.RawLocalFileSystem.deprecatedGetFileStatus(RawLocalFileSystem.java:609) 在 org.apache.hadoop.fs.RawLocalFileSystem.getFileLinkStatusInternal(RawLocalFileSystem.java:822) 在 org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:599) 在 org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:421) 在 org.apache.hadoop.yarn.util.FSDownload.copy(FSDownload.java:253) 在 org.apache.hadoop.yarn.util.FSDownload.access$000(FSDownload.java:63) 在 org.apache.hadoop.yarn.util.FSDownload$2.run(FSDownload.java:361) 在 org.apache.hadoop.yarn.util.FSDownload$2.run(FSDownload.java:359) 在 java.security.AccessController.doPrivileged(本机方法) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) 在 org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:358) 在 org.apache.hadoop.yarn.util.FSDownload.call(FSDownload.java:62) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 这次尝试失败。申请失败。 ApplicationMaster 主机:不适用 ApplicationMaster RPC 端口:-1 队列:默认 开始时间:1461242510849 最终状态:失败 跟踪网址:http://sparkcluster01.testing.com:8088/cluster/app/application_1461234217994_0017 用户:根 线程“主”org.apache.spark.SparkException 中的异常:应用程序 application_1461234217994_0017 以失败状态完成 在 org.apache.spark.deploy.yarn.Client.run(Client.scala:1034) 在 org.apache.spark.deploy.yarn.Client$.main(Client.scala:1081) 在 org.apache.spark.deploy.yarn.Client.main(Client.scala) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) 在 org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 在 org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 在 org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 在 org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 16/04/21 18:11:55 INFO ShutdownHookManager:已调用关闭挂钩 16/04/21 18:11:55 INFO ShutdownHookManager:删除目录 /tmp/spark-f4eef3ac-2add-42f8-a204-be7959c26f21

【问题讨论】:

  • 很高兴您包含了所有这些信息,但火花代码本身对诊断问题没有用处吗?
  • @cricket_007 这个问题不是由 spark 代码引起的,因为即使我使用 Yarn 运行 spark shell 或任何 spark 示例本身,我也会收到相同的错误。例如:spark-shell --master yarn-client
  • 请添加您的纱线日志。你可以通过$ yarn logs -applicationId application_1461246306015_0001 得到它们
  • @ user1314742 ,我认为 spark 应用程序本身没有被执行。提交工作后,我很快就收到了这个例外。当我运行 yarn logs 命令时,它说该作业的日志聚合尚未开始。我认为这与我的 spark 和 hadoop 设置/配置有关。
  • @cricket_007 这就是 spark 打印文件位置的方式。我与错误无关。我的 hadoop 配置目录指向了导致此问题的错误位置。

标签: hadoop apache-spark hadoop-yarn spark-streaming


【解决方案1】:

当你在yarn cluster模式下运行时,本地文件应该放在所有节点中。因为,我们不知道哪个节点将成为 AM(Application Master)节点。您的应用程序总是从 AM 节点查找文件。

我遇到过一种情况,我必须在运行时将 KeyStore 和 KeyPass 密码保存在一个文件中,该文件由我的 spark 作业读取。我将 /opt 文件夹下的文件保存为 opt/datapipeline/config/keystorePass。但我的应用程序一直因 FileNotFoundException 而失败。

将keystorePass文件放入所有节点后,异常消失,作业成功。

其他方法是,将文件保存在 hdfs 文件系统而不是本地文件系统中

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,但问题与在 $HADOOP_CONF_DIR 和 $SPARK_HOME/conf 中有两个 core-site.xml 有关。当我删除 $SPARK_HOME/conf 下的那个时问题就消失了

    【讨论】:

      【解决方案3】:

      我在 EMR 上运行 Spark 时遇到了类似的错误。我已经用 Java 8 编写了我的 spark 代码,并且默认情况下,在 EMR 集群中 spark 在 Java 8 上运行。然后我必须使用指向 java 8 版本的 JAVA_HOME 重新创建集群。它解决了我的问题。请检查类似的行。

      【讨论】:

        【解决方案4】:

        spark 配置没有指向正确的 hadoop 配置目录。 2.7.2 的 hadoop 配置位于文件路径 hadoop 2.7.2./etc/hadoop/ 而不是 /root/hadoop2.7.2/conf。当我在 spark-env.sh 下指向 HADOOP_CONF_DIR=/root/hadoop2.7.2/etc/hadoop/ 时,火花提交开始工作并且找不到文件异常消失了。早些时候它指向 /root/hadoop2.7.2/conf (不退出)。如果 spark 没有指向正确的 hadoop 配置目录,它可能会导致类似的错误。我认为它可能是 spark 中的一个错误,它应该优雅地处理它而不是抛出模棱两可的错误消息。

        【讨论】:

        • 我有一个 hadoop-2.8.2,当我将 HADOOP_CONF_DIR 从 /etc/hadoop/conf 更改为 /etc/hadoop 时,出现了一些奇怪的异常并且应用程序无法启动。
        猜你喜欢
        • 2015-12-05
        • 2015-07-14
        • 1970-01-01
        • 2015-08-02
        • 2015-07-31
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 2015-04-25
        相关资源
        最近更新 更多