走进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命令行下进行调试

你可能感兴趣的:(flink)