Flink

Flink

概述

Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算.Apache Flink 擅长处理无界和有界数据集 精确的时间控制和状态化使得 Flink 的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。

架构

Flink_第1张图片

JobManager

JobManager 具有许多与协调 Flink 应用程序的分布式执行有关的职责:它决定何时调度下一个 task(或一组 task)、对完成的 task 或执行失败做出反应、协调 checkpoint、并且协调从失败中恢复等等。这个进程由三个不同的组件组成:

ResourceManager

负责 Flink 集群中的资源提供、回收、分配 - 它管理 task slots,这是 Flink 集群中资源调度的单

Dispatcher

提供了一个 REST 接口,用来提交 Flink 应用程序执行,并为每个提交的作业启动一个新的 JobMaster。它还运行 Flink WebUI 用来提供作业执行信息。

JobMaster

JobMaster 负责管理单个JobGraph的执行。Flink 集群中可以同时运行多个作业,每个作业都有自己的 JobMaster。

始终至少有一个 JobManager。高可用(HA)设置中可能有多个 JobManager,其中一个始终是 leader,其他的则是 standby

TaskManagers

TaskManager(也称为 worker)执行作业流的 task,并且缓存和交换数据流。

必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子。

Flink 和 Spark Streaming 区别

Flink 是标准的实时处理引擎,基于事件驱动。而 Spark Streaming 是微批(Micro-Batch)的模型。

架构模型

Spark Streaming 在运行时的主要角色包括:Master、Worker、Driver、Executor, Flink 在运行时主要包含:Jobmanager、Taskmanager 和 Slot。

任务调度

Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图 DAG

Flink 根据 JobGraph 生成 ExecutionGraph

时间机制

Spark Streaming 只支持处理时间。

Flink 支持了流 处理程序在时间上的三个定义:处理时间、事件时间、注入时间。同时也支持 watermark 机 制来处理滞后数据.

容错机制

Spark Streaming 可以设置 checkpoint,但故障并重启后,可能会数据重复。

Flink 则使用两阶段提交协议来解决这个问题。

API层

Flink_第2张图片

  • Flink API 最底层的抽象为有状态实时流处理

    注册事件时间(event time)和处理时间(processing time)回调方法

  • Flink API 第二层抽象是 Core APIs

    各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等

  • Flink API 第三层抽象是 Table API

    比如 select、project、join、group-by 和 aggregate 等

  • Flink API 最顶层抽象是 SQL

    通常结合Table API中使用

Event Time

  • 事件时间(event time): 事件产生的时间,记录的是设备生产(或者存储)事件的时间
  • 摄取时间(ingestion time): Flink 读取事件时记录的时间
  • 处理时间(processing time): Flink pipeline 中具体算子处理事件的时间

Watermarks

定义何时停止等待较早的事件。

假设a比b发生的早,但是b先来了,我们必须等待a到了才能开始处理。

Windows

Flink_第3张图片

  • 滚动时间窗口
    • 每分钟页面浏览量
    • TumblingEventTimeWindows.of(Time.minutes(1))
  • 滑动时间窗口
    • 每10秒钟计算前1分钟的页面浏览量
    • SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
  • 会话窗口
    • 每个会话的网页浏览量,其中会话之间的间隔至少为30分钟
    • EventTimeSessionWindows.withGap(Time.minutes(30))

你可能感兴趣的:(大数据面试,flink,大数据,spark)