Seatunnel源码解析(6) -SparkLauncher启动SeatunnelSpark应用
需求
公司在使用Seatunnel的过程中,规划将Seatunnel集成在平台中,提供可视化操作。
因此目前有如下几个相关的需求:
- 可以通过Web接口,传递参数,启动一个Seatunnel应用
- 可以自定义日志,收集相关指标,目前想到的包括:应用的入流量、出流量;启动时间、结束时间等
- 在任务结束后,可以用applicationId自动从yarn上收集日志(一是手动收集太麻烦,二是时间稍长日志就没了)
材料
- Seatunnel:2.0.5
目前官方2版本还没有正式发布,只能自己下载源码编译。
从Github下载官方源码,clone到本地Idea
github:https://github.com/apache/incubator-seatunnel
官方地址:http://seatunnel.incubator.apache.org/
Idea下方Terminal命令行里,maven打包,执行:mvn clean install -Dmaven.test.skip=true
打包过程大约十几分钟,执行结束后,seatunnel-dist模块的target目录下,可以找到打好包的*.tar.gz压缩安装包
- Spark:2.4.8
- Hadoop:2.7
任意门
Seatunnel源码解析(1)-启动应用
Seatunnel源码解析(2)-加载配置文件
Seatunnel源码解析(3)-加载插件
Seatunnel源码解析(4) -启动Spark/Flink程序
Seatunnel源码解析(5)-修改启动LOGO
导读
本章修改源代码,实现修改应用配置传递方式,封装SparkLauncher,使用JavaApi启动Seatunnel-Spark应用
修改配置解析加载方式
- 自定义插件配置格式如下:
module:plugin:key=value
module:env、source、transform、sink
样例:
- env:spark:app.name=seatunnel
- source:Fake:result_table=source
- transform:sql:sql=select id,name from source where age=20
- sink:Console:limit=10
- sink:Console
- module下没有插件时,不需要写该module
- 将传入的配置文件,解析组织成如下Java数据格式
Map<String, Object> configMap = new HashMap<>();
Map<String, Object> envMap = new HashMap<>();
List<Map<String, Object>> sourceList = new ArrayList<>();
List<Map<String, Object>> transformList = new ArrayList<>();
List<Map<String, Object>> sinkList = new ArrayList<>();
configMap.put("env", envMap);
configMap.put("source", envMap);
configMap.put("transform", envMap);
configMap.put("sink", envMap);
- 解析参数
public class CommandMapArgs extends CommandLineArgs{
private Map<String, Object> envMap;
private List<Map<String, Object>> sourceList;
private List<Map<String, Object>> transformList;
private List<Map<String, Object>> sinkList;
public CommandMapArgs(String deployMode, String configFile, boolean testConfig) {
super(deployMode, configFile, testConfig);
}
public CommandMapArgs(String[] args){
super(DeployMode.CLIENT.getName(), "", false);
List<ConfigLine> configLines = Arrays.stream(args)
.map(this::parseConfigLine)
.collect(Collectors.toList());
envMap = initEnvConfig(configLines);
sourceList = initPluginConfig("source", configLines);
transformList = initPluginConfig("transform", configLines);
sinkList = initPluginConfig("sink", configLines);
}
public Map<String, Object> initEnvConfig(List<ConfigLine> configLines){
List<ConfigLine> moduleConfigLines = configLines.