Flink

25 阅读3分钟

Flink 的核心目标是“数据流的有状态计算”。具体说明:Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。

  • 无界:有定义流的开始,没定义流的结束,比如 kafka,持续监听消息,会无休止产生数据
  • 有界:定义流的开始也定义流的结束,比如文件,可以在提取所有数据后再计算
  • 有状态流处理:把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态
    • 存储在内存中:优点:速度快;缺点:可靠性差
    • 存储在分布式系统中:优点:可靠性高,缺点:速度慢

主要特点:

  • 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟
  • 结果的准确性。Flink 提供了事件时间和处理时间语义,对于乱序事件流,事件时间语义仍能提供一致且准确的结果
  • 精确一次
  • 高可用。本身高可用的设置,加上与 k8s,YARN 和 Mesos 的紧密集成,再加上快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间 7×24 全天候运行

Flink 和 Spark 的区别

  • Spark 以批处理为根本,Spark 数据模型:采用 RDD 模型,Spark Streaming 的 DStream 实际上是一组组小批数据 RDD 的集合

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

Flink 分层 API

Flink 集群

集群角色

  • 客户端(Client):代码由客户端获取并做转换,之后提交给 JobManager
  • JobManager 就是 Flink 集群里的“管事人”,对作业进行中央调度管理;从而获取到要执行的作业后,会进一步处理转换,然后分发任务给众多的 TaskManager
  • TaskManager:就是真正干活的人,数据的处理操作都是由它们来做

集群创建

  1. 首先要安装 JDK
  2. 下载并解压压缩包到 opt/module
  3. 修改集群配置
  4. 修改 flink-conf.yaml 文件
# JobManager节点地址.
jobmanager.rpc.address: JobManager节点地址
jobmanager.bind-host: 0.0.0.0
# 客户端用来连接到服务器的地址。注意:只有当高可用性配置为NONE时,才会考虑此选项。
rest.address: JobManager节点地址
rest.bind-address: 0.0.0.0
# TaskManager节点地址.需要配置为当前机器名
taskmanager.bind-host: 0.0.0.0
taskmanager.host: 本机的地址

另外,在 flink-conf.yaml 文件中还可以对集群中的 JobManager 和 TaskManager 组件进行优化配置,主要配置项如下:

  • jobmanager.memory.process.size:对 JobManager 进程可使用到的全部内存进行配置,包括JVM 元空间和其他开销,默认为 1600M,可以根据集群规模进行适当调整。
  • taskmanager.memory.process.size:对 TaskManager 进程可使用到的全部内存进行配置,包括JVM 元空间和其他开销,默认为 1728M,可以根据集群规模进行适当调整。
  • taskmanager.numberOfTaskSlots:对每个 TaskManager 能够分配的 Slot 数量进行配置,默认为1,可根据 TaskManager 所在的机器能够提供给 Flink 的 CPU 数量决定。所谓 Slot 就是TaskManager 中具体运行一个任务所分配的计算资源。
  • parallelism.default:Flink 任务执行的并行度,默认为 1。优先级低于代码中进行的并行度配置和任务提交时使用参数指定的并行度数量。
  1. 修改 workers 文件,指定 node0、node1 和 flink1 为 TaskManager
  2. 修改 master 文件,指定主节点
  3. 将文件夹发送到两个节点
scp -r /opt/module/flink-1.17.0 root@机器1:/opt/module
  1. 修改 flink-conf.yaml taskmanager.host
  2. 访问 http://masterIP:8081