为什么说,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”微信公众号

相关文章
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
大数据-80 Spark 简要概述 系统架构 部署模式 与Hadoop MapReduce对比
65 2
|
27天前
|
人工智能 前端开发 JavaScript
前端架构思考 :专注于多框架的并存可能并不是唯一的方向 — 探讨大模型时代前端的分层式微前端架构
随着前端技术的发展,微前端架构成为应对复杂大型应用的流行方案,允许多个团队使用不同技术栈并将其模块化集成。然而,这种设计在高交互性需求的应用中存在局限,如音视频处理、AI集成等。本文探讨了传统微前端架构的不足,并提出了一种新的分层式微前端架构,通过展示层与业务层的分离及基于功能的横向拆分,以更好地适应现代前端需求。
|
1月前
|
JSON 前端开发 Java
Spring Boot框架中的响应与分层解耦架构
在Spring Boot框架中,响应与分层解耦架构是两个核心概念,它们共同促进了应用程序的高效性、可维护性和可扩展性。
51 3
|
1月前
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
|
3月前
|
存储 消息中间件 JSON
|
3月前
|
数据库 Java 数据库连接
Hibernate 实体监听器竟如魔法精灵,在 CRUD 操作中掀起自动化风暴!
【8月更文挑战第31天】在软件开发中,效率与自动化至关重要。Hibernate 通过其强大的持久化框架提供了实体监听器这一利器,自动处理 CRUD 操作中的重复任务,如生成唯一标识符、记录更新时间和执行清理操作,从而大幅提升开发效率并减少错误。下面通过示例代码展示了如何定义监听器类,并在实体类中使用 `@EntityListeners` 注解来指定监听器,实现自动化任务。这不仅简化了开发流程,还能根据具体需求灵活应用,满足各种业务场景。
37 0
|
3月前
|
NoSQL API 数据库
揭秘!Flask如何一键解锁RESTful API高效微服务?打造未来互联网架构的隐形力量!
【8月更文挑战第31天】本文介绍如何使用 Flask 构建高效且易维护的 RESTful 微服务,涵盖环境搭建、基本应用创建及代码详解。通过示例展示用户管理系统的 CRUD 操作,并讨论数据库集成、错误处理、认证授权、性能优化及文档生成等高级主题,助力开发者打造强大的后端支持。
61 0
|
3月前
|
边缘计算 安全 物联网
未来互联网架构的演变
【8月更文挑战第16天】随着科技的不断进步,互联网作为现代社会不可或缺的基础设施,其架构也在不断地发展与演变。本文将探讨未来互联网架构可能的变化方向,包括边缘计算、软件定义网络(SDN)、网络功能虚拟化(NFV)等技术趋势,以及这些技术如何影响互联网的稳定性、安全性和效率。同时,文章还将讨论这些变革对用户隐私保护和数据治理的潜在影响,并展望互联网架构的未来发展趋势。
|
3月前
|
设计模式 安全 网络安全
|
8天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。