【问题标题】:Google dataproc spark jobs failing with "Node was restarted while executing a job." messageGoogle dataproc 触发作业失败,并显示“节点在执行作业时已重新启动”。信息
【发布时间】:2017-07-13 07:58:29
【问题描述】:

我正在为各种 Spark 流作业运行多个 dataproc 集群。所有集群都配置为单节点。

最近(cca 10 天前)我开始在所有集群上遇到作业失败。每个作业运行大约。 3 天然后失败并显示相同的消息:

=========== Cloud Dataproc Agent Error ===========
com.google.cloud.hadoop.services.agent.AgentException: Node was restarted while executing a job. This could be user-initiated or caused by Compute Engine maintenance event. (TASK_FAILED)
at com.google.cloud.hadoop.services.agent.AgentException$Builder.build(AgentException.java:83)
at com.google.cloud.hadoop.services.agent.job.AbstractJobHandler.lambda$kill$0(AbstractJobHandler.java:211)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:211)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractTransformFuture$AsyncTransformFuture.doTransform(AbstractTransformFuture.java:200)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractTransformFuture.run(AbstractTransformFuture.java:130)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:435)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractFuture.executeListener(AbstractFuture.java:900)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractFuture.addListener(AbstractFuture.java:634)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractFuture$TrustedFuture.addListener(AbstractFuture.java:98)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.AbstractTransformFuture.create(AbstractTransformFuture.java:50)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.Futures.transformAsync(Futures.java:551)
at com.google.cloud.hadoop.services.agent.job.AbstractJobHandler.kill(AbstractJobHandler.java:202)
at com.google.cloud.hadoop.services.agent.job.JobManagerImpl.recoverAndKill(JobManagerImpl.java:145)
at com.google.cloud.hadoop.services.agent.MasterRequestReceiver$NormalWorkReceiver.receivedJob(MasterRequestReceiver.java:142)
at com.google.cloud.hadoop.services.agent.MasterRequestReceiver.pollForJobsAndTasks(MasterRequestReceiver.java:106)
at com.google.cloud.hadoop.services.agent.MasterRequestReceiver.pollForWork(MasterRequestReceiver.java:78)
at com.google.cloud.hadoop.services.agent.MasterRequestReceiver.lambda$doStart$0(MasterRequestReceiver.java:68)
at com.google.cloud.hadoop.services.repackaged.com.google.common.util.concurrent.MoreExecutors$ScheduledListeningDecorator$NeverSuccessfulListenableFutureTask.run(MoreExecutors.java:623)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
======== End of Cloud Dataproc Agent Error ========

这也是可以在日志中看到的最后一件事。 对于之前运行了 50 多天而没有出现问题的应用程序,这种情况开始发生,而无需对 spark 代码进行任何更改。

所有集群都位于全球区域 europe-west1-d 区域。 所有应用程序都是用 scala 编写的。

有人遇到过类似的事情吗?欢迎任何帮助。

【问题讨论】:

    标签: scala hadoop apache-spark spark-streaming google-cloud-dataproc


    【解决方案1】:

    由于您说这在过去几天内相当持久,我想知道您的输入数据是否发生了变化,以及在故障开始之前您的利用率是否接近 100%。

    由于 Compute Engine 虚拟机未配置交换分区,因此当您用完 RAM 时,所有守护程序都会崩溃并重新启动。

    要检查这一点,请通过 SSH 连接到 VM 并运行:

    sudo journalctl -u google-dataproc-agent

    输出中的某处应该是 JVM 崩溃标头。您也可以对其他 Hadoop 守护进程重复此操作,例如 hadoop-hdfs-namenode。它们应该几乎同时崩溃。

    我建议在集群上启用堆栈驱动程序监控 [1] 以获取一段时间内的 RAM 使用情况。如果我的理论得到验证,您可以尝试切换到您正在使用的机器类型的 highmem 变体或具有相同 CPU 但更多 RAM 的自定义 VM [2]。

    此外,如果您的作业使用带有 Checkpointing 的 Spark Streaming(或可以转换为它),那么请考虑使用 Dataproc Restartable Jobs [3]。发生此类崩溃后,Dataproc 将为您自动重新启动作业 [4]。

    [1]https://cloud.google.com/dataproc/docs/concepts/stackdriver-monitoring

    [2]https://cloud.google.com/dataproc/docs/concepts/custom-machine-types

    [3]https://cloud.google.com/dataproc/docs/concepts/restartable-jobs

    [4]How to restart Spark Streaming job from checkpoint on Dataproc?

    【讨论】:

    • 谢谢!查看 google-dataproc-agent 日志确实确认 java 内存不足。我会尝试更彻底地监控并查看它,也许它是火花应用程序中的某种内存泄漏。至于stackdriver监控,我已经在用了,但是好像不支持监控RAM使用,或者我漏掉了什么。
    • 感谢您提出这个问题。我们将研究为什么没有报告 RAM 使用情况。
    • 我还注意到所有使用映像版本 1.1.34 失败的集群,但我也有一个使用版本 1.1.29 的旧集群,并且运行 60 多天没有问题.与此同时,我的集群继续失败,并且在运行 cca 3 天半后经常发生这种情况,无论它们正在处理的数据量如何。
    • 由于我需要更多输入来深入研究,因此将对话切换到“cloud-dataproc-discuss”线程。
    【解决方案2】:

    这与图像版本 1.1.34 中的错误有关。降级到映像 1.1.29 并解决了该问题。

    要使用映像 1.1.29 创建集群,请使用 --image-version 1.1.29

    更多信息请参考https://groups.google.com/forum/#!topic/cloud-dataproc-discuss/H5Dy2vmGZ8I

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多