使用REST监控API将Flink作业管理器发送到保存点目录的完全限定路径

时间:2017-08-23 15:50:11

标签: apache-flink

我有远程运行的Flink作业管理器,并使用REST Monitoring API来安排作业。

Flink启用了保存点,以便我可以中断正在运行的作业并从保存的状态恢复它。保存点数据的持久性位置应该在作业管理器外部(例如,我可以重新配置并重新启动作业管理器并恢复作业),例如HDFS卷或S3存储桶。可以使用state.savepoints.dir配置键在作业管理器上全局配置此持久性位置,但也可以使用中断命令传入该位置:

# When job manager is running locally
$ bin/flink cancel -s s3:///savepoint-bucket/my-awesome-job <jobID>

远程运行时,相应的REST请求将是

GET https://jm-host:8081/jobs/:jobid/cancel-with-savepoint/target-directory/s3:///savepoint-bucket/my-awesome-job-savepoints

但是,REST处理程序无法处理此请求 - 它返回502 BAD GATEWAY,因为它将斜杠作为路径组件分隔符读取。并传入一个不合格的目录名称,如

GET https://jm-host:8081/jobs/:jobid/cancel-with-savepoint/target-directory/my-awesome-job-savepoints

不会将my-awesome-job-savepoints解析为远程持久性位置的子目录(即使设置了state.savepoints.dir配置密钥),而是尝试创建当前工作的my-awesome-job-savepoints子目录REST服务Java应用程序的目录。

我已尝试对完全限定的持久性路径进行URL编码,但这没有用。有没有办法通过REST API将这个完全限定的路径传递给作业管理器? (为了这个问题的目的,假设不可能使用bin/flink -m jm-host:8081。)

1 个答案:

答案 0 :(得分:2)

请务必使用百分比编码仔细编码目标目录,按RFC 3986

例如,给定编码为s3:///savepoint-bucket/my-awesome-job的目录s3%3A%2F%2F%2Fsavepoint-bucket%2Fmy-awesome-job,我能够提交以下URL: http://localhost:8081/jobs/5c360ded6e4b7d8db103e71d68b7c83d/cancel-with-savepoint/target-directory/s3%3A%2F%2F%2Fsavepoint-bucket%2Fmy-awesome-job

在日志中查看以下内容: 2017-09-19 14:27:45,939 INFO org.apache.flink.runtime.jobmanager.JobManager - Trying to cancel job 5c360ded6e4b7d8db103e71d68b7c83d with savepoint to s3:///savepoint-bucket/my-awesome-job