我有远程运行的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
。)
答案 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