《分布式技术原理与算法解析》总结三:分布式计算技术

调度架构中的两层调度的第二层调度是由框架完成的,通常就是计算框架,比如 Hadoop、Spark 等;
程序员基于这些计算框架,可以完成不同类型和规模的计算。

分布式计算的本质就是在分布式环境下,多个进程协同完成一件复杂的事情;
每个进程各司其职,完成自己的工作后,再交给其他进程去完成其他工作;
对于没有依赖的工作,进程间是可以并行执行的。

1 MapReduce

核心思想:分而治之,JDK的Fork-Join也是此思想的框架

步骤:

1 分解原问题(Map):将原问题分解为若干个规模较小,相互独立,且与原问题形式相同的子问题;

2 求解子问题:若子问题规模较小且容易被解决则直接求解,否则递归地求解各个子问题;

3 合并解(Reduce):将各个子问题的解合并为原问题的解

MapReduce 主要包括以下三种组件:
在这里插入图片描述
Master(MRAppMaster):负责分配任务,协调任务的运行,并为 Mapper 分配 map() 函数操作、为 Reducer 分配 reduce()函数操作;
Mapper worker:负责 Map 函数功能,即负责执行子任务;
Reducer worker:负责 Reduce 函数功能,即负责汇总各个子任务的结果

工作流程图:
在这里插入图片描述
MapReduce的任务运行完成之后,整个任务进程就结束了,属于短任务模式;
任务进程的启动和停止很耗时,所以MapReduce 不适合处理实时性的任务:它会先收集数据并将其缓存起来,等到缓存写满时才开始处理数据。因此,批量计算的一个缺点就是,从数据采集到得到计算结果之间经历的时间很长

2 Stream

实时性任务主要是针对流数据的处理,对处理时延要求很高,通常需要有常驻服务进程,等待数据的随时到来随时处理,以保证低时延;
处理流数据任务的计算模式,在分布式领域中叫作 Stream。

流数据的特征:如直播产生的音视频数据流

数据持续、快速地到达;

数据规模很大(TB 、 PB );

对实时性要求高,随着时间流逝,数据的价值会大幅降低

数据顺序无法保证,也就是说系统无法控制将要处理的数据元素的顺序。

数据一旦产生就会被立即处理,当一条数据被处理完成后,会序列化存储到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理;
在流计算中,不会存储任何数据,会一直在流转

步骤:
在这里插入图片描述

为了及时处理流数据,流计算框架必须是低延迟、可扩展、高可靠的

3 Actor

MapReduce 和 Stream 计算模式虽然对数据的处理方式不同,但都是以特定数据类型(分别对应静态数据和动态数据)作为计算维度

Actor 和流水线则是以计算过程或处理过程作为维度的

Actor代表一种分布式并行计算模型;
这种模型有自己的一套规则,规定了 Actor 的内部计算逻辑,以及多个 Actor 之间的通信规则;
在Actor模型里,每个Actor相当于系统中的一个组件,都是基本的计算单元;

计算方式与传统面向对象编程模型(OOP)类似,一个对象接收到一个方法的调用请求(类似于一个消息),从而去执行该方法;
不过由于OOP中数据封装在一个对象中,不能被外部访问,当多个外部对象通过方法调用方式,即同步方式进行访问时,会存在死锁、竞争等问题,无法满足分布式系统的高并发性需求;
而 Actor 模型通过消息通信,采用的是异步方式(队列),克服了OOP的局限性,适用于高并发的分布式系统。

Actor 模型的三要素是状态、行为和消息:Actor 模型 =(状态 + 行为)+ 消息

状态(State):Actor 组件本身的信息,相当于 OOP 对象中的属性;
Actor 的状态会受 Actor 自身行为的影响,且只能被自己修改

行为(Behavior):Actor 的计算处理操作,相当于 OOP 对象中的成员函数;
Actor 之间不能直接调用其他 Actor 的计算逻辑。Actor 只有收到消息才会触发自身的计算行为

消息(Mail):Actor 的消息以邮件形式在多个 Actor 之间通信传递,每个 Actor 会有一个自己的邮箱(MailBox),用于接收来自其他 Actor 的消息,因此 Actor 模型中的消息也称为邮件;
一般情况下,对于邮箱里面的消息,Actor 是按照消息达到的先后顺序(FIFO)进行读取和处理的

工作原理:如图可以看到Actor2使用队列进行处理
在这里插入图片描述
优点:

实现了比OOP更高级的抽象:Actor 之间是异步通信的,多个 Actor 可以独立运行且不会被干扰,解决了 OOP存在的竞争问题

非阻塞性:Actor 模型通过引入消息传递机制,从而避免了阻塞

无需使用锁:Actor 从 MailBox 中一次只能读取一个消息,也就是说,Actor 内部只能同时处理一个消息,是一个天然的互斥锁,所以无需额外对代码加锁

并发度高:每个 Actor 只需处理本地 MailBox 的消息,因此多个 Actor 可以并行地工作,从而提高整个分布式系统的并行处理能力

易扩展:每个 Actor 都可以创建多个 Actor,从而减轻单个 Actor 的工作负载;
当本地Actor 处理不过来的时候,可以在远程节点上启动 Actor 然后转发消息过去。

缺点:

Actor 缺少继承和分层,代码复用性小

Actor 可以动态创建多个 Actor,使得整个 Actor 模型的行为不断变化,不易实现

增加 Actor 的同时,也会增加系统开销

不适用于对消息处理顺序有严格要求的系统;
因为消息均为异步消息,无法确定每个消息的执行顺序;
改进:可以通过阻塞 Actor 去解决顺序问题,但会严重影响 Actor 模型的任务处理效率

场景:Akka

4 流水线

将一个大任务拆分为多个步骤执行,不同的步骤可以采用不同的进程执行,这样不同的任务可以并行执行,从而提高了系统效率

场景:机器学习流水线处理

流水线模式和 MapReduce 模式中,都有将大任务拆分为多个子任务,两者的区别在于划分粒度和子任务的关系:

MapReduce 以任务为粒度,将大的任务划分成多个小任务,每个任务都需要执行完整的、相同的步骤,同一任务能被并行执行,可以说是任务并行的一种计算模式;
流水线计算模式以步骤为粒度,一个任务拆分为多个步骤,每个步骤执行的是不同的逻辑,多个同类型任务通过步骤重叠以实现不同任务的并行计算,可说是数据并行的一种模式。

MapReduce中各个子任务可以独立执行,互不干扰,多个子任务执行完后,进行结果合并得到整个任务的结果,因此要求子任务之间是没有依赖关系的;
流水线模式中多个子任务之间是具有依赖关系的,前一个子任务的输出是后一个子任务的输入

MapReduce 计算模式适合任务并行的场景,而流水线计算模式适合同类型任务数据并行处理的场景。

发布了237 篇原创文章 · 获赞 266 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41594698/article/details/105244689