Flink主要用来处理数据流,所以从抽象上来看就是对数据流的处理,正如前面大数据开发-Flink-体系结构 && 运行架构提到写Flink程序实际上就是在写DataSource、Transformation、Sink.
DataSource是程序的数据源输入,可以通过StreamExecutionEnvironment.addSource(sourceFuntion)为程序 添加一个数据源
Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,比如Map、FlatMap和Filter等操作
Sink是程序的输出,它可以把Transformation处理之后的数据输出到指定的存储介质中
DataStream的三种流处理Api
DataSource
Flink针对DataStream提供了两种实现方式的数据源,可以归纳为以下四种:
基于文件
readTextFile(path)
读取文本文件,文件遵循TextInputFormat逐行读取规则并返回基于Socket
socketTextStream
从Socket中读取数据,元素可以通过一个分隔符分开基于集合
fromCollection(Collection)
通过Java的Collection集合创建一个数据流,集合中的所有元素必须是相同类型的,需要注意的是,如果集合里面的元素要识别为POJO,需要满足下面的条件该类有共有的无参构造方法
该类是共有且独立的(没有非静态内部类)
类(及父类)中所有的不被static、transient修饰的属性要么有公有的(且不被final修饰),要么是包含公有的getter和setter方法,这些方法遵循java bean命名规范
总结:上面的要求其实就是为了让Flink可以方便地序列化和反序列化这些对象为数据流
自定义Source
使用
StreamExecutionEnvironment.addSource(sourceFunction)
将一个流式数据源加到程序中,具体这个sourceFunction
是为非并行源implements SourceFunction
,或者为并行源implements ParallelSourceFunction
接口,或者extends RichParallelSourceFunction
,对于自定义Source,Sink, Flink内置了下面几种Connector
连接器 | 是否提供Source支持 | 是否提供Sink支持 |
---|---|---|
Apache Kafka | 是 | 是 |
ElasticSearch | 否 | 是 |
HDFS | 否 | 是 |
Twitter Streaming PI | 是 | 否 |
对于Source的使用,其实较简单,这里给一个较常用的自定义Source的KafaSource的使用例子。更多相关源码可以查看:<