走进Flink

  • 什么是Flink

    • Flink是一个分布式的、高性能的、可伸缩的、容错的流处理引擎,它支持批处理和流处理,并提供了丰富的 API 和库,是实时数据处理的理想选择
    • 由Java 和 Scala 实现的,所以所有组件都会运行在Java 虚拟机【单个JVM也可以】上
    • 不需要依赖于hadoop集群的组件
  • 优缺点

    • 优点

      • 事件驱动型。Flink的事件驱动型应用是一类具有状态的应用,它从一个或多个事件流提取数据,并根据到来的事件触发计算、状态更新或其他外部动作。
      • 高吞吐、低延迟、高性能。Flink被设计在所有常见的集群环境中运行,以内存执行速度和任意规模来执行计算。
      • 强大的容错机制。Flink使用两阶段提交协议来解决容错问题。
    • 缺点

      • Flink的API较难使用。
      • Flink的社区相对较小。
  • 应用场景

    • 事件驱动的应用:Flink应用每接受一条数据,就会处理一条数据,处理之后就会触发一个动作,同时也可以将处理结果写入外部消息队列中,其他Flink应用再消费。
    • 智能推荐: 根据用户历史的购买行为,通过推荐算法训练模型,预测用户未来可能会购买的物品。【例如:实时统计每隔1秒统计最近2秒单词出现的次数,可以直接使用Flink训练的API】
    • 复杂事件处理: 比较常见的案例主要集中于工业领域,例如对车载传感器、机械设备等实时故障检测。
    • 实时计算: 实时监控、实时报表(实时化采集、加工流式数据存储)、流数据分析、实时仓库。
  • 架构组件

    • 作业管理器(JobManager)
      • 控制一个应用程序的主进程,每个应用程序都会被一个不同的JobManager 所控制执行。JobManager 会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager 上。而在运行过程中,JobManager 会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。
    • 资源管理器(ResourceManager)
      • 负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是 Flink 中定义的处理资源单元。Flink 为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及 standalone 部署。当 JobManager 申请插槽资源时,ResourceManager会将有空闲插槽的 TaskManager 分配给 JobManager。如果 ResourceManager 没有足够的插槽来满足 JobManager 的请求,它还可以向资源提供平台发起会话,以提供启动 TaskManager进程的容器。另外,ResourceManager 还负责终止空闲的 TaskManager,释放计算资源。
    • 任务管理器(TaskManager)
      • 是一个工作进程,通常在 Flink 中会有多个 TaskManager 运行,每一个 TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制了 TaskManager 能够执行的任务数量。启动之后,TaskManager 会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager 就会将一个或者多个插槽提供给 JobManager 调用。JobManager 就可以向插槽分配任务(tasks)来执行了。在执行过程中,一个 TaskManager 可以跟其它运行同一应用程序的 TaskManager 交换数据。
    • 分发器(Dispatcher)
      • 负责接收用户提交的作业,并且将作业提交给作业管理器。
  • 工作原理

    • 自身

      • ①由应用端(App)提交应用给分发器(dispatcher)
      • ②Dispatcher启动并提交应用给JobManager
      • ③JobManager向resourcemanager请求slots(插槽)资源
      • ④resourcemanager收到了JobManager的资源请求后,就去启动TaskManager
      • ⑤TaskManger启动之后,会去resourcemanager注册slots
      • ⑥resourcemanager收到TaskManger的注册slots请求后,会给TaskManger发出提供slot的指令
      • ⑦TaskManager接到指令后,JobManager会被告知已有所需数量的slots使用。
      • ⑧JobManager得知有足够的slots可以使用后,就会提交要执行的任务给TaskManager
      • ⑨与此同时,TaskManager之间也会进行数据的交换
    • 依赖于Hadoop集群的Yarn

      • ①Flink客户端上传flink的jar包和配置到HDFS
      • ②客户端提交job到resourcemanager(yarn)
      • ③resourcemanager启动ApplicationMaster,同时ApplicationMaster启动JobManager,之后jobmanager从HDFS上加载Flink的jar包和配置环境(除了yarn的resourcemanager,flink也有自己的resourcemanager,只不过它不管理资源,而是由yarn的resourcemanager管理资源)
      • ④jobmanager向resourcemanager申请资源
      • ⑤jobmanager申请到资源后,启动TaskManager,同样TaskManager向flink的ResourceManager注册slot,因此jobmanager得知有足够的slots可以使用,就会将job任务提交给TaskManager去执行,同时taskmanager会从HDFS加载flink的jar包和环境配置。
  • 基本概念

    • 处理无界和有界数据

      • 无界流: 有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
      • 有界流 : 有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理
  • 常踩的坑

    • 数据延迟:当外部组件往Kafka topic在写数据,而同时Flink正在消费这个topic的数据,如果外部组件出现问题,就会发生数据晚到的现象。
    • 乱序数据:由于Flink能通过延迟水印来支持乱序,所以即使数据出现乱序,Flink也可以处理。
    • 日志记录过多:在处理窗口时,需要测量花费的时间,只要计算窗口所需的时间超过1分钟,就记录下所有可能的数据,过多的记录会降低性能。
    • 卡住作业的调查:需要找到一种简单的方法,来定位作业疑似卡住时当前正在运行的代码段。
  • 初学者

    • Flink Shell
      • 开发的时候容易出错,如果每次都打包进行调试,比较麻烦,并且也不好定位问题,可以在scala shell命令行下进行调试
相关推荐
Doker 多克18 小时前
Flink CDC —部署模式
大数据·flink
酷爱码19 小时前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
问道飞鱼19 小时前
Flink 高可用集群部署指南
flink·部署·批处理·流式批处理
渣渣盟1 天前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
网安INF1 天前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈1 天前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
代码匠心2 天前
从零开始学Flink:揭开实时计算的神秘面纱
java·大数据·后端·flink
Apache Flink3 天前
Flink在B站的大规模云原生实践
大数据·云原生·flink
lifallen3 天前
Flink checkpoint
java·大数据·算法·flink
长河3 天前
Flink 重启后事件被重复消费的原因与解决方案
大数据·flink