流系统漫游(持续更新中...)

本文从谷歌Dataflow system论文的角度初探streaming system。谷歌从GFS、MapReduce开始,到目前的分布式操作系统Borg和流系统,大部分的论文都是从描述现实的应用场景出发,然后提出解决方案。其本质是需求驱动技术的发展。目前大部分的科研是:提出一种方法,解决一个问题,方法的效果。与单纯的科研驱动发展不同比如数理化,单纯的研究最开始时是没有实用价值的,但后来才被自动化机器学习等专业应用后证明其应用潜力。

1. 应用场景

一个流媒体视频提供商(Google)想要通过显示视频广告和向广告客户(Apple)收取观看广告的费用来实现广告变现。

该平台(YOutube)支持内容和广告的在线和离线查看。视频提供商想知道每天每个广告客户需要支付多少费用,并收集有关视频和广告的统计数据。此外,他们还想对大量的历史数据进行有效的离线实验。

广告商/内容提供商想要知道他们的视频被观看的频率和时间,观看的内容/广告是什么,观看的人群是什么。他们也想知道他们要付多少钱。他们希望尽可能快地获得所有这些信息,这样他们就可以调整预算和投标,改变目标,调整活动,并尽可能实时地规划未来的方向。因为涉及到钱,所以正确性是最重要的。

虽然数据处理系统本质上是复杂的,但是视频提供商需要一个简单而灵活的编程模型。最后,由于互联网极大地扩展了任何可以沿着其主干分布的业务的范围,它们还需要一个能够处理全球范围内散居的数据的系统。

对于这样的用例,必须计算的信息本质上是每个视频观看的时间和长度、谁观看了它,以及它与哪个广告或内容配对(即每个用户、每个视频观看会话)。从概念上讲,这很简单,但是现有的模型和系统都不能满足规定的需求。

2. 平台

Flink是一个流系统,在德语中, Flink 一词表示快速和灵巧,项目采用一只松鼠的彩色图案作为 logo,
这不仅是因为松鼠具有快速和灵巧的特点,还因为柏林的松鼠有一种迷人的红棕色,
而 Flink 的松鼠 logo 拥有可爱的尾巴,尾巴的颜色与 Apache 软件基金会的 logo 颜
色相呼应,也就是说,这是一只 Apache 风格的松鼠。

Flink 项目的理念是:“ Apache Flink 是为分布式、高性能、随时可用以及准确
的流处理应用程序打造的开源流处理框架”。
Apache Flink 是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 Flink 被设计在所有常见的集群环境中运行,以内存执行速度和任意规模
来执行分布式计算。

3. Flink架构

image

4.1 事件驱动型(Event-driven)

应用从一个或多个事件流提取数据,并
根据到来的事件触发计算、状态更新或其他外部动作。比较典型的就是以 kafka 为
代表的消息队列几乎都是事件驱动型应用(但是与Sparkstreaming不同)。

image

4.2 流与批的世界观

  • 批处理的特点是有界、持久、大量, 非常适合需要访问全套记录才能完成的计
    算工作,一般用于离线统计。
  • 流处理的特点是无界、实时, 无需针对整个数据集执行操作,而是对通过系统
    传输的每个数据项执行操作,一般用于实时统计。

在 spark 的世界观中,一切都是由批次组成的,离线数据是一个大批次,而实
时数据是由一个一个无限的小批次组成的。

而在 flink 的世界观中,一切都是由流组成的,离线数据是有界限的流,实时数
据是一个没有界限的流,这就是所谓的有界流和无界流。

5. Flinkj架构

只要由作业管理器(JobManager)、资源管理器(ResourceManager)、任务管理器(TaskManager),
以及分发器(Dispatcher)组成。

JogManager

控制应用程序执行的主进程,每个应用程序都会被一个不同的
JobManager 所控制执行。 JobManager 会先接收到要执行的应用程序, 这个应用程序会包括:
作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它
资源的 JAR 包。 JobManager 会把 JobGraph 转换成一个物理层面的数据流图,这个图被叫做
“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。 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 交换数据。

else

实践

flink安装

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2021 John Doe
  • PV: UV:

请我喝杯咖啡吧~

微信