为什么说,MapReduce,颠覆了互联网分层架构的本质?

简介: 为什么说,MapReduce系统架构,颠覆了互联网分层架构的本质? 下图是一个典型的,互联网分层架构:客户端层:典型调用方是浏览器browser或者手机APP 站点应用层:实现核心业务逻辑,从下游获取数据,对上游返回html或者json 服务层:业务服务,数据服务,基础服务,对上游提供友好的RPC接口 数据缓存层:缓存加速访问存储 数据固化层:数据库固化数据存储 同一个层次的内部,例如端上的APP,以及web-server,也都会进行MVC分层:view层:展现 control层:逻辑 model层:数据 工程师骨子里,都潜移默化的实施着分层架构设计。

为什么说,MapReduce系统架构,颠覆了互联网分层架构的本质?

下图是一个典型的,互联网分层架构:
image
客户端层:典型调用方是浏览器browser或者手机APP

站点应用层:实现核心业务逻辑,从下游获取数据,对上游返回html或者json

服务层:业务服务,数据服务,基础服务,对上游提供友好的RPC接口

数据缓存层:缓存加速访问存储

数据固化层:数据库固化数据存储

同一个层次的内部,例如端上的APP,以及web-server,也都会进行MVC分层:
image
view层:展现

control层:逻辑

model层:数据

工程师骨子里,都潜移默化的实施着分层架构设计。

互联网分层架构的本质究竟是什么呢?

如果我们仔细思考会发现,不管是跨进程的分层架构,还是进程内的MVC分层,都是一个“数据移动”,然后“被处理”和“被呈现”的过程。
image
如上图所示:

数据处理和呈现,需要CPU计算,而CPU是固定不动的:

db/service/web-server都部署在固定的集群上

端上,不管是browser还是APP,也有固定的CPU处理

而数据是移动的:

跨进程的:数据从数据库和缓存里,转移到service层,到web-server层,到client层

同进程的:数据从model层,转移到control层,转移到view层

归根结底一句话:互联网分层架构,是一个CPU固定,数据移动的架构。

画外音:更详细的分析,详见《互联网分层架构的本质》。

MapReduce的架构,是不是也遵循这个架构特点呢?

假如MapReduce也使用类似的的分层架构模式:
image
提前部署服务:

map服务层:接收输入数据,产出“分”的数据,集群部署M=1W个实例

reduce服务层:接受“合”的数据,产出最终数据,集群部署R=1W个实例

当用户提交作业时:

(1) 把数据数据传输给map服务集群;

(2) map服务集群产出结果后,把数据传输给reduce服务集群;

(3) reduce服务集群把结果传输给用户;

存在什么问题?

将有大量的时间浪费在大量数据的网络传输上。

画外音:输入给map,map给reduce,reduce给用户。

会发现,“固定CPU,移动数据”的架构并不适合。

Google MapReduce工程架构是如何思考这一个问题的呢?
image
问了减少数据量的传输:

(1) 输入数据,被分割为M块后,master会尽量将执行map函数的worker实例,启动在输入数据所在的服务器上;

画外音:不需要网络传输了。

(2) map函数的worker实例输出的的结果,会被分区函数划分成R块,写到worker实例所在的本地磁盘;

画外音:不需要网络传输了。

(3) reduce函数,由于有M个输入数据源(M个map的输出都有一部分数据可能对应到一个reduce的输入数据),所以,master会尽量将执行reduce函数的worker实例,启动在离这些输入数据源尽可能“近”的服务器上;

画外音:目的也是最小化网络传输;

服务器之间的“近”,可以用内网IP地址的相似度衡量。

所以,对于MapReduce系统架构,“固定数据,移动CPU”更为合理。

这是为什么呢?

互联网在线业务的特点是:

总数据量大

吞吐量比较大,同时发起的请求多

每个请求,处理的数据相对比较小

用户对处理时延比较敏感

这类业务,使用“固定CPU,移动数据”的分层架构是合理的。

MapReduce离线业务的特点是:

吞吐量比较小,同时发起的任务比较少

每个任务,处理的数据量非常大

用户对处理时延容忍性大

这类业务,使用“固定数据,移动CPU”的分层架构是合理的。
任何脱离业务的架构设计,都是耍流氓。

思考问题的本质,希望大家有收获。
原文发布时间为:2018-12-14
本文作者: 58沈剑
本文来自云栖社区合作伙伴“ 架构师之路”,了解相关信息可以关注“road5858”微信公众号

相关文章
|
2月前
|
负载均衡 关系型数据库 应用服务中间件
高可用系列文章之二 - 传统分层架构技术方案
高可用系列文章之二 - 传统分层架构技术方案
|
18天前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
41 0
|
1月前
|
分布式计算 API 数据处理
Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
【2月更文挑战第15天】Flink【基础知识 01】(简介+核心架构+分层API+集群架构+应用场景+特点优势)(一篇即可大概了解flink)
55 1
|
2月前
|
存储 自然语言处理 前端开发
软考实践之分层架构思想的理论和应用实践
软考实践之分层架构思想的理论和应用实践
216 0
|
2月前
|
消息中间件 前端开发 测试技术
DDD - 分层架构:有效降低层与层之间的依赖
DDD - 分层架构:有效降低层与层之间的依赖
|
3月前
|
XML Dubbo Java
【面试问题】Dubbo 的整体架构设计有哪些分层?
【1月更文挑战第27天】【面试问题】Dubbo 的整体架构设计有哪些分层?
|
3月前
|
存储 缓存 监控
【分布式】大型互联网项目架构目标
【1月更文挑战第25天】【分布式】大型互联网项目架构目标
|
3月前
|
达摩院 Java Apache
惊动“达摩院”的分布式架构笔记:火于互联网,据说来自于清华
一个星期前,一本Java架构笔记突然在互联网上爆火。因为内容的深度和广度,甚至连阿里最牛的研发中心都被惊动了,而且作者一周后直接被阿里挖走后定级P8,据说作者来自于清华。
|
8天前
|
API 数据库 开发者
构建高效可靠的微服务架构:后端开发的新范式
【4月更文挑战第8天】 随着现代软件开发的复杂性日益增加,传统的单体应用架构面临着可扩展性、维护性和敏捷性的挑战。为了解决这些问题,微服务架构应运而生,并迅速成为后端开发领域的一股清流。本文将深入探讨微服务架构的设计原则、实施策略及其带来的优势与挑战,为后端开发者提供一种全新视角,以实现更加灵活、高效和稳定的系统构建。
14 0
|
22天前
|
负载均衡 测试技术 持续交付
高效后端开发实践:构建可扩展的微服务架构
在当今快速发展的互联网时代,后端开发扮演着至关重要的角色。本文将重点探讨如何构建可扩展的微服务架构,以及在后端开发中提高效率的一些实践方法。通过合理的架构设计和技术选型,我们可以更好地应对日益复杂的业务需求,实现高效可靠的后端系统。