如何检查作业为何在 Google Dataflow 上被终止(可能 OOM)

Mic*_*hał 1 java google-cloud-dataflow tinkerpop3 apache-beam janusgraph

我有一个简单的任务。我有一堆文件( ~100GB in total ),每一行代表一个实体。我必须将此实体发送到 JanusGraph 服务器。

2018-07-07_05_10_46-8497016571919684639 <- job id
Run Code Online (Sandbox Code Playgroud)

一段时间后,我遇到 OOM,日志显示 Java 被杀死。

从数据流视图中,我可以看到以下日志:

Workflow failed. Causes: S01:TextIO.Read/Read+ParDo(Anonymous)+ParDo(JanusVertexConsumer) failed., A work item was attempted 4 times without success. Each time the worker eventually lost contact with the service. The work item was attempted on:

从堆栈驱动程序视图中,我可以看到: https: //www.dropbox.com/s/zvny7qwhl7hbwyw/Screenshot%202018-07-08%2010.05.33.png ?dl=0

日志显示: E Out of memory: Kill process 1180 (java) score 1100 or sacrifice child E Killed process 1180 (java) total-vm:4838044kB, anon-rss:383132kB, file-rss:0kB 更多信息请参见:https ://pastebin.com/raw/MftBwUxs

我怎样才能调试发生了什么?

Rub*_* C. 6

目前无法调试该问题的信息太少,因此我提供有关 Dataflow 的一般信息。

  1. 对我来说,查找日志最直观的方法是转到 Google Cloud Console -> 数据流 -> 选择name感兴趣的 -> 右上角(错误+日志)。
  2. 有关监控的更多详细信息请参见此处(处于测试阶段)。
  3. 此处描述了管道故障排除的一些基本线索以及最常见的错误消息。

如果您无法解决问题,请使用错误信息更新帖子。

更新

根据超出截止日期的错误和您共享的信息,我认为您的工作因内存耗尽而“受到洗牌”。根据本指南

考虑以下行动方案之一或组合:

  1. 添加更多工人。运行管道时,尝试将 --numWorkers 设置为更高的值。
  2. 增加工作人员附加磁盘的大小。运行管道时,尝试将 --diskSizeGb 设置为更高的值。
  3. 使用 SSD 支持的永久磁盘。运行管道时尝试设置 --workerDiskType="compute.googleapis.com/projects//zones//diskTypes/pd-ssd" 。

更新2

对于特定的 OOM 错误,您可以使用:

  • --dumpHeapOnOOM将在 JVM 由于 OOM 崩溃时在本地保存堆转储。
  • --saveHeapDumpsToGcsPath=gs://<path_to_a_gcs_bucket>将导致堆转储在下次工作进程重新启动时上传到配置的 GCS 路径。这使得下载转储文件进行检查变得容易。确保运行作业的帐户对存储桶具有写入权限。

请考虑到堆转储支持会产生一些开销,并且转储可能非常大。这些标志只能用于调试目的,并且对于生产作业始终禁用。

查找有关DataflowPipelineDebugOptions 方法的其他参考。

更新3

我没有找到与此相关的公共文档,但我测试了 Dataflowheap JVM size随机器类型 ( workerMachineType) 进行缩放,这也可以解决您的问题。我是 GCP 支持人员,因此我提交了两份文档请求(一份针对描述页面,另一份针对数据流故障排除页面)来更新文档以介绍此信息。

另一方面,您可能会发现这个相关的功能请求很有用。为其加注星标以使其更加明显。