分布式计算技术(上):经典计算框架MapReduce、Spark 解析

news2024/11/15 21:33:06

当一个计算任务过于复杂不能被一台服务器独立完成的时候,我们就需要分布式计算。分布式计算技术将一个大型任务切分为多个更小的任务,用多台计算机通过网络组装起来后,将每个小任务交给一些服务器来独立完成,最终完成这个复杂的计算任务。本篇我们介绍两个经典的计算框架MapReduce和Spark。

— MapReduce批处理引擎 

MapReduce是第一个比较成功的计算引擎,主要用于数据批处理。由于企业的大数据业务多是围绕结构化数据等价值密度更高的数据展开,所有的大数据公司开始在大数据平台上打造SQL引擎或分布数据库。2012年开始到随后两年中出现20多个基于Hadoop的SQL引擎,以解决结构化数据问题。

MapReduce框架是Hadoop技术的核心,它的出现是计算模式历史上的一个重大事件,在此之前行业内大多是通过MPP(Massive Parallel Programming)的方式来增强系统的计算能力,一般都是通过复杂而昂贵的硬件来加速计算,如高性能计算机和数据库一体机等。而MapReduce则是通过分布式计算,只需要廉价的硬件就可以实现可扩展的、高并行的计算能力。一个MapReduce程序会包含一个Map过程和一个Reduce过程。在Map过程中,输入为(Key, Value)数据对,主要做过滤、转换、排序等数据操作,并将所有Key值相同的Value值组合起来;而在Reduce过程中,解析Map阶段生成的(Key, list(value))数据,并对数据做聚合、关联等操作,生成最后的数据结果。每个worker只处理一个file split,而Map和Reduce过程之间通过硬盘进行数据交换,如果出现任何错误,worker会从上个阶段的磁盘数据开始重新执行相关的任务,保证系统的容错性和鲁棒性。

图片来源于《MapReduce: simplified data processing on large clusters》

MapReduce在设计上并不是为了高性能,而是为了更好的弹性和可扩展性。在同等规模的硬件以及同等量级的数据上,与一些基于关系数据库的MPP数据库相比,MapReduce的分析性能一般会慢一个数量级,不过MapReduce可以支持的集群规模和数据量级要高几个数量级。在2014年Jeff Dean提出MapReduce的论文里提及的相关集群已经是1800台服务器的规模,而现在放眼国内,单个集群超过几千个服务器、处理数据量达到PB级别的集群有超过数百个。

除了可以支持PB级别的弹性化数据计算外,MapReduce还有几个很好的架构特性,这些特性也都被后来的一些计算框架(如Spark等)有效地继承。第一个特性是简化的编程接口设计,与之前的MPP领域流行的MPI等编程接口不同,MapReduce不需要开发者自己处理并行度、数据分布策略等复杂问题,而是需要关注于实现Map和Reduce对应的业务逻辑,从而大大简化开发过程。另外MapReduce的计算基于key-value的数据对,value域可以包含各种类型的数据,如结构化数据或图片、文件类非结构化数据,因此MapReduce计算框架能够很好地支持非结构化数据的处理。

此外,在容错性方面,由于MapReduce的分布式架构设计,在设计之初即设定了硬件故障的常态性,因此其计算模型设计了大量的容错逻辑,如任务心跳、重试、故障检测、重分布、任务黑/灰名单、磁盘故障处理等机制,覆盖了从JobTracker、TaskTracker到Job、Task和Record级别的从大到小各个层级的故障处理,从而保证了计算框架的良好容错能力。

而随着企业数据分析类需求的逐渐深入,MapReduce计算框架的架构问题从2010年后也逐渐暴露出来。首先就是其性能问题,无论是框架启动开销(一般要数分钟),还是任务本身的计算性能都不足,尤其是在处理中小数据量级的数据任务上与数据库相差太大,不能用于交互式数据分析场景。有意思的是,从2010年开始,学术界有大量的论文研究如何优化MapReduce性能,也有多个开源框架诞生出来,但都未能实现性能在量级上的提升,因此也逐渐淡出了历史。第二个重要问题是不能处理实时类数据,因此不能满足一些快速发展的互联网场景需求,如实时推荐、实时调度、准实时分析等。后续Spark框架的出现就优先解决了这几个问题,框架启动开销降到2秒以内,基于内存和DAG的计算模式有效的减少了数据shuffle落磁盘的IO和子过程数量,实现了性能的数量级上的提升。随着更好的计算框架出现,MapReduce逐渐退出了主流应用场景,不过其作为分布式计算的第一代技术架构,其在计算技术演进的过程中发挥了重要的历史价值。

