Seatunnel源码解析(2)-加载配置文件
需求
公司在使用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
导读
本章将从源码角度,解读Seatunnel如何加载解析配置文件
进一步,尝试修改源码,修改配置文件加载方式,通过内存数据Map加载配置文件
解析封装命令行参数
public class SeatunnelSpark {
public static void main(String[] args) throws Exception {
//sparkconf =
// --conf "spark.app.name=SeaTunnel"
//--conf "spark.executor.memory=1g"
//--conf "spark.executor.cores=1"
//--conf "spark.executor.instances=2"
//JarDepOpts =
//FilesDepOpts =
//assemblyJarName = /opt/seatunnel/lib/seatunnel-core-spark.jar
//CMD_ARGUMENTS =
//--master yarn
//--deploy-mode client
//--config example/spark.batch.conf
CommandLineArgs sparkArgs = CommandLineUtils.parseSparkArgs(args);
Seatunnel.run(sparkArgs, SPARK);
}
}
创建配置类
命令行参数–conf的值,经过解析、封装、传递,在ConfigBuilder类中加载配置文件
public class Seatunnel {
private static final Logger LOGGER = LoggerFactory.getLogger(Seatunnel.class);
public static void run(CommandLineArgs commandLineArgs, Engine engine) throws Exception {
String configFilePath = getConfigFilePath(commandLineArgs, engine);
LOGGER.info("Seatunnel.run.self.configFilePath:" + configFilePath);
...
entryPoint(configFilePath, engine);
...
}
private static void entryPoint(String configFile, Engine engine) throws Exception {
ConfigBuilder configBuilder = new ConfigBuilder(configFile, engine);
...
}
...
}
看ConfigBuilder的构造函数,configFile是–conf传入的配置文件的路径,engine是由启动脚本和入口程序确定的Spark/Flink
- load():函数加载、解析、封装配置文件
- createEnv():创建Spark/Flink对应的执行环境对象
- new ConfigPackage(engine.getEngine()):按照包命名规则,拼接可能用到的包的引用路径
public class ConfigBuilder {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigBuilder.class);
private static final String PLUGIN_NAME_KEY = "plugin_name";
private final String configFile;
private final Engine engine;
private ConfigPackage configPackage;
private final Config config;
private boolean streaming;
private Config envConfig;
private final RuntimeEnv env;
public ConfigBuilder(String configFile, Engine engine) {
this.configFile = configFile;
this.engine = engine;
// 根据配置文件路径,加载解析配置文件
this.config = load();
// 根据配置文件,创建对应的执行环境
this.env = createEnv();
// 根据对应的执行引擎,按照包命名规则,拼接包引用路径
this.configPackage = new ConfigPackage(engine.getEngine());
}
}
加载、解析配置文件 - load()
根据configFile(.conf文件的路径),最终生成Config对象
public class ConfigBuilder {
private Config load() {
...
// config/example/spark.batch.conf
LOGGER.info("Loading config file: {}", configFile);
Config config = ConfigFactory
.parseFile(new File(configFile))
.resolve(ConfigResolveOptions.defaults().setAllowUnresolved(true))
.resolveWith(ConfigFactory.systemProperties()