通过 "Scheduler for PCF" 安排的作业因 OutOfMemoryError 而失败

Jobs scheduled through "Scheduler for PCF" fail with OutOfMemoryError

我正在推送配置了 3g 内存的批处理应用程序,

applications:
- name: batch-app
memory: 3G
services:
    - scheduler
buildpack: java_buildpack

为批处理应用程序创建一个作业

cf create-job batch-app job-name ".java-buildpack/open_jdk_jre/bin/java org.springframework.boot.loader.JarLauncher"

然后按如下方式安排作业:

cf schedule-job job-name "30 * ? * *"

现在每个计划的作业执行都失败并出现以下错误:

2018-10-20 [APP/TASK/612f1b80] [OUT] Exit status 137 (out of memory)

相同的作业作为任务运行时会成功(即使内存少于清单中指定的内存):

cf run-task job-name ".java-buildpack/open_jdk_jre/bin/java org.springframework.boot.loader.JarLauncher" --name "manual" -m 2GB

我在这里错过了什么?

现在可以了。如果您使用的是 Scheduler 版本 1.2.33+,则 Scheduler API 支持计划作业以及为计划任务定义内存和磁盘限制的功能。

参见Release Notes

请注意,对于 Scheduler v1.2.33+,API 支持此功能,但相应版本的 cf cli 调度程序插件不支持。您至少需要 1.3 版的 cf cli 调度程序插件才能支持通过 cli 更改这些值。

您可以下载最新的cf cli插件from Tanzu Network here。然后用 cf install-plugin -f path/to/download/scheduler-for-pcf-cliplugin-macosx64-binary-1.4.0-build.2.

安装插件

安装最新的插件后,您可以创建作业并使用 --memory--disk 标志设置限制。

例如:

cf create-job smallest-app say-hi 'echo "Hello World!"' --disk 512M --memory 128M

之后,您可以运行 cf run-job example 查看入队作业。您也可以像往常一样使用 cf schedule-jobcf run-job


我相信较新的调度程序 cf cli 插件应该也适用于 1.2.33+ 版本,但如果您遇到问题。这个使用 curl 发送请求的过程应该仍然有效。

这是安排作业的命令,详见 https://docs.pivotal.io/scheduler/1-2/api/#create-job:

curl -i -X POST https://scheduler.run.example.com/jobs?app_guid=$(cf app your-app --guid) \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  -H "Authorization: $(cf oauth-token)" \
  -d "{ \
      \"command\": \"echo 'hi'\", \
      \"disk_in_mb\": 1024, \
      \"memory_in_mb\": 1024, \
      \"name\": \"example\" \
     }"

其中 https://scheduler.run.example.com 是您的调度程序的位置。这分解为 https://scheduler.<system-domain>,其中 system-domain 是安装基础的域。

如果您 运行 cf api,您将看到 API URL。系统域是https://api..

之后的部分

例如:

$ cf api
api endpoint:   https://api.run.example.com
api version:    2.145.0

在此示例中,“run.example.com”是我的系统域,因此 https://scheduler.run.example.com 将是我的调度程序 URL。


如果您使用的是1.2.33之前的Scheduler版本,则不可以。旧版本的调度程序不支持自定义内存或磁盘设置。不幸的是,计划的作业也不使用应用程序的内存限制。它使用您基础上设置的默认内存限制,如果您不设置内存限制,通常是 1G。

您可以通过多种方式解决此问题。

  • 您可以增加平台的默认内存限制。这显然会影响平台上依赖默认设置的其他人。
  • 您可以推送一个简单包装批处理作业的网络应用程序。然后您可以使用调度程序的调用 API 让调度程序在给定的时间间隔内调用 URL。 https://docs.pivotal.io/pcf-scheduler/1-2/using-calls.html。这有一些额外工作的缺点。

您可能还会发现这些 API docs 很方便。