— Spark计算框架 

随着大量的企业开始通过Hadoop来构建企业应用,MapReduce的性能慢的问题逐渐成为瓶颈,只能用于离线的数据处理,而不能用于对性能要求高的计算场景,如在线交互式分析、实时分析等。在此背景下,Spark计算模型诞生了。虽然本质上Spark仍然是一个MapReduce的计算模式,但是有几个核心的创新使得Spark的性能比MapReduce快一个数量级以上。第一是数据尽量通过内存进行交互,相比较基于磁盘的交换,能够避免IO带来的性能问题;第二采用Lazy evaluation的计算模型和基于DAG(Directed Acyclic Graph, 有向无环图)的执行模式,可以生成更好的执行计划。此外,通过有效的check pointing机制可以实现良好的容错,避免内存失效带来的计算问题。

Spark 实现了一种分布式的内存抽象,称为弹性分布式数据集(RDD,Resilient Distributed Datasets)。它支持基于工作集的应用,同时具有数据流模型的特点 自动容错、位置感知调度和可伸缩性。RDD 允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。RDD提供了一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,只能通过在其他RDD执行确定的转换操作(如map、join和 groupBy) 而创建,然而这些限制使得实现容错的开销很低。与分布式共享内存系统需要付出高昂代价的检查点和回滚机制不同,RDD通过Lineage来重建丢失的分区一个RDD中包含了如何从其他 RDD衍生所必需的相关信息,从而不需要检查点操作就可以重构丢失的数据分区。

除了Spark Core API以外,Spark还包含几个主要的组件来提供大数据分析和数据挖掘的能力,主要包括Spark SQL、Spark Streaming、Spark MLLib。

  • Spark SQL

Spark SQL是基于Spark引擎提供使用SQL来做统计分析的模块,因为有较好的SQL兼容性,对普通数据开发者使用比较简单,因此在用户中使用比较广泛。SparkSQL充分吸收了Hive等项目的架构优缺点,通过有效的模块化以及与Hive元数据模块的兼容,使得开发者可以直接用Spark SQL来分析Hive中的数据表,而比直接使用Hive做分析能够大幅度提高性能。此后,Spark SQL陆续增加了对JSON等各种外部数据源的支持,并提供了一个标准化的数据源API。数据源API给Spark SQL提供了访问结构化数据的可插拔机制。各种数据源有了简便的途径去进行数据转换并接入到Spark平台进行计算,此外由API提供的优化器,在大多数情况下,可以将过滤和列修剪都下推到数据源,从而极大地减少了待处理的数据量,能够显著提高Spark的工作效率。通过这些架构上的创新,Spark SQL可以有效地分析多样化的数据,包括Hadoop、Alluxio、各种云存储,以及一些外部数据库。

  • Spark Streaming

Spark Streaming 基于 Spark Core 实现了可扩展、高吞吐和容错的实时数据流处理。Spark Streaming 是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark,也就是把Spark Streaming的输入数据按照micro batch size(如500毫秒)分成一段一段的数据(Discretized Stream),每一段数据都转换成 Spark中RDD(Resilient Distributed Dataset),然后将Spark Streaming中对DStream的转换操作变为针对Spark中对RDD的转换操作,将RDD经过操作变成中间结果保存在内存中。

