-
什么是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)
- 负责接收用户提交的作业,并且将作业提交给作业管理器。
- 作业管理器(JobManager)
-
工作原理
-
自身
- ①由应用端(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 Shell
走进Flink
、小H2023-10-13 21:13
相关推荐
静听山水3 小时前
Flink CEP 入门给我整点护发素9 小时前
Flink执行sql时报错好记性+烂笔头1 天前
Flink_DataStreamAPI_输出算子Sink我的K84091 天前
Flink整合Hive、Mysql、Hbase、Kafka宝哥大数据2 天前
Flink Job更新和恢复LiWang1123583 天前
FlinkPipelineComposer 详解Denny辉3 天前
Flink使用SQL Gateway提交SQL Job到远程集群武子康3 天前
大数据-218 Prometheus 插件 exporter 与 pushgateway 配置使用 监控服务 使用场景我的K84094 天前
Flink独立集群+Flink整合yarnTech Synapse4 天前
用Java实现samza转换成flink