流处理是 Flink 的核心,流处理的数据集用 DataStream 表示。数据流从能够从各类各样的数据源中建立(消息队列、Socket 和 文件等),通过 DataStream 的各类 transform 操做,最终输出文件或者标准输出。这个过程跟以前文章中介绍的 Flink 程序基本骨架同样。本篇介绍 DataStream 相关的入门知识。java
为了学习 Flink 的朋友能查看到每一个例子的源码,我建立了一个 GitHub 项目:https://github.com/duma-repo/awesome-flink 这里会存放每一篇文章比较重要的示例的源码,目前支持 Java 和 Scala,仍在不断完善中。代码下载后能够在本地运行,也能够打包放在集群上运行。同时,欢迎各位将优质的资源提交到项目中。
git
import org.apache.flink.api.common.functions.FlatMapFunction; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.util.Collector; public class WindowWordCount { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Tuple2<String, Integer>> dataStream = env .socketTextStream("localhost", 9999) .flatMap(new Splitter()) .keyBy(0) .timeWindow(Time.seconds(5)) .sum(1); dataStream.print(); env.execute("Window WordCount"); } public static class Splitter implements FlatMapFunction<String, Tuple2<String, Integer>> { @Override public void flatMap(String sentence, Collector<Tuple2<String, Integer>> out) throws Exception { for (String word: sentence.split(" ")) { out.collect(new Tuple2<String, Integer>(word, 1)); //空格分割后,每一个单词转换成 (word, 1) 二元组输出 } } } }
这个例子跟之间介绍 WordCount 的例子相似,这里详细介绍下涉及的 API 和含义github
通过以上的介绍,咱们知道常见的数据源有 socket、消息队列和文件等。对于常见的数据源 Flink 已经定义好了读取函数,接下来一一介绍。apache
须要注意,在底层 Flink 将读文件的过程分为两个子任务 —— 文件监控和数据读取(reader)。监控任务由 1 个 task 实现,而读取的任务由多个 task 实现,数量与 Job 的并行度相同。监控任务的做用是扫描输入路径(周期性或者只扫描一次,取决于 watchType),当数据能够被处理时,会将数据分割成多个分片,将分片分配给下游的 reader 。一个分片只会被一个 reader 读取,一个 reader 能够读取多个分片。编程
以前已经介绍了一些 transfrom 函数,如:map、flatMap 和 filter 等。同时还有窗口函数:window、timeWindow 等,聚合函数:sum、reduce 等。更多的 transform 函数以及使用将会单独写一篇文章介绍。api
Data Sink 即是数据的输出。同 Data Source 相似, Flink 也内置了一些输出函数,以下:socket
本篇文章主要介绍了 Flink Streaming 编程的基本骨架。详细介绍了 Streaming 内置的 Data Source 和 DataSink 。下篇将继续介绍 Flink Streaming 编程涉及的基本概念。ide
欢迎关注公众号「渡码」学习