点击蓝色“Java极客技术”关注我哟
加个“星标”,天天早上 08:14,一起快乐成长
为何要使用 Flink
因为本篇文章中,有个 Kafka
数据源的 Demo
,在一开始解答小伙伴有可能的困惑:
Question:既然监听 Kafka 消息,为何不建立一个简单的消息消费者,使用简单的代码就能进行消息的消费?
Answer:在普通的消费者逻辑中,只能做到对传送过来的一条消息进行单条处理。而在 Flink 这个优秀的流计算框架中,能够使用窗口进行多样化处理。提供了窗口处理函数,可以对一段时间(例如 5s 内)或者一批(计数大小,例如 5 个一批)的数据进行计数或者 reduce 整合处理
还有 Flink
拥有状态管理,能够保存 checkpoint
,如果程序出现错误,也能够之前的检查点恢复,继续程序的处理,于是拥有这些好处的优秀框架,希望小伙伴也加入进来,一起学习~
1、前言
接下来的几篇文章,都会围绕着下面这张图,整体上来说,就是 DataStreamAPI
编程的练习:
分别是 Source
、Transformation
和 Sink
进行逐一学习。
2、DataSource 介绍
直译:数据来源
计算引擎,不管是批出来还是流处理,最重要的是数据来源,根据源源不断的数据进行处理,加工成更有价值的数据。
Flink
官方包中提供了如下基于集合、文件、套接字等 API
,然后第三方例如 Kafka
、RabbitMq
等也提供了方便的集成库。
由于我们测试时,使用的是 StreamExecutionEnvironment.getExecutionEnvironment()
来获取流执行环境类进行操作,所以我们来看下这个类的返回类型是 DataStreamSource
的方法:
3、集合
集合数据源主要有三种:collection
、element
和 generateSequence
。
-
fromCollection(Collection):接受的参数对象必须是同一类型的集合
-
fromCollection(Iterator
<
OUT>
data, Class<
OUT>
type):第一个参数是迭代器,第二个参数是指定返回的类型 -
fromElements(Class
<
OUT>
type, OUT... data):第一个参数是指定返回的类型,后面的是不定数量入参,可以输入多个OUT
类型的对象 -
fromParallelCollection(SplittableIterator
<
OUT>
iterator, TypeInformation<
OUT>
typeInfo, String operatorName): 从一个可分离的迭代器中创建并行数据源。这个方法是parallel
并行数据源的底层调用方法,typeInfo
是具体的类型信息,最后一个参数就是操作名字。这个并行数据源并没有测试过,等到之后回来补坑吧。 -
generateSequence(long, long):创建一个包含数字序列的新数据流。例如传进去是 1l 和 10l,那么数据源就是 [1-10]
测试代码如下:
DataSourceFromCollection.java
private static DataStreamSource<Student> collection1(StreamExecutionEnvironment env) {
List<Student> studentList = Lists.newArrayList(
new Student(1, "name1", 23, "address1"),
new Student(2, "name2", 23, "address2"),
new Student(3, "name3", 23, "address3")
);
return env.fromCollection(studentList);
}
private static DataStreamSource<Long> collection2(StreamExecutionEnvironment env) {
return env.generateSequence(1, 20);
}
4、文件 File
从官方例子中,罗列了以下三个读取文件的方法,第一个返回的文本类型的数据源,第二个数据源是只读取一次文件,第三个方法参数比较多,文档中关于 watchType 观察类型介绍比较多,这里翻译自文档 Flink DataStream API