通过 "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 支持计划作业以及为计划任务定义内存和磁盘限制的功能。
请注意,对于 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-job
或 cf 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 很方便。
我正在推送配置了 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 支持计划作业以及为计划任务定义内存和磁盘限制的功能。
请注意,对于 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-job
或 cf 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 很方便。