FlinkSQL怎么查找到要执行的代码(转载)

写在前面:我是「且听风吟」,目前是一名大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面。

如果你也对大数据感兴趣,希望在这个行业一展拳脚。欢迎关注我,我们一起努力,一起学习。博客地址:https://ropledata.blog.csdn.net

博客的名字来源于:且听风吟,静待花开。也符合我对技术的看法,想要真正掌握一门技术就需要厚积薄发的毅力,同时保持乐观的心态。

你只管努力,剩下的交给时间!

在这里插入图片描述

一、问题表述
在写flink sql的时候不知道大家是否会有一个疑问:咱们创建的flink sql是怎么找到它要执行的java代码在哪的呢?flink sql里也没有声明位置呀。

比如:

CREATE TABLE my_table (
id BIGINT,
first_name STRING,
last_name STRING,
email STRING
) WITH (
‘connector’=‘kafka’,
‘topic’=‘user_topic’,
‘properties.bootstrap.servers’=‘localhost:9092’,
‘scan.startup.mode’=‘earliest-offset’,
‘format’=‘debezium-json’
);
1
2
3
4
5
6
7
8
9
10
11
12
最终解析 debezium-json 应该是: flink-formats/flink-json/src/main/java/org/apache/flink/formats/json/debezium

思考:FlinkSQL 是怎样的机制找到要执行的 Java 代码的呢?

二、思考
根据以往的经验,这种没有明确声明对应关系就能找到要执行代码的机制,可能是SPI(Service Provider Interface),它是一种服务发现机制。通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。那flink sql会不会也是使用这个SPI机制找到的对应的format呢?

三、解决
首先咱们参考目前最新的flink 1.11的官方文档来看:how-to-use-connectors
然后在flink-formats/flink-json/src/main/resources/META-INF/services/org.apache.flink.table.factories.Factory可以找到一些SPI的配置信息:

org.apache.flink.formats.json.JsonFileSystemFormatFactory
org.apache.flink.formats.json.JsonFormatFactory
org.apache.flink.formats.json.debezium.DebeziumJsonFormatFactory
org.apache.flink.formats.json.canal.CanalJsonFormatFactory

这时候咱们可以肯定它一定使用了SPI机制来查找对应的format!

那具体是怎样的呢?
咱们可以看一下SPI的示例代码:

private static T findSingleInternal(
Class factoryClass,
Map<String, String> properties,
Optional classLoader) {

List tableFactories = discoverFactories(classLoader);
List filtered = filter(tableFactories, factoryClass, properties);

if (filtered.size() > 1) {
throw new AmbiguousTableFactoryException(
filtered,
factoryClass,
tableFactories,
properties);
} else {
return filtered.get(0);
}
}

private static List
discoverFactories(Optional classLoader) {
try {
List result = new LinkedList<>();
ClassLoader cl =
classLoader.orElse(Thread.currentThread().getContextClassLoader());
ServiceLoader
.load(TableFactory.class, cl)
.iterator()
.forEachRemaining(result::add);
return result;
} catch (ServiceConfigurationError e) {
LOG.error(“Could not load service provider for table factories.”, e);
throw new TableException(“Could not load service provider for
table factories.”, e);
}

}

所以根据SPI的机制,咱们可以得出结论:Flink SQL是通过spi机制加载类,然后通过属性去过滤出需要的class!

原文链接:https://blog.csdn.net/qq_26803795/article/details/107403753?utm_medium=distribute.pc_feed.none-task-blog-personrec_tag-5.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-personrec_tag-5.nonecase&request_id=5f1fef39f769fa6e5f5d1d6e

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值