2021-11-13

Flink自定义数据源

该篇文章主要通过源码分析自定义数据源是如何实现
flink版本为:1.11.1 (怪不得老子是单身 QAQ)

1.flink数据源分类

flink数据源分为四类:
1)readTextFile(path):读取文本文件,文件遵循TextInputFormat逐行读取规则并返回,相当于hadoop默认的文件读取方式(行读)
2)socketTextStream:从Socket中读取数据,元素可以通过一个分隔符分开
3)fromCollection(Collection):通过Java的Collection集合创建一个数据流
4)自定义数据源:可以使用StreamExecutionEnvironment.addSource(sourceFunction)将一个流式数据源加到程序中

2.自定义数据源实现方式

自定义数据源又依赖三种方式:
mplements SourceFunction
implements ParallelSourceFunction
extends RichParallelSourceFunction

3.自定义数据源图解

在这里插入图片描述
接下来我们从上至下的方式看一下每个接口或类的功能

1)Public
/**
 * Annotation for marking classes as public, stable interfaces.
 *
 * <p>Classes, methods and fields with this annotation are stable across minor releases (1.0, 1.1, 1.2). In other words,
 * applications using @Public annotated classes will compile against newer versions of the same major release.
 *
 * <p>Only major releases (1.0, 2.0, 3.0) can break interfaces with this annotation.
 */
@Documented
@Target(ElementType.TYPE)
@Public
public @interface Public {}

英文读不懂,没关系,我们用百度翻译QAQ

  • 将类标记为公共、稳定的接口的注解。

  • 带有此注解的类、方法和字段在小版本(1.0、1.1、1.2)中保持稳定。换句话说, 使用@Public注释类的应用程序将根据相同主要版本的新版本进行编译。

  • 主要版本 (1.0、2.0、3.0) 才能中断此注解的界面。

个人理解为:标记@Public注解类,只会编译稳定版本的代码,为了使类在小版本中保持稳定;

2)java.io.Serializable

字面意思,将类或方法标记为可序列化的,从而实现对象传输;

接下来几个类需要我们重点理解

3)Function
/**
 * The base interface for all user-defined functions.
 * <p>This interface is empty in order to allow extending interfaces to
 * be SAM (single abstract method) interfaces that can be implemented via Java 8 lambdas.</p>
 */
@Public
public interface Function extends java.io.Serializable {
}
  • 所有用户定义函数的基本接口。
  • 这个接口是空的,以便允许将接口扩展到
  • 是 SAM(单个抽象方法)界面,可通过 Java 8 lambdas 实现
4)RichFunction
  • 所有UDF的基本接口。此类定义了用于类对象的生命周期,以及访问已执行的类上下文的方法。

也就是说,该接口是为了给其他类或接口添加功能的接口(一句废话,接口就只干这个的),添加哪些功能呢?
功能1:定义类对象的生命周期(创建和关闭)
void open(Configuration parameters) throws Exception;
类的初始化方法。在实际工作方法之前,做一些一次性的设置;
比如:在链接kafka时获取offset的信息;
void close() throws Exception;
类的关闭方法。在实际工作方法完成后,做一些一次性的设置;
功能2:定义了一个方法用于获取运行时上下文信息
RuntimeContext getRuntimeContext();
获取包含有关 UDF 运行时上下文的信息,例如函数的并行性、函数的子任务索引或名称执行该功能的任务。
void setRuntimeContext(RuntimeContext t);
用来设置运行时上下文信息;

5)SourceFunction

在Flink中作为所有流式数据的基本接口,定义的发射元素的功能,和结束发射的功能;
提供读取流式数据的能力;
void run(SourceContext ctx) throws Exception;
void cancel();

6)ParallelSourceFunction
@Public
public interface ParallelSourceFunction<OUT> extends SourceFunction<OUT> {
}

并行执行的流数据源,通过配置并行度,运行时间将执行此函数的多个并行实例;
提供了并行能力;

7)AbstractRichFunction

添加了初始化方法和卸载方法;

8)RichParallelSourceFunction
@Public
public abstract class RichParallelSourceFunction<OUT> extends AbstractRichFunction
		implements ParallelSourceFunction<OUT> {

	private static final long serialVersionUID = 1L;
}

并行读取数据源的功能;
通过AbstractRichFunction接口添加了初始化方法和关闭方法;

至此,flink自定义数据源就解析完了,下篇解析一下FlinkKafkaConsumer 数据源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值