文章目录
说明
- 目标:走读Flink Clint中Upload jar、Run jar相关代码
- 源码版本:1.6.1
- 部属模式:Standalone
- 相关知识点:Netty、 CompletedFuture
启动ResetServer
RestServerEndpoint.start
注册Handler
代码From DispatcherRestEndpoint.java
protected List<Tuple2<RestHandlerSpecification, ChannelInboundHandler>> initializeHandlers(CompletableFuture<String> restAddressFuture) {
List<Tuple2<RestHandlerSpecification, ChannelInboundHandler>> handlers = super.initializeHandlers(restAddressFuture);
...
JobSubmitHandler jobSubmitHandler = new JobSubmitHandler(
restAddressFuture,
leaderRetriever,
timeout,
responseHeaders,
executor,
clusterConfiguration);
if (clusterConfiguration.getBoolean(WebOptions.SUBMIT_ENABLE)) {
try {
// 此处注册了JAR Upload和Run的处理方法
webSubmissionExtension = WebMonitorUtils.loadWebSubmissionExtension(
leaderRetriever,
restAddressFuture,
timeout,
responseHeaders,
uploadDir,
executor,
clusterConfiguration);
// register extension handlers
handlers.addAll(webSubmissionExtension.getHandlers());
} catch (FlinkException e) {
...
}
} else {
log.info("Web-based job submission is not enabled.");
}
...
return handlers;
}
在WebSubmissionExtension中,可以看到定义了Upload、Run、List、Delete、Plan的Handler
Upload JAR
处理代码在JarUploadHandler的handleRequest方法中。
Jar包存放路径:
jarDir.resolve(UUID.randomUUID() + "_" + fileUpload.getFileName());
方法本身逻辑简单,比较隐蔽的是jarDir的值。通过倒推寻找该值的赋值过程。
- JarUploadHandler 构造时赋值属性jarDir;
- JarUploadHandler由WebSubmissionExtension通过WebMonitorUtils.loadWebSubmissionExtension构造,jarDir源自父类RestServerEndpoint中的变量uploadDir;
- RestServerEndpoint中uploadDir通过configuration.getUploadDir()初始化
- 在RestServerEndpointConfiguration中找到了源头:
final Path uploadDir = Paths.get( config.getString(WebOptions.UPLOAD_DIR, config.getString(WebOptions