DataStream 编程模型
Flink定义DataStream API让用户灵活且高效的编写流式应用。主要分为3部分:DataSource模块,Transformation模块以及DataSink模块。
- DataSource模块,主要定义了数据接入功能,将外部数据接入至flink,并将接入数据转换成对应的datastream数据集。
- Transformation 模块定义了对 DataStream 数据集的各种转换操作,例如进行 map、filter、windows等操作。
- 最后,将结果数据通过Datasink模块写出到外部存储介质中,例如将数据输出到文件或Kaka消息中间件等。
今天主要讲DataSources:
DataSources数据输入
DataSources 模块定义了DataStream API中的数据输人操作,Flink将数据源主要分为的内置数据源和第三方数据源两种类型。其中内置数据源包含文件、Socket网络端口以及集合类型数据 ,其不需要引人其他依赖库,且在Flink系统内部已经实现,用户可以直接调用相关方法使用。第三方数据源定义了Flink和外部系统数据交互的逻辑,包括数据的读写接口。在Flink中定义了非常丰富的第三方数据源连接器(Connector),例如Apache kafka Connector、Elatic Search Connector等。同时用户也可以自定义实现Flink中数据接人函数 SourceFunction,并封装成第三方数据源的Connector,完成Flink与其他外部系统的数据交互。
内置数据源
- 文件数据源:flink支持将文件内容读取到系统中,并转换成分布式数据集DataStream 进行数据处理。readFile时可以指定文件读取类型(WatchType),检测文件变换时间间隔(interval)、文件路径过滤条件(FilePathFilter)等参数。watchtype分为PROCESS_CONTINUOUSLY和PROCESS_ONCE模式,前置检测到文件内容变化会加载全部内容到Flink;而后者只加载变化的数据,即数据只被读取、处理一次 。因此后一种方式才能保证Exactly Once级别的数据一致性保障
- Socket数据源:参数为IP地址和端口。
- 集合数据源:Flink可以直接将集合类(collection)转换成datastream数据集,本质上是将本地集合中的数据分发到远端并行执行的节点中。注意集合内的数据结构需要一致,否则可能出现数据转换异常。
外部数据源
- 数据源连接器
前面提到的数据源类型都是些基本的数据接人方式,其实质是实现了不同的SourceFuncion,Fink将其封装成高级API,减少用户的使用成本。
对于流式计算类型的应用,数据大部分都是从外部第三方系统中获取。Flink定义了非常丰富的第三方数据连接器:
- 其中部分连接器是仅支持读取数据,例如Netty等;
- 一部分仅支持数据输出(Sink):Elasticsearch、Hadoop FileSystem等。
- 还有一部分是支持数据输入和输出:例如 Apache Kafka、Amazon Kinesis连接器。例如kafka connector中使用的主要参数有:kafka topic、bootstrap.servers、zookeeper.connect。
- 自定义数据源连接器。可以通过实现SourceFunction定义单个 现成的接入的数据接入其,也可以实现parallelSourceFunction接口定义并发数据源接入器。