如何检查作业在 Google 数据流上被杀死的原因(可能 OOM)
How to check why job gets killed on Google Dataflow ( possible OOM )
我有一个简单的任务。我有一堆文件 ( ~100GB in total )
,每一行代表一个实体。我必须将这个实体发送到 JanusGraph 服务器。
2018-07-07_05_10_46-8497016571919684639 <- job id
过了一会儿,我遇到了 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:
从 stackdriver 视图,我可以看到: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
我如何调试正在发生的事情?
目前调试问题的信息太少,因此我提供有关 Dataflow 的一般信息。
- 我找到日志最直观的方法是 Google Cloud Console -> Dataflow -> Select
name
感兴趣的 -> 右上角(错误 +日志)。
- 描述了有关监视的更多详细信息here(处于测试阶段)。
- 描述了对管道进行故障排除的一些基本线索,以及最常见的错误消息here。
如果您无法解决问题,请使用错误信息更新 post。
更新
根据超时错误和您分享的信息,我认为您的工作是 "shuffle-bound" 内存耗尽。根据 this guide:
Consider one of, or a combination of, the following courses of action:
- Add more workers. Try setting --numWorkers with a higher value when you run your pipeline.
- Increase the size of the attached disk for workers. Try setting --diskSizeGb with a higher value when you run your pipeline.
- Use an SSD-backed persistent disk. Try setting --workerDiskType="compute.googleapis.com/projects//zones//diskTypes/pd-ssd"
when you run your pipeline.
更新 2
对于特定的 OOM 错误,您可以使用:
- --dumpHeapOnOOM 会导致 JVM 因 OOM 崩溃时将堆转储保存在本地。
--saveHeapDumpsToGcsPath=gs://<path_to_a_gcs_bucket>
将导致堆转储在下次 worker 重启时上传到配置的 GCS 路径。这使得下载转储文件以供检查变得容易。确保作业所在的帐户 运行 对存储桶具有写入权限。
请注意,堆转储支持会产生一些开销成本并且转储可能非常大。这些标志应仅用于调试目的,并且始终对生产作业禁用。
在 DataflowPipelineDebugOptions methods 上查找其他参考文献。
更新 3
我没有找到关于此的 public 文档,但我测试了 Dataflow 使用机器类型 (workerMachineType
) 缩放 heap JVM size
,这也可以解决您的问题。我在 GCP 支持部门工作,因此我提交了两个文档请求(一个用于描述页面,另一个用于数据流故障排除页面)以更新文档以介绍此信息。
另一方面,this related feature request 可能对您有用。为其添加星标以使其更显眼。
我有一个简单的任务。我有一堆文件 ( ~100GB in total )
,每一行代表一个实体。我必须将这个实体发送到 JanusGraph 服务器。
2018-07-07_05_10_46-8497016571919684639 <- job id
过了一会儿,我遇到了 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:
从 stackdriver 视图,我可以看到: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
我如何调试正在发生的事情?
目前调试问题的信息太少,因此我提供有关 Dataflow 的一般信息。
- 我找到日志最直观的方法是 Google Cloud Console -> Dataflow -> Select
name
感兴趣的 -> 右上角(错误 +日志)。 - 描述了有关监视的更多详细信息here(处于测试阶段)。
- 描述了对管道进行故障排除的一些基本线索,以及最常见的错误消息here。
如果您无法解决问题,请使用错误信息更新 post。
更新
根据超时错误和您分享的信息,我认为您的工作是 "shuffle-bound" 内存耗尽。根据 this guide:
Consider one of, or a combination of, the following courses of action:
- Add more workers. Try setting --numWorkers with a higher value when you run your pipeline.
- Increase the size of the attached disk for workers. Try setting --diskSizeGb with a higher value when you run your pipeline.
- Use an SSD-backed persistent disk. Try setting --workerDiskType="compute.googleapis.com/projects//zones//diskTypes/pd-ssd" when you run your pipeline.
更新 2
对于特定的 OOM 错误,您可以使用:
- --dumpHeapOnOOM 会导致 JVM 因 OOM 崩溃时将堆转储保存在本地。
--saveHeapDumpsToGcsPath=gs://<path_to_a_gcs_bucket>
将导致堆转储在下次 worker 重启时上传到配置的 GCS 路径。这使得下载转储文件以供检查变得容易。确保作业所在的帐户 运行 对存储桶具有写入权限。
请注意,堆转储支持会产生一些开销成本并且转储可能非常大。这些标志应仅用于调试目的,并且始终对生产作业禁用。
在 DataflowPipelineDebugOptions methods 上查找其他参考文献。
更新 3
我没有找到关于此的 public 文档,但我测试了 Dataflow 使用机器类型 (workerMachineType
) 缩放 heap JVM size
,这也可以解决您的问题。我在 GCP 支持部门工作,因此我提交了两个文档请求(一个用于描述页面,另一个用于数据流故障排除页面)以更新文档以介绍此信息。
另一方面,this related feature request 可能对您有用。为其添加星标以使其更显眼。