回复: flink 如何自定义connector

2020-05-27 文章 111
Hi,
在sql-gateway里面,类加载默认是子类优先,每次提交任务都是独立的tableEnvironment,独立的classloader,因此不存在这个问题。
Best,
Xinghalo

回复: flink 如何自定义connector

2020-05-27 文章 Lijie Wang
可能的确会存在这个问题。在添加依赖时注意不要将 flink provided 的包打包进去就可以。也可以通过设置 parent-first 来解决这个问题。




在2020年05月28日 11:03,forideal 写道:
Hi 111,

关于第二点:
`2 配置FLINK_HOME环境变量,自定义的connector放在FLINK_HOME/lib下`
这么做是不是存在如下 `X can't be cast to X ` 隐患
因为把 Connector 放在 lib 中,会有 classloader 的问题,直接的现象就是 X can't be cast to X 
问题[1]。当然这只是说可能会发生。比如,我们把 usercode 代码放入 Flink lib 我们会发现,当我们使用 jar 
包上传的方式运行任务时,jar 中也包含 lib 中的代码会触发这样的问题。
[1] 
https://ci.apache.org/projects/flink/flink-docs-release-1.10/monitoring/debugging_classloading.html#x-cannot-be-cast-to-x-exceptions


Best
forideal








在 2020-05-28 10:16:45,"111"  写道:
Hi,
想要在sqlgateway里面使用,那么可以看看下面几个条件:
1 满足SPI的要求,能让flink自动发现实现类
2 配置FLINK_HOME环境变量,自定义的connector放在FLINK_HOME/lib下
3 如果与Hive集成,使用hivecatalog,那么先要注册表
这样就可以使用了。
Best,
Xinghalo


Re:回复: flink 如何自定义connector

2020-05-27 文章 forideal
Hi 111,
  
 关于第二点:
   `2 配置FLINK_HOME环境变量,自定义的connector放在FLINK_HOME/lib下`
 这么做是不是存在如下 `X can't be cast to X ` 隐患
因为把 Connector 放在 lib 中,会有 classloader 的问题,直接的现象就是 X can't be cast to X 
问题[1]。当然这只是说可能会发生。比如,我们把 usercode 代码放入 Flink lib 我们会发现,当我们使用 jar 
包上传的方式运行任务时,jar 中也包含 lib 中的代码会触发这样的问题。
[1] 
https://ci.apache.org/projects/flink/flink-docs-release-1.10/monitoring/debugging_classloading.html#x-cannot-be-cast-to-x-exceptions


Best
 forideal








在 2020-05-28 10:16:45,"111"  写道:
>Hi,
>想要在sqlgateway里面使用,那么可以看看下面几个条件:
>1 满足SPI的要求,能让flink自动发现实现类
>2 配置FLINK_HOME环境变量,自定义的connector放在FLINK_HOME/lib下
>3 如果与Hive集成,使用hivecatalog,那么先要注册表
>这样就可以使用了。
>Best,
>Xinghalo


回复: flink 如何自定义connector

2020-05-27 文章 111
Hi,
想要在sqlgateway里面使用,那么可以看看下面几个条件:
1 满足SPI的要求,能让flink自动发现实现类
2 配置FLINK_HOME环境变量,自定义的connector放在FLINK_HOME/lib下
3 如果与Hive集成,使用hivecatalog,那么先要注册表
这样就可以使用了。
Best,
Xinghalo

回复: flink 如何自定义connector

2020-05-27 文章 111
Hi,
随便开一个jdbc connector之类的,模仿造一个就行:
1 需要有Service loader的描述符文件:resources下面需要有META-INFO.services,里面有TableFactory的实现类声明
2 创建对应的TableFactory实现类,根据source sink实现不同的接口,返回对应的TableSource或者TableSink
3 如果是TableSource,根据剪枝、lookup等特性实现不同的接口
4 如果是TableSink,根据upsert、append、retract实现不同的接口
总之,开一个connector源码,抄一下就行。
Best,
Xinghalo