ChunJun: 自定义插件

序言

Chunjun的版本兼容可能会有问题,在我们了解了自定义插件后,在修改源码以应对不同的场景就会得心应手了,针对Chunjun1.12.Release版本说明[email protected] 

自定义插件整体流程

从数据流的角度来看ChunJun,可以理解为不同数据源的数据流通过对应的ChunJun插件处理,变成符合ChunJun数据规范的数据流;脏数据的处理可以理解为脏水流通过污水处理厂,变成符合标准,可以使用的水流,而对不能处理的水流收集起来。----总的来说跟Flink的数据处理一样,只是增加了一个插件的概念用于处理不同的数据源,并生成对应的Flink任务[email protected]

插件开发不需要关注任务具体如何调度,只需要关注关键问题:

  1. 数据源本身读写数据的正确性;
  2. 如何合理且正确地使用框架;
  3. 配置文件的规范,每个插件都应有对应的配置文件;

每个插件应当有以下目录:

  1. conf:存放插件配置类的包。
  2. converter:存放插件数据类型转换规则类的包。
  3. source:存放插件数据源读取逻辑有关类的包。
  4. sink:存放插件数据源写入逻辑有关类的包。
  5. table:存放插件数据源sql模式有关类的包。  -----这个应该不是我们的重点,flink的sql并不好[email protected]
  6. util:存放插件工具类的包,chunjun已经封装了一些常用工具类在chunjun-core模块中,如果还需编写插件工具类的请放在该插件目录中的util包

以Stream插件为例子,他的插件结构如下图所示:

ChunJun: 自定义插件_第1张图片

调试

Debug调试

(1)本地调试

在chunjun-local-test模块中,官方已经写好了本地测试的LocalTest类,只需更改脚本文件路径,在代码处打上断点即可调试。

(2)远程调试

如果需要远程调试,那么需要在 flink-conf.yaml 中增加 Flink 的远程调试配置,然后在 idea 中配置”JVM Remote“,在代码块中打断点(这种方法还能调试 Flink 本身的代码)

 
  

env.java.opts.jobmanager: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 env.java.opts.taskmanager: -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006

只需要修改标记的这两个地方,如果是 HA 集群,需要根据日志修改怎么看日志,怎么修改,自行查资料

至此,任务 idea 调试流程就这些内容。

ChunJun: 自定义插件_第2张图片

任务类型

从Chunjun的配置文件Json中可以看到任务的分类

  • sync:同步任务,同理有同步任务的读插件和写插件,即sync(reader),sync(writer)
  • sql:计算任务,,同理有计算任务的读插件和写插件,即sync(reader),sync(writer)

reader

开发流程

以Stream插件为例

插件数据源读取逻辑需要继承BaseRichInputFormat类,BaseRichInputFormat是具体的输入数据的操作,包括open、nextRecord、close,每个插件具体操作自己的数据,InputFormat公共内容都在BaseRichInputFormat,不要随意修改。

创建StreamInputFormat类继承BaseRichInputFormat类,重写其中的必要方法。

public class StreamInputFormat extends BaseRichInputFormat {
    //创建数据分片
	@Override
    public InputSplit[] createInputSplitsInternal(int minNumSplits) {......}
    //打开数据连接
	@Override
    public void openInternal(InputSplit inputSplit) {......}
    //读取一条数据
 	@Override
    public RowData nextRecordInternal(RowData rowData) throws ReadRecordException {......}
    //判断数据是否读取完毕
	@Override
    public boolean reachedEnd() {......}
    //关闭数据连接
	@Override
    protected void closeInternal() {......}
}

由此可见StreamInputFormat 具体的实施类,但是在调用实现类的方法前还有引导类的创建,具体流程是:StreamSourceFactory-->StreamInputFormatBuilder-->StreamInputFormat 中间会引用StreamConf和StreamColumnConverter  至此一个source就完成了[email protected]

业务流程

1 com.dtstack.chunjun.Main是启动类,首先判断是计算任务,还是同步任务

ChunJun: 自定义插件_第3张图片

2 以exeSyncJob为例进入可以看到,这里就是根据我们传入的Json文件内容生成环境变量

ChunJun: 自定义插件_第4张图片

3 .将上面解析生成的SyncConf,然后通过反射加载具体的插件调用createSource方法生成DataStream,  注意这里就是重点了根据 我们的json文件的内容,来获取StreamSourceFactory ,然后创建的数据内容是DataStream----从这里开始就是重点了

4 createSource方法中会构建inputformat对象,然后调用createInput方法,将inputformat对象封装至DtInputFormatSourceFunction中。

未完待续~~~

你可能感兴趣的:(Big,Data,Storage,ETL,Chunjun,Flinkx)