作者介绍:董亭亭,快手大数据架构实时计算引擎团队负责人。目前负责 Flink 引擎在快手内的研发、应用以及周边子系统建设。2013 年毕业于大连理工大学,曾就职于奇虎 360、58 集团。主要研究领域包括:分布式计算、调度系统、分布式存储等系统。
本文主要分享Flink connector相关内容,分为以下三个部分的内容:第一部分会首先介绍一下Flink Connector有哪些。第二部分会重点介绍在生产环境中经常使用的kafka connector的基本的原理以及使用方法。第三部分答疑环节,看大家有没有一些问题。
Flink Streaming Connector
Flink是新一代流批统一的计算引擎,它需要从不同的第三方存储引擎中把数据读过来,进行处理,然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器,连接 Flink 计算引擎跟外界存储系统。Flink里有以下几种方式,当然也不限于这几种方式可以跟外界进行数据交换:第一种 Flink里面预定义了一些source和sink。第二种 FLink内部也提供了一些Boundled connectors。第三种 可以使用第三方apache Bahir项目中提供的连接器。第四种是通过异步IO方式。下面分别简单介绍一下这四种数据读写的方式。
预定义的source和sink
Flink里预定义了一部分source和sink。在这里分了几类。
基于文件的source和sink。
如果要从文本文件中读取数据,可以直接使用
env.readTextFile(path)
就可以以文本的形式读取该文件中的内容。当然也可以使用
env.readFile(fileInputFormat, path)
根据指定的fileInputFormat格式读取文件中的内容。
如果数据在FLink内进行了一系列的计算,想把结果写出到文件里,也可以直接使用内部预定义的一些sink,比如将结果已文本或csv格式写出到文件中,可以使用DataStream的writeAsText(path)和 writeAsCsv(path)。
基于Socket的Source和Sink
提供Socket的host name及port,可以直接用StreamExecutionEnvironment预定的接口socketTextStream创建基于Socket的source,从该socket中以文本的形式读取数据。当然如果想把结果写出到另外一个Socket,也可以直接调用DataStream writeToSocket。
基于内存 Collections、Iterators 的Source可以直接基于内存中的集合或者迭代器,调用StreamExecutionEnvironment fromCollection、fromElements构建相应的source。结果数据也可以直接print、printToError的方式写出到标准输出或标准错误。
详细也可以参考Flink源码中提供的一些相对应的Examples来查看异常预定义source和sink的使用方法,例如WordCount、SocketWindowWordCount。
Bundled Connectors
Flink里已经提供了一些绑定的Connector,例如kafka source和sink,Es sink等。读写kafka、es、rabbitMQ时可以直接使用相应connector的api即可。第二部分会详细介绍生产环境中最常用的kafka connector。
虽然该部分是Flink 项目源代码里的一部分,但是真正意义上不算作flink引擎相关逻辑,并且该部