Seatunnel源码解析(4) - 启动Spark/Flink程序
需求
公司在使用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如何将创建好的Source、Transform、Sink插件,组织成一个完整的Spark/Flink应用,并提交执行
执行Spark/Flink应用
- entryPoint
public class Seatunnel {
...
private static void entryPoint(String configFile, Engine engine) throws Exception {
// 根据.conf配置文件的路径,加载解析配置,并封装成ConfigBuilder
ConfigBuilder configBuilder = new ConfigBuilder(configFile, engine);
// 通过ConfigBuilder,加载配置文件中指定的Source、Transform、Sink插件
List<BaseSource> sources = configBuilder.createPlugins(PluginType.SOURCE);
List<BaseTransform> transforms = configBuilder.createPlugins(PluginType.TRANSFORM);
List<BaseSink> sinks = configBuilder.createPlugins(PluginType.SINK);
// 通过ConfigBuilder,创建对应执行引擎(Spark/Flink)和执行模式(Batch/Flink)的执行器Execution
Execution execution = configBuilder.createExecution();
// 调用插件自定义的检查配置的逻辑
baseCheckConfig(sources, transforms, sinks);
// 调用插件自定义的插件执行的前置初始化逻辑
prepare(configBuilder.getEnv(), sources, transforms, sinks);
// 打印应用启动LOGO
showAsciiLogo();
// Execution提交Spark/Flink应用
execution.start(sources, transforms, sinks);
}
}
- Execuion接口
Execution接口,提供一个start()方法,用来启动一个具体的Seatunnel的job(Spark/Flink)
start()方法中定义了具体的source读取数据,transform转换数据,sink写数据的流程,即一个完整的的Spark/Flink代码流程
Execution接口,继承Plugin接口,有5个实现类
/**
* the SeaTunnel job's execution context
*/
public interface Execution<SR extends BaseSource, TF extends BaseTransform, SK extends BaseSink> extends Plugin<Void> {
/**
* start to execute the SeaTunnel job
*
* @param sources source plugin list
* @param transforms transform plugin list
* @param sinks sink plugin list
*/
void start(List<SR> sources, List<TF> transforms, List<SK>