Scala Google dataproc spark jobs因“失败”;节点在执行作业时重新启动;消息

Scala Google dataproc spark jobs因“失败”;节点在执行作业时重新启动;消息,scala,hadoop,apache-spark,spark-streaming,google-cloud-dataproc,Scala,Hadoop,Apache Spark,Spark Streaming,Google Cloud Dataproc,我正在为各种spark流作业运行多个dataproc集群。所有集群都配置为单个节点 最近(10天前),我开始体验所有集群上的工作失败。每个作业运行约3天,然后失败,并显示相同的消息: =========== Cloud Dataproc Agent Error =========== com.google.cloud.hadoop.services.agent.AgentException: Node was restarted while executing a job. This could

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

最近(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代码中没有任何更改的情况下开始出现

所有集群均位于全球区域的欧洲西部1-d区。 所有应用程序都是用scala编写的


有人经历过类似的事情吗?欢迎您提供任何帮助。

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

由于计算引擎VM不配置交换分区,当RAM用完时,所有守护进程都将崩溃并重新启动

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

sudo journalctl-u谷歌数据处理代理

输出中的某个地方应该是JVM崩溃头。您还可以对其他Hadoop守护进程重复此操作,如
Hadoop hdfs namenode
。它们应该大致同时崩溃

我建议在集群上启用stackdriver监控[1],以便随着时间的推移获得RAM使用情况。如果我的理论得到验证,您可以尝试切换到您正在使用的机器类型的
highmem
变体,或者使用相同CPU但更多RAM的自定义VM[2]

另外,如果您的作业使用检查点(或者可以转换为它)的火花流,那么考虑DATAPROC可重新启动的作业[3 ]。发生此类崩溃后,Dataproc将自动为您重新启动作业[4]

[1]

[2]

[3]


[4]

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

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


有关更多信息,请参阅:

谢谢!查看GoogleDataProc代理日志确实确认java内存不足。我将尝试更彻底地监视和查看它,可能是spark应用程序中的某种内存泄漏。至于stackdriver监控,我已经在使用它了,但是它似乎不支持对RAM使用的监控,或者我遗漏了一些东西。谢谢你提出这个问题。我们将研究为什么没有报告RAM使用情况。我还注意到,所有使用映像版本1.1.34失败的群集,但我还有一个使用版本1.1.29的旧群集,该群集在60多天内运行没有问题。与此同时,我的集群继续出现故障,在运行了3天半之后,无论它们处理的数据量有多大,这种情况都会定期发生。因为我需要更多的投入来深入了解这一点,所以将对话切换到“cloud dataproc Discussion”线程。