【问题标题】:Spark on Google's Dataproc failed due to java.io.FileNotFoundException: /hadoop/yarn/nm-local-dir/usercache/root/appcache/由于 java.io.FileNotFoundException,Google 的 Dataproc 上的 Spark 失败:/hadoop/yarn/nm-local-dir/usercache/root/appcache/
【发布时间】:2018-07-08 06:58:02
【问题描述】:

几个月来我一直在通过 Zeppelin 和 Dataproc 控制台在 Dataproc 上使用 Spark/Hadoop,但最近我遇到了以下错误。

Caused by: java.io.FileNotFoundException: /hadoop/yarn/nm-local-dir/usercache/root/appcache/application_1530998908050_0001/blockmgr-9d6a2308-0d52-40f5-8ef3-0abce2083a9c/21/temp_shuffle_3f65e1ca-ba48-4cb0-a2ae-7a81dcdcf466 (No such file or directory)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at org.apache.spark.storage.DiskBlockObjectWriter.initialize(DiskBlockObjectWriter.scala:103)
at org.apache.spark.storage.DiskBlockObjectWriter.open(DiskBlockObjectWriter.scala:116)
at org.apache.spark.storage.DiskBlockObjectWriter.write(DiskBlockObjectWriter.scala:237)
at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:151)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
at org.apache.spark.scheduler.Task.run(Task.scala:108)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338)
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)

首先,我在 Zeppelin 笔记本上遇到这种类型的错误,并认为是 Zeppelin 问题。然而,这个错误似乎是随机发生的。我怀疑这与其中一个 Spark 工作人员无法在该路径中写入有关。所以,我用谷歌搜索并被建议删除每个 Spark 工作人员上 /hadoop/yarn/nm-local-dir/usercache/ 下的文件,并检查每个工作人员上是否有可用的磁盘空间。这样做后,我有时仍然会出现此错误。我还在 Dataproc 上运行了 Spark 作业,也发生了类似的错误。我使用的是 Dataproc 映像版本 1.2。

谢谢

Peeranat F.

【问题讨论】:

    标签: apache-spark hadoop google-cloud-storage google-cloud-dataproc


    【解决方案1】:

    好的。我们在 GCP 上遇到了同样的问题,原因是资源抢占。

    在 GCP 中,资源抢占可以通过以下两种策略来完成,

    1. 节点抢占 - 删除集群中的节点并替换它们
    2. 容器抢占 - 删除纱线容器。

    此设置由您的管理员/开发人员在 GCP 中完成,以优化集群的成本和资源利用率,特别是在共享集群时。

    你的堆栈跟踪告诉我的是它的节点抢占。此错误随机发生,因为有时被抢占的节点是您的驱动程序节点,导致应用程序一起失败。

    您可以在 GCP 控制台中查看哪些节点是可抢占的。

    【讨论】:

    • 感谢您的回复。我决定迁移到 Dataproc 1.3,但不幸的是,在显示 hive 数据库中的内容时遇到了另一个问题。我想知道你以前是否遇到过这个问题。详情可以在这里找到stackoverflow.com/questions/51243742/…
    • 看看其他问题
    • 谢谢。终于找到了解决这个问题的办法。
    【解决方案2】:

    以下可能是其他可能的原因:

    • 集群使用抢占式工作器(可以随时删除),因此它们的工作没有完成,可能会导致行为不一致。
    • 在 spark 作业执行期间节点中存在大小调整,导致重新启动任务/容器/执行程序。
    • 内存问题。 shuffle 操作通常在内存中完成,但如果超出内存资源,会spill over to disk
    • 由于大量 shuffle 操作或任何其他在工作器上使用磁盘的进程(例如日志),工作器中的磁盘空间已满。
    • 纱线杀死任务到make room for failed attempts

    因此,我总结了以下操作作为可能的解决方法:

    1.- 增加worker和master的内存,如果你遇到内存问题,这将被丢弃。

    2.- 更改 Dataproc 的 image version

    3.- 更改集群属性以调整您的集群,尤其是针对 mapreducespark

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2019-01-21
      • 2015-12-21
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多