记录使用flink-streaming-platform-web平台化提交Flink任务。主要是记录通过这个工具提交flink任务的原理。
相关参考:
gitee地址:flink-streaming-platform-web: 基于flink-sql的实时流计算web平台
github地址:https://github.com/zhp8341/flink-streaming-platform-web
可以查看:docs/idea-run.md · 无情(朱慧培)/flink-streaming-platform-web - Gitee.com
真正用来提交任务的是flink-streamin-core下面的com.flink.streaming.core.JobApplication类。通过这个来创建flink任务所需要的执行环境以及解析我们需要提交的sql脚本等参数。
例如:这里通过args来获取sql脚本所在的位置。
注意:本地调试需要修改pom.xml中的scope。
由于尚未配置flink on yarn的环境,这里以Standalone模式为例:
通过前端页面来配置Flink环境的相关信息,这些信息都被记录在数据库当中。
当点击保存页面的时候,这些参数会保存在job_config表中,如下,包括我们所写的SQL也会是mediumtext的格式保存下来。
当点击提交任务,会进入到JobStandaloneServerAOImpl.star(...)方法。在这里做了如下事情:
public void start(Long id, Long savepointId, String userName) {
JobConfigDTO jobConfigDTO = jobConfigService.getJobConfigById(id);
//1、检查jobConfigDTO 状态等参数
jobBaseServiceAO.checkStart(jobConfigDTO);
// TODO 要不要检查集群上任务是否存在
//2、将配置的sql 写入本地文件并且返回运行所需参数
JobRunParamDTO jobRunParamDTO = jobBaseServiceAO.writeSqlToFile(jobConfigDTO);
//3、插一条运行日志数据
Long jobRunLogId = jobBaseServiceAO.insertJobRunLog(jobConfigDTO, userName);
//4、变更任务状态(变更为:启动中) 有乐观锁 防止重复提交
jobConfigService.updateStatusByStart(jobConfigDTO.getId(), userName, jobRunLogId, jobConfigDTO.getVersion());
String savepointPath = savepointBackupService.getSavepointPathById(id, savepointId);
//异步提交任务
jobBaseServiceAO.aSyncExecJob(jobRunParamDTO, jobConfigDTO, jobRunLogId, savepointPath);
}
public void aSyncExecJob(JobRunParamDTO jobRunParamDTO, JobConfigDTO jobConfigDTO,
Long jobRunLogId, String savepointPath){
//1、构建执行命令
command = CommandUtil.buildRunCommandForCluster(jobRunParamDTO, jobConfigDTO, savepointPath);
//2、提交任务
appId = this.submitJobForStandalone(command, jobConfigDTO, localLog);
//3、修改任务状态
this.updateStatusAndLog(jobConfigDTO, jobRunLogId, jobStatus, localLog.toString(), appId);
}
上面异步提交任务的四个参数:
在jobBaseServiceAO.aSyncExecJob(...)方法中最主要的是以上三行,构建执行命令,提交任务,修改任务状态。
1、构建执行命令具体可以查看CommandUtil.buildRunCommandForCluster(...)方法。如下,可以构成一条完整的执行命令并返回。
/opt/module/flink-1.13.2/bin/flink run -d -c com.flink.streaming.core.JobApplication /opt/module/flink-streaming-platform-web/lib/flink-streaming-core-1.3.0.RELEASE.jar -sql /opt/module/flink-streaming-platform-web/sql/job_sql_2.sql -type 0
2、命令提交,主要下面的commandRpcClinetAdapter.submitJob(...)方法。如下,是通过Runtime.getRuntime().exec(command)方法来提交
appId = this.submitJobForStandalone(command, jobConfigDTO, localLog);
String appId = commandRpcClinetAdapter.submitJob(command, localLog, jobRunLogId, jobConfig.getDeployModeEnum());
JobStandaloneInfo jobStandaloneInfo = flinkRestRpcAdapter.getJobInfoForStandaloneByAppId(appId,
jobConfig.getDeployModeEnum());
3、由上所述,最终是执行了条如下命令:
/opt/module/flink-1.13.2/bin/flink run -d -c com.flink.streaming.core.JobApplication /opt/module/flink-streaming-platform-web/lib/flink-streaming-core-1.3.0.RELEASE.jar -sql /opt/module/flink-streaming-platform-web/sql/job_sql_2.sql -type 0
这里最终是通过命令行的方式提交了JobApplication这个class。最后可以从1、idea本地开发查看其执行流程。