由于Spark Streaming采用了微批的处理方式,系统本身的吞吐量比较高,但是从应用的视角来看,数据从发生到计算结构的延时在500毫秒甚至以上,如果一个复杂逻辑涉及到多个流上的复杂运算,这个延时将会进一步放大,因此对一些延时敏感度比较高的应用,Spark Streaming的延时过高问题是非常严重的架构问题。Spark社区也在积极的解决相关的问题,从Spark 2.x版本开始推出了Structured Streaming,最本质的区别是不再将数据按照batch来处理,而是每个接收到的数据都会触发计算操作并追加到Data Stream中,紧接着新追加的记录就会被相应的流应用处理并更新到结果表中,如下图所示。

由于Structured Streaming有效地降低了实时计算的延时,此外又是直接基于Dataframe和Dataset API进行了封装,从而方便与Spark SQL以及MLlib对接,因此很快便取代了Spark Streaming成为Spark主要的实时计算方案。此后,社区很快增加了对数据乱序问题的处理、通过checkpoint机制保证At least once语义等关键的流计算功能要求,逐步贴近了生产需求。

  • Spark MLLib

MLlib是Spark对常用的机器学习算法的分布式实现,同时包括数据类型、数学统计计算库和算法评测功能,机器学习算法包括分类、回归、聚类、协同过滤、降维等。除了大量的分布式机器学习算法以外,MLlib中还提供了包括特征提取、特征转换、特征选择等功能。由于基于Spark框架,MLlib有很好的可扩展性和性能,并且提供上层API用于定制化的算法开发,因此从推出后就得到广泛的支持和落地。

— 小结

分布式计算技术按照其业务场景的不同可以分为离线计算和实时计算,本文介绍了两个具有代表性的离线计算技术MapReduce批处理引擎和Spark计算框架,那么对于实时数据的处理又该怎么做呢?下一篇将介绍面向交互式分析的计算引擎Impala、实时计算引擎Apache Flink和星环实时计算引擎Slipstream。

【参考文献】

Dean J, Ghemawat S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1): 107-113.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

07 -全局状态管理

全局状态管理 7-1:开篇 在上一章中我们完成了 “一半” 的文章搜索功能,并且留下了一些问题。那么这些历史残留的问题,我们将会在本章节中通过 全局状态管理工具 进行处理。 那么究竟什么是 全局状态管理工具,如何在 uniapp 中…

【Flutter进阶】聊一聊组件中的生命周期、状态管理及局部重绘

前言 说到生命周期,熟悉Android开发的小伙伴一定第一时间会想到Activity的生命周期,由于在Flutter中一切都是组件,所以组件的生命周期其实是类似的。 在这个过程中组件的状态——State就非常重要,它记录这整个组件内可变部分的状…

【SSM整合】1—Spring和Mybatis整合

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ Spring专栏👉https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专栏👉htt…

linux安装kafka

目录 目录 一.安装包准备: 二.解压安装: 先将该安装包放入到/opt/install目录: 解压该文件到soft目录中: 改名,方便后续使用: 三修改其中配置和配置环境变量: 3.1 修改/opt/soft/kafka2…

camunda工作流引擎开发架构

Camunda的开发架构可以分为前端开发架构和后端开发架构。 前端开发架构: Camunda前端使用Angular框架进行开发,主要包括以下组件: 1、Cockpit:流程监控和管理界面。 2、Tasklist:任务管理和审批界面。 3、Admin&…

答题积分小程序云开发实战-开篇:项目介绍以及效果图

答题积分小程序云开发实战 开篇:项目介绍以及效果图 前言 我也看过不少的册子或者文章,大部分都很优秀,但也有的就长篇累牍,从时代背景讲起,复述各种基本概念、底层原理......嗯,看似很高级~ 但我阅读的时候,给我的感觉是,把你绕晕、把你劝退的感觉,相信大家都有同感,…

C++输入输出、缺省参数、函数重载、引用【C++初阶】

目录 一、C输入&输出 二、缺省参数 1、概念 2、分类 (1)全缺省 (2)半缺省 三、函数重载 1、概念 2、原理------名字修饰 一、C输入&输出 在C语言中,我们常用printf和scanf这两个函数进行输入输出。 …

产品-Axure9(英文版),.rp文件与.rplb文件的转换与区分

