Flink入门

1. Flink的介绍

Apache Flink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 Alt text

2. 相关术语说明

1.1 无界数据流

  1. 有定义流的开始,但没有定义流的结束;
  2. 它们会无休止的产生数据;
  3. 无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的。

1.2 有界数据流

  1. 有定义流的开始,也有定义流的结束;
  2. 有界流可以在摄取所有数据后再进行计算;
  3. 有界流所有数据可以被排序,所以并不需要有序摄取;
  4. 有界流处理通常被称为批处理。

1.3 有状态流处理

把流处理需要的额外数据保存成一个"状态",然后针对这条数据进行处理,并且更新状态。这就是所谓的"有状态的流处理"。
Alt text 状态在内存中:优点,速度快;缺点,可靠性差。
状态在分布式系统中:优点,可靠性高;缺点,速度慢。

3. Flink的发展历史

Flink起源于一个叫作Stratosphere的项目,它是由3所地处柏林的大学和欧洲其他一些大学在2010~2014年共同进行的研究项目,由柏林理工大学的教授沃克尔·马尔科(Volker Markl)领衔开发。2014年4月,Stratosphere的代码被复制并捐赠给了Apache软件基金会,Flink就是在此基础上被重新设计出来的。 在德语中,"flink"一词表示"快速、灵巧"。项目的logo是一只彩色的松鼠。 Alt text

  • 2014年8月,Flink第一个版本0.6正式发布,与此同时Fink的几位核心开发者创办Data Artisans公司;
  • 2014年12月,Flink项目完成孵化.
  • 2015年4月,Flink发布了里程碑式的重要版本0.9.0;
  • 2019年1月,长期对Flink投入研发的阿里巴巴,以9000万欧元的价格收购了Data Artisans公司;
  • 2019年8月,阿里巴巴将内部版本Blink开源,合并入Flink1.9.0版本。

4. Flink特点

  • 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
  • 结果的准确性。Flink提供了事件时间(event-time)和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
  • 精确一次(exactly-once)的状态一致性保证。
  • 可以连接到最常用的外部系统,如Kafka、Hive、JDBC、HDFS、Redis等。
  • 高可用。本身高可用的设置,加上与K8s,YARN和Mesos的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink能做到以极少的停机时间7×24全天候运行。
  1. Spark以批处理为根本

    • Spark数据模型:Spark采用RDD模型,Spark Streaming的DStream实际上也就是一组组小批数据RDD的集合。
    • Spark运行时架构:Spark是批计算,将DAG划分为不同的stage,一个完成后才可以计算下一个。
      Alt text
  2. Flink以流处理为根本

    • Flink数据模型:Flink 基本数据模型是数据流,以及事件(Event)序列。
    • Flink运行时架构:Flink 是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理 Alt text

Flink和Streaming对比表格

Flink SparkStreaming
计算模型 流计算 微批处理
时间语义 事件时间、处理时间 处理时间
窗口 多、灵活 少、不灵活(窗口必须是批次的整数倍)
状态 有 没有
流式SQL 有 没有

6. Flink分层API

Alt text

  • 有状态流处理:通过底层API(处理函数),对最原始数据加工处理。底层API与DataStream API相集成,可以处理复杂的计算。
  • DataStream API(流处理)和DataSet API(批处理): 封装了底层处理函数,提供了通用的模块,比如转换(transformations,包括map、flatmap等),连接(joins),聚合(aggregations),窗口(windows)操作等。注意:Flink1.12以后,DataStream API已经实现真正的流批一体,所以DataSet API已经过时。
  • Table API: 是以表为中心的声明式编程,其中表可能会动态变化。Table API遵循关系模型:表有二维数据结构,类似于关系数据库中的表;同时API提供可比较的操作,例如select、join、group-by、aggregate等。我们可以在表与DataStream/DataSet之间无缝切换,以允许程序将Table API与DataStream以及DataSet混合使用。
  • SQL: 这一层在语法与表达能力上与Table API类似,但是是以SQL查询表达式的形式表现程序。SQL抽象与Table API交互密切,同时SQL查询可以直接在Table API定义的表上执行。

提示

  1. 越顶层越抽象,表达含义越简明,使用越方便。
  2. 越底层越具体,表达能力越丰富,使用越灵活。

评论