浅谈Flink(一)

浅谈Flink(一)

大家好!我是栗子鑫,笔者最近已经正式步入职场了,最近leader让我学习Flink,以后做一个Flink SE,笔者只能默默接受,下文是笔者学习Flink的一些知识,希望对你们有所帮助。

1.简介

借用Flink的一句话来讲:Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行状态计算。Flink 被设计为在所有常见的集群环境中运行,以内存速度和任何规模执行计算。凭借官网简短的介绍可以看出它是一个支持高吞吐、低延迟、高性能的分布式处理框架。同时Flink 功能强大,支持开发和运行多种不同种类的应用程序。它的主要特性包括:批流一体化和事件时间支持以及精确一次的状态一致性保障等。Flink 不仅可以运行在包括 YARN、K8s 在内的多种资源管理框架上,还支持在裸机集群上独立部署。在启用高可用选项的情况下,它不存在单点失效问题。

2.Flink运行时的数据

在现实场景中数据主要分为两类:有界数据流(Bounded streams)无界数据流(Unbounded streams)

2.1 有界数据流

顾名思义就是输入的数据有界限,比如某一天财经系统交易的财务信息。可以通过在执行任何计算之前摄取所有数据来处理有界流。处理有界流不需要有序摄取,因为始终可以对有界数据集进行排序。对于这种数据流都会使用批处理来处理数据。

2.2 无界流数据

无界数据流就是指有始无终的数据,数据一旦开始生成就会持续不断的产生新的数据,即数据没有时间边界。例如网站的运行的日志文件。无界数据流需要持续不断地处理。

两者区别

浅谈Flink(一)

3.Flink运行时的框架

首先介绍一下Flink运行时整个框架(这里借用官网的图)。

浅谈Flink(一)

上图可知主要运行时包括了Client、JobManager和多个TaskManager。

Client 不是运行时和程序执行的一部分,而是用于准备数据流并将其发送给 JobManager。用户开发的Program 代码,它会构建出DataFlow graph之后,客户端可以断开连接(分离模式),或保持连接来接收进程报告(附加模式)。客户端可以作为触发执行 Java/Scala 程序的一部分运行,也可以在命令行进程./bin/flink run ...中运行。

主要的运行时涉及到的进程主要是JobManager和TaskManager。

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

  • ResourceManager

    ResourceManager 负责 Flink 集群中的资源提供、回收、分配管理 task slots,这是 Flink 集群中资源调度的单位。Flink 为不同的环境和资源提供者(例如 YARN、K8s 和 standalone 部署)实现了对应的 ResourceManager。在 standalone 设置中,ResourceManager 只能分配可用 TaskManager 的 slots,而不能自行启动新的 TaskManager。

  • Dispatcher

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

  • JobMaster

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

TaskManager也称为 worker执行作业流的 task,并且缓存和交换数据流。必须始终至少有一个 TaskManager。在 TaskManager 中资源调度的最小单位是 task slot。TaskManager 中 task slot 的数量表示并发处理 task 的数量。请注意一个 task slot 中可以执行多个算子。每个 worker(TaskManager)都是一个 JVM 进程,可以在单独的线程中执行一个或多个 subtask。为了控制一个 TaskManager 中接受多少个 task,就有了所谓的 task slots(至少一个)。

Task Slots:每个 task slot 代表 TaskManager 中资源的固定子集。例如,具有 3 个 slot 的 TaskManager,会将其托管内存 1/3 用于每个 slot。分配资源意味着 subtask 不会与其他作业的 subtask 竞争托管内存,而是具有一定数量的保留托管内存。注意此处没有 CPU 隔离;当前 slot 仅分离 task 的托管内存。通过调整 task slot 的数量,用户可以定义 subtask 如何互相隔离。每个 TaskManager 有一个 slot,这意味着每个 task 组都在单独的 JVM 中运行(例如,可以在单独的容器中启动)。具有多个 slot 意味着更多 subtask 共享同一 JVM。同一 JVM 中的 task 共享 TCP 连接(通过多路复用)和心跳信息。它们还可以共享数据集和数据结构,从而减少了每个 task 的开销。

浅谈Flink(一)

默认情况下,Flink 允许 subtask 共享 slot,即便它们是不同的 task 的 subtask,只要是来自于同一作业即可。结果就是一个 slot 可以持有整个作业管道。允许 slot 共享有两个主要优点:

  • Flink 集群所需的 task slot 和作业中使用的最大并行度恰好一样。无需计算程序总共包含多少个 task(具有不同并行度)。

  • 容易获得更好的资源利用。如果没有 slot 共享,非密集 subtask( source/map() )将阻塞和密集型 subtask(window) 一样多的资源。通过 slot 共享,我们示例中的基本并行度从 2 增加到 6,可以充分利用分配的资源,同时确保繁重的 subtask 在 TaskManager 之间公平分配。

4.Flink中的API

Flink 为流式/批式处理应用程序的开发提供了不同级别的抽象。

浅谈Flink(一)

对于我们程序开发者来说一般只会用到第三层,一般会用到 DataStream API(应用于有界/无界数据流场景)和 DataSet API(应用于有界数据集场景)两部分。Core APIs 提供的流式 API(Fluent API)为数据处理提供了通用的模块组件,例如各种形式的用户自定义转换(transformations)、联接(joins)、聚合(aggregations)、窗口(windows)和状态(state)操作等。此层 API 中处理的数据类型在每种编程语言中都有其对应的类。

对于第一、二以及第四层这里不在过多介绍,如果想进一步了解,移步于Flink官网[2]

5.总结

笔者也是第一次接触Flink,只是进行简短的介绍,希望对你有所帮助。后期笔者会进一步去探讨学习Flink,希望和大家共同进步。

参考资料

[1]

JobGraph: https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/concepts/glossary/#logical-graph

[2]

Flink官网: https://nightlies.apache.org/flink/flink-docs-release-1.15/zh/docs/concepts/overview/



作者    栗子鑫

编辑   一口栗子  



浅谈Flink(一)

浅谈Flink(一)

浅谈Flink(一)

浅谈Flink(一)


原文始发于微信公众号(六只栗子):浅谈Flink(一)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88432.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!