初识flink

导读

  1. flink 是怎样诞生的,有什么样的历史?
  2. 在大数据数据架构中,flink 扮演什么角色?
  3. flink 是什么,有什么样的基础架构?
  4. 怎么理解 flink 的状态?

flink的历史

  • 2010
    柏林工业大学、柏林洪堡大学、哈索普拉特纳研究所 联合发起的研究项目 [Stratosphere: Information Management on the Cloud]

  • 2014
    Stratosphere 更名为 Flink,并成为 Apache Software Fundation 顶级项目。
    Stratosphere 的核心成员创立 Data Artisans 公司,主要业务是将 Stratosphere 实现商业化,为企业提供大数据的解决方案。

  • 2015
    Alibaba 对 Flink 进行改造,Blink 诞生。

  • 2019
    Alibaba Blink 开源。
    Alibaba 收购 Data Artisans。

数据架构的演变

从数据架构的演变了解 flink 产生的背景。

传统数据基础架构

传统单体数据架构(Monolithic Architecture): 集中式数据存储。

单体应用前期效率高,随着业务的增加,系统越来越难以维护和升级。
引入微服务架构,解决业务扩展的问题。

微服务架构(Microservices Architecture):一个应用由多个小的、相互独立的微服务组成。数据分开存储,开发和部署没有依赖。

业务交易数据过于分散,难以集中化管理(数据分析或者数据挖掘之类的需求)。
将数据同步到数据仓库中,在数据仓库中进行数据的抽取、转换、加载(ETL),从而构建成不同的数据集市和应用。

大数据数据架构

Lambda架构是由Storm的作者Nathan Marz提出的一个实时大数据处理框架。Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm,Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。

Lambda架构关键特性

  • Robust and fault-tolerant(容错性和鲁棒性)

    人和机器的错误都有可能导致系统宕机,让系统能够从错误中快速恢复尤其重要。

  • Low latency reads and updates(低延时)

    很多应用对于读和写操作的延时要求非常高,要求对更新和查询的响应是低延时的。

  • Scalable(横向扩容)

    当数据量/负载增大时,可扩展性的系统通过增加更多的机器资源来维持性能。也就是常说的系统需要线性可扩展,通常采用scale out(通过增加机器的个数)而不是scale up(通过增强机器的性能)。

  • General(通用性)

    系统需要能够适应广泛的应用,包括金融领域、社交网络、电子商务数据分析等。

  • Extensible(可扩展)

    需要增加新功能、新特性时,可扩展的系统能以最小的开发代价来增加新功能。

  • Allows ad hoc queries(方便查询)

    数据中蕴含有价值,需要能够方便、快速的查询出所需要的数据。

  • Minimal maintenance(易于维护)

    系统要想做到易于维护,其关键是控制其复杂性,越是复杂的系统越容易出错、越难维护。

  • Debuggable(易调试)

    当出问题时,系统需要有足够的信息来调试错误,找到问题的根源。其关键是能够追根溯源到每个数据生成点。

Lambda架构推荐文档
AWS Lambda 服务文档

有状态流计算架构

在数据产生的过程中,进行计算,并直接产生结果。必须满足高性能、高吞吐、低延时等多目标。

Lambda 架构使数据与计算分离,而在实时计算层,对技术有了更高的要求。flink 正是满足了高吞吐、低延迟、高性能、高容错等特性,应运而生。

流数据处理产品对比

产品 模型 API 保证次数 容错机制 状态管理 延时 吞吐量
Storm Native
(数据进入立即处理)
组合式
(基础API)
At-least-once Record Acks(Ack机制) Low Low
Spark Stream mirco-batching
(微批量处理)
声明式
(封装后的高阶函数)
Exectly-once RDD Checkpoint(基于RDD checkpoint) 基于DStream Medium High
Flink Native
(数据进入立即处理)
声明式
(封装后的高阶函数)
Exectly-once Checkpoint(flink的快照) 基于操作 Low High

flink 是什么?

flink:数据流上有状态的计算

flink优势

  • 同时支持高吞吐、低延迟、高性能

    相对于 Spark Stream、Storm

  • 支持事件时间概念(Event Time)

    针对窗口计算

  • 支持有状态计算(State)

    状态:算子计算的中间结果。
    新的事件进入算子,可以从之前的状态中获取中间结果来计算当前的结果。

  • 支持高度灵活的窗口计算(Window)

    对流数据进行一定范围的计算。

  • 基于轻量级分布式快照实现的容错(Snapshot)

    CheckPoint

  • 基于JVM实现独立的内存管理

    flink实现了自身内存管理机制,尽可能地减少JVM GC对系统的影响。

  • 保存点(Save Points)

    任务执行快照保存在存储介质,任务重启时从Save Points恢复原有的计算状态。

flink 应用场景

事件驱动(Event-driven)

复杂事件处理

数据分析(Data Analytics)

实时大屏、实时报表、实时欺诈检测

数据管道(Data Pipeline)

实时智能推荐系统、实时数仓

官方中文文档
官方英文文档

flink 基础架构

flink 的核心组件和运行时组件

基本组件

从上往下:

  • API & Libraries 层

    提供批处理和流处理接口,同时在此基础上抽象出不同的应用类型的组件库。

  • Runtime 核心层

    主要负责对上层不同接口提供基础服务。
    支持分布式 Stream 作业的执行、JobGraph 到 ExecutionGraph 的映射转换、任务调度等。
    将 DataStream 和 DataSet 转成统一的可执行的 Task Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。

  • 物理部署层

    flink 部署模式,目前支持本地、集群(Standalone/YARN)、云(GCE/EC2)、Kubenetes。

运行时环境

运行时两种类型的程序:JobManagers(Masters)、TaskManagers(Workers)

  • JobManagers

    负责整个 Flink 集群任务调度及资源的管理。JobManagers 和 TaskManagers 之间通过 Actor System 进行通信。组件之间的通信是基于 Akka Framework 实现。

  • TaskManagers

    负责具体的任务执行和对应的任务在每个节点上的资源申请与管理。
    flink 的任务运行采用的是多线程的方式,在多个任务和 Task 之间通过 TaskSlot 方式共享系统资源,每个 TaskManager 中管理多个 TaskSlot 资源池。


Tasks、Operator Chains

在分布式执行程序中,Operator Chains 将 subtasks 连接在 Tasks 中。每一个 Task 由一个线程执行。


Task Slots、Resources

Task Slots、Subtasks、TaskManage之间的关系

Taskmanage 是一个独立的 JVM 程序,Subtasks 在独立的线程中执行,Task Slots(任务槽)控制着多少个任务可以被执行。Slots 保留并管理内存空间,但是并没有独立的 CPU 。

Task Slots 任务槽资源共享

Task Slots 资源共享有两个好处:

  • 不需要计算一个程序总共包含多少个任务。
  • 可以更好地利用资源。(非密集型子任务和资源密集型窗口子任务)

State Backends

State Backends 决定了state如何被存储、访问和维持。它的主要职责是本地 state 管理和checkpoint state到远程。在管理方面,可选择将 state 存储到内存还是磁盘。

总结

参考文档

https://ci.apache.org/projects/flink/flink-docs-release-1.10/concepts/runtime.html
《Flink原理、实践与性能优化》— 机械工业出版社、张利兵著
https://www.cnblogs.com/code2one/p/10123112.html
http://www.54tianzhisheng.cn/2018/10/13/flink-introduction/
https://jiang-hao.com/articles/2019/big-data-lambda-architecture.html
https://blog.csdn.net/github_39577257/article/details/94230550

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 Andrew
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信