Flink 1.10提供了丰富的connector组件帮助用户连接外部系统。但是很多时候原生的connector并不能够完全满足用户的需求,因此需要自定义开发connector组件。本文介绍如何进行Flink1.10 SQL CONNECTOR的开发工作。
Flink 1.10通过SPI去加载不同的factory,实现了CONNECTOR的统一。
SPI机制
SPI,全称为Service Provider Interface,是Java提供的一套用于第三方实现或拓展的API。
基于工厂模式的任务提交
public interface PipelineExecutor{
/**
* 执行任务
*/
CompletableFuture<JobClient> execute(final Pipeline pipeline, final Configuration configuration)throws Exception;
}
PipelineExecutor 提供多种实现方式:
- RemoteExecutor(standalone)
- LocalExecutor (local)
- YanrJobClusterExecutor (per-job)
- YarnSessionClusterExecutor (yarn-session)
支持用户在多种场景下提交flink任务。
Flink 提供PipelineExecutorServiceLoader接口,其中实现类DefaultExecutorServiceLoader支持通过名称去加载类。它的原理就是通过SPI机制去查找flink所提供的所有的工厂类,找到合适的类,进行加载。
基于工厂模式的SQL CONNECTOR设计
Flink 1.10提供SPI方式支持与connector进行交互,Flink会去扫描包中resources/META-INF/services目录下的org.apache.flink.table.factories.TableFactory,获取所有Factory类,根据sql中with传进来的参数(k=v)进行匹配,找到匹配到的那个Factory类,如果没有找到的话,则会报错。
public class SqlHdfsSinkFactory implements StreamTableSinkFactory<Row> {
@Override
public List