文章目录1、区分2、相互转换2.1 rp转为rplb2.1 rplb转为rp1、区分 rp文件是文档文件,可以理解为作品文件,自己的工作输出就是rp文件,图标如下。 rplb文件是库文件,是在制作文件过程中一个快捷库,图标如下 在点击绿色…

GitHub 上诞生了一个可视化低代码神器

作为开发者,你是否早已厌倦了日复一日的“增删改查”,每天都在重复造轮子,今天给大家推荐一款开源、靠谱、实用的低代码开发平台 -- ILLA Builder。 产品介绍 ILLA Builder 是 ILLA 的核心产品,是一款开源的低代码开发工具。通过…

ROS话题通信自定义+发布订阅代码--03

话题通信自定义msg 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味…

C++实现JPEG格式图片解析(附代码)

在网上看了好多解析JPEG图片的文章,多多少少都有问题,下面是我参考过的文章链接: 首先,解析的步骤1.读取文件的信息2.Huffman编码解码3.直流交流编码解析然而,读取多少个88矩阵才能解析出一个MCU呢?4.反量化…

8年测试老鸟总结,接口自动化测试测试用例编写(全覆盖场景)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 自动化测试&#xf…

15-721 Chapter 6 索引

最先是解释了一个古老的,现在没什么人用数据结构----T-tree,因为现代的cpu到cache和到memory差异巨大,同时memory的容量也变大了。 T-tree 两个key标志着范围,决定到哪里找key,然后存的都是指针,指向pare…

CANopen | 对象字典OD 05 - 创建对象字典变量,映射到RPDO

文章目录一、前言二、实验目的三、对象字典OD四、通过RPDO修改变量rx_Value4.1、NMT指令让CANopen从站进入操作状态4.2、RPDO修改变量rx_Value一、前言 该章节的源代码地址:github 以上摘自《CANopen_easy_begin》的第7章。 二、实验目的 CANopen从站有一个变量…

【博学谷学习记录】超强总结,用心分享 | 架构师 MySql扩容学习总结

文章目录1. 停机方案2.停写方案3.日志方案4.双写方案(中小型数据)5.平滑2N方案(大数据量)1. 停机方案 发布公告 为了进行数据的重新拆分,在停止服务之前,我们需要提前通知用户,比如&#xff1a…

网络io与select,poll,epoll

一个形象的类比 水龙头等水 水龙头就是内核进程 等水复制到内核区 学生就是进行io的进程或线程 阻塞io 学生在那里 等水来 非阻塞io 学生看数据没准备好,先回寝室,一会儿再过来检查下,看水准备好没 多路复用io 阿姨帮忙看着水龙头,等来水的时候通知学生 前面三个都是同步…

HQChart实战教程60-如何定制十字光标输出内容

HQChart实战教程60-如何定制十字光标输出内容 十字光标效果图步骤:1. 注册事件2. 外部格式化输出内容Y 轴输出说明X轴输出说明HQChart插件源码地址完整的demo源码十字光标 当鼠标或手势在K线上移动的时候, 会出现一个十字线,已经X轴和Y轴对应数值的输出。X轴输出日期+时间 …

2.1.1网络io与io多路复用select/poll/epoll

关于网络io&#xff0c;我们可以通过一个服务端-客户端的示例来了解&#xff1a; 这是一段TCP服务端的代码&#xff1a; #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include &l…

Android系统启动流程--zygote进程的启动流程

在上一篇init进程启动流程中已经提到&#xff0c;在init中会解析一个init.rc文件&#xff0c;解析后会执行其中的命令来启动zygote进程、serviceManager进程等&#xff0c;下面我们来看一下&#xff1a; //文件路径&#xff1a;system/core/init/init.cppstatic void LoadBoot…

电子商务转化率对你来说有多重要?

有许多电子商务企业遇到了瓶颈期&#xff0c;低转化率并不总是表明您的业务出了大问题&#xff0c;但它们确实表明您可以做得更多&#xff0c;赚得更多。在文中&#xff0c;我们将讨论电子商务转化率对你的重要性&#xff0c;以及提高电子商务转化率的最佳久经考验的方法。 一、…