Flink主要用来处理数据流,所以从抽象上来看就是对数据流的处理,正如前面大数据开发-Flink-体系结构 && 运行架构提到写Flink程序实际上就是在写DataSource、Transformation、Sink。
-
DataSource是程序的数据源输入,可以通过StreamExecutionEnvironment.addSource(sourceFuntion)为程序
添加一个数据源 -
Transformation是具体的操作,它对一个或多个输入数据源进行计算处理,比如Map、FlatMap和Filter等操作
-
Sink是程序的输出,它可以把Transformation处理之后的数据输出到指定的存储介质中
Flink针对DataStream提供了实现数据源的方式,可以归纳为以下几种:
-
基于文件
readTextFile(path)
读取文本文件,文件遵循TextInputFormat逐行读取规则并返回 -
基于Socket
socketTextStream
从Socket中读取数据,元素可以通过一个分隔符分开 -
基于集合
fromCollection(Collection)
通过Java的Collection集合创建一个数据流,集合中的所有元素必须是相同类型的,需要注意的是,如果集合里面的元素要识别为POJO,需要满足下面的条件
总结:上面的要求其实就是为了让Flink可以方便地序列化和反序列化这些对象为数据流
-
该类有共有的无参构造方法
-
该类是共有且独立的(没有非静态内部类)
-
类(及父类)中所有的不被static、transient修饰的属性要么有公有的(且不被final修饰),要么是包含公有的getter和setter方法,这些方法遵循java bean命名规范
自定义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的使用例子。更多相关源码可以查看
Source数据源
-
从已有集合读取数据
-
List<Tuple3<String, String, Integer>> tuple3List = Arrays.asList(Tuple3.of("zs", "532101xxx", 1),Tuple3.of("ls", "532102xxx", 2),Tuple3.of("ww", "532103xxx", 2)); DataStream<Tuple2<String, Integer>> dataStream = env.fromCollection(tuple3List)
2.读取任意类型的数据
env.fromElements(1, 2, "date")
3.从文件读取数据
env.readTextFile("D:\\test.txt")
4.从kafka中读取
pom.xml引入
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.11</artifactId>
<version>1.13.0</version>
</dependency>
Kafka Consumer 代码如下
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
.addSource(new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties));
Transfromation转换
对于Transformation ,Flink提供了很多的算子,map、flatMap...
map
DataStream → DataStream Takes one element and produces one element. A map function that doubles the values of the input stream:
flatMap
DataStream → DataStream Takes one element and produces zero, one, or more elements. A flatmap function that splits sentences to words:
Sink
Flink针对DataStream提供了大量的已经实现的数据目的地(Sink),具体如下所示
-
writeAsText():讲元素以字符串形式逐行写入,这些字符串通过调用每个元素的toString()方法来获取
-
print()/printToErr():打印每个元素的toString()方法的值到标准输出或者标准错误输出流中
-
自定义输出:addSink可以实现把数据输出到第三方存储介质中, Flink提供了一批内置的Connector,其中有的Connector会提供对应的Sink支持
FlinkKafkaProducer producer = new FlinkKafkaProducer(brokerList, topic, new SimpleStringSchema());
data.addSink(producer);
当然sink也可以自定义,自定义Sink需要建议继承RichSinkFunction类。
如果觉得文章能帮到您,欢迎关注微信公众号:“蓝天Java大数据” ,共同进步!