流处理是 Flink 的核心,流处理的数据集用 DataStream 表示。数据流从可以从各种各样的数据源中创建(消息队列、Socket 和 文件等),经过 DataStream 的各种 transform 操作,最终输出文件或者标准输出。这个过程跟之前文章中介绍的 Flink 程序基本骨架一样。本篇介绍 DataStream 相关的入门知识。

Flink 101

为了学习 Flink 的朋友能查看到每个例子的源码,我创建了一个 GitHub 项目:github.com/duma-repo/a… 这里会存放每一篇文章比较重要的示例的源码,目前支持 Java 和 Scala,仍在不断完善中。代码下载后可以在本地运行,也可以打包放在集群上运行。同时,欢迎各位将优质的资源提交到项目中。

简单示例

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>> {@Overridepublic 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 和含义

  • 数据源:socketTextStream 是从 socket 创建的数据流,可以使用 nc -l 9000 创建 socket 客户端发送数据
  • transform:flatMap 将输入的数据按照空格分割后,扁平化处理(flat即为扁平的意思);keyBy 会按照指定的 key 进行分组,这里就是将单词作为 key;timeWindow 指定时间窗口,这里是 5s 处理一次;sum 是聚合函数,将分组好的单词个数求和
  • 输出:print 将处理完的数据输出到标准输出流中,可以在控制台看到输出的结果。调用 execute 方法提交 Job

Data Source

经过以上的介绍,我们知道常见的数据源有 socket、消息队列和文件等。对于常见的数据源 Flink 已经定义好了读取函数,接下来一一介绍。

基于文件

  • readTextFile(path):读文本文件,默认是文件类型是 TextInputFormat,并且返回类型是 String
  • readFile(fileInputFormat, path):读文件,需要指定输入文件的格式
  • readFile(fileInputFormat, path, watchType, interval, typeInfo):以上两个方法内部都会调用这个方法,参数说明:
    • fileInputFormat - 输入文件的类型
    • path - 输入文件路径
    • watchType - 取值为 FileProcessingMode.PROCESS_CONTINUOUSLY 和 FileProcessingMode.PROCESS_ONCE
      • FileProcessingMode.PROCESS_CONTINUOUSLY - 当输入路径下有文件被修改,整个路径下内容将会被重新处理
      • FileProcessingMode.PROCESS_ONCE - 只扫描一次,便退出。因此这种模式下输入数据只读取一次
    • interval - 依赖 watchType 参数,对于 FileProcessingMode.PROCESS_CONTINUOUSLY 每隔固定时间(单位:毫秒)检测路径下是否有新数据
    • typeInfo - 返回数据的类型

需要注意,在底层 Flink 将读文件的过程分为两个子任务 —— 文件监控和数据读取(reader)。监控任务由 1 个 task 实现,而读取的任务由多个 task 实现,数量与 Job 的并行度相同。监控任务的作用是扫描输入路径(周期性或者只扫描一次,取决于 watchType),当数据可以被处理时,会将数据分割成多个分片,将分片分配给下游的 reader 。一个分片只会被一个 reader 读取,一个 reader 可以读取多个分片。

基于 Socket

  • socketTextStream:从 socket 数据流中读数据

基于 Collection

  • fromCollection(Collection):从 Java.util.Collection 类型的数据中创建输入流,collection 中的所有元素类型必须相同
  • fromCollection(Iterator, Class):从 iterator (迭代器)中创建输入流,Class 参数指定从 iterator 中的数据类型
  • fromElements(T ...):从给定的参数中创建输入流, 所有参数类型必须相同
  • fromParallelCollection(SplittableIterator, Class):从 iterator 中创建并行的输入流,Class 指定 iterator 中的数据类型
  • generateSequence(from, to):从 from 至 to 之间的数据序列创建并行的数据流

自定义

  • addSource:可以自定义输入源,通过实现 SourceFunction 接口来自定义非并行的输入流;也可以实现 ParallelSourceFunction 接口或集成 RichParallelSourceFunction 类来自定义并行输入流,当然也可以定义好的数据源,如:Kafka,addSource(new FlinkKafkaConsumer08<>(...))

DataStream 的 transform

之前已经介绍了一些 transfrom 函数,如:map、flatMap 和 filter 等。同时还有窗口函数:window、timeWindow 等,聚合函数:sum、reduce 等。更多的 transform 函数以及使用将会单独写一篇文章介绍。

Data Sink

Data Sink 便是数据的输出。同 Data Source 类似, Flink 也内置了一些输出函数,如下:

  • writeAsText(path) / TextOutputFormat:将数据作为 String 类型输出到指定文件
  • writeAsCsv(...) / CsvOutputFormat:将 Tuple 类型输出到 ',' 分隔的 csv 类型的文件。行和列的分隔符可以通过参数配置,默认的为 '\n' 和 ','
  • print() / printToErr():将数据打印到标准输出流或者标准错误流,可以指定打印的前缀。
  • writeUsingOutputFormat() / FileOutputFormat:输出到 OutputFormat 类型指定的文件,支持对象到字节的转换。
  • writeToSocket:根据 SerializationSchema 将数据输出到 socket
  • addSink:自定义输出函数,如:自定义将数据输出到 Kafka

小结

本篇文章主要介绍了 Flink Streaming 编程的基本骨架。详细介绍了 Streaming 内置的 Data Source 和 DataSink 。下篇将继续介绍 Flink Streaming 编程涉及的基本概念。

代码地址: github.com/duma-repo/a…

欢迎关注公众号「渡码」

转载于:https://juejin.im/post/5d09814651882528fd530789

Flink DataStream 编程入门相关推荐

  1. Apache Flink DataStream 编程全集

    概述 Flink是构建在数据流之上的有状态计算的流计算框架,通常被人们理解为是第三代大数据分析方案. 第一代 - Hadoop的MapReduce计算(静态).Storm流计算(2014.9) :两套 ...

  2. Apache Flink 零基础入门(十五)Flink DataStream编程(如何自定义DataSource)

    数据源可以通过StreamExecutionEnvironment.addSource(sourceFunction)方式来创建,Flink也提供了一些内置的数据源方便使用,例如readTextFil ...

  3. Apache Flink 零基础入门【转】

    Apache Flink 零基础入门(一):基础概念解析 Apache Flink 零基础入门(二):DataStream API 编程 转载于:https://www.cnblogs.com/dav ...

  4. 第一天:什么是Flink、WordCount入门、Flink安装、并行度

    1. 初识 Flink 在当前数据量激增的时代,各种业务场景都有大量的业务数据产生,对于这些不断产的数据应该如何进行有效的处理,成为当下大多数公司所面临的问题.目前比较流行的大数据处理引擎 Apach ...

  5. 01.Java 编程入门学习笔记20210307

    Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...

  6. python编程求圆的面积案例_Python实用案例编程入门:第七章 调式手段

    本章的主题为调试手段,这是程序开发必不可少的步骤,也是占用时间最多的环节.在程序员的正常开发工作中,调试工作至少占据1/3的时间,而实际编码工作相对占用实际比较少.因此,无论您是初学者,还是编程兴趣爱 ...

  7. 《C++游戏编程入门(第4版)》——1.12 习题

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.1节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

  8. 编程入门到进大厂,你需要这套学习架构

    我相信大多数学习编程的同学都有着对大公司的憧憬.技术.声望.薪资.福利,这些都足以成为吸引你进入大厂的理由. 但是,如何进入大厂呢? 对于很多同学来说,通往大厂的道路并不明朗,不知道是否有希望,也不知 ...

  9. 《C++游戏编程入门(第4版)》——1.8 Lost Fortune简介

    本节书摘来自异步社区出版社<C++游戏编程入门(第4版)>一书中的第1章,第1.8节,作者:[美]Michael Dawson(道森),更多章节内容可以访问云栖社区"异步社区&q ...

最新文章

  1. BurpSuite日志分析过滤工具,加快SqlMap进行批量扫描的速度
  2. optee内核中栈的介绍(一)
  3. Mybatis-plus之RowBounds实现分页查询
  4. Activity的LaunchMode和taskAffinity
  5. 利用URL拼接爬取获取有道翻译内容
  6. Linux下的FTP服务
  7. MyBatis动态插入的实现
  8. Go Revel - Filters(过滤器链)
  9. 限时删!我亲自整理一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  10. 【机器学习】21个机器学习面试问答
  11. 计算机论文指导记录怎么写,毕业论文指导记录怎么写
  12. VB打造QQ批量登陆器
  13. 【BI工具支持的数据源对照表(帆软/PowerBI/永洪/观远)】
  14. 力扣---LeetCode20. 有效的括号(栈)
  15. 【Upload oss图片 上传失败】
  16. 怎么把多个excel表格合成一个_快速将多个Excel表格合并为1个,你会吗?
  17. 自动化测试框架结构图
  18. PTA 旅游规划 C语言 最短路径--Dijkstra
  19. jsp+ssm+mysql实现图书馆预约占座管理系统项目
  20. 专用打印机的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. leetcode 滑动窗口小结 (三)
  2. php 邮件验证_PHP程序来验证电子邮件地址
  3. Java Date toString()方法与示例
  4. 栈应用_将算式转成按运算符优先级分布(代码、分析、汇编)
  5. spring属性注入的set方法注入
  6. Linux获得命令帮助
  7. 2021河南高考成绩查询郸城一高,郸城一高在河南有多牛 2021年高考成绩
  8. uva 11054——Wine trading in Gergovia
  9. win10宽带连接断网自动重连
  10. C++ STL 容器之stack简单使用