我有一个远程运行的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错误网关,因为它将斜杠作为路径组件分隔符读取。并传入未限定的目录名,如
GET https://jm-host:8081/jobs/:jobid/cancel-with-savepoint/target-directory/my-awesome-job-savepoints不会将my-awesome-job-savepoints解析为远程持久性位置的子目录(即使设置了state.savepoints.dir配置键),而是尝试创建REST service my-awesome-job-savepoints应用程序的当前工作目录的Java子目录。
我尝试过对完全限定的持久性路径进行URL编码,但这没有帮助。有没有办法通过REST API将这个完全限定的路径传递给Job Manager?(出于这个问题的目的,假设不可能使用bin/flink -m jm-host:8081。)
发布于 2017-09-20 05:42:50
请确保按照RFC 3986使用百分号编码对目标目录进行仔细编码。
例如,对于编码为s3%3A%2F%2F%2Fsavepoint-bucket%2Fmy-awesome-job的目录s3:///savepoint-bucket/my-awesome-job,我可以提交以下网址: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-jobhttps://stackoverflow.com/questions/45844298
复制相似问题