当一个计算工作过于简单不能被一台服务器独立实现的时候,咱们就须要分布式计算。分布式计算技术将一个大型工作切分为多个更小的工作,用多台计算机通过网络组装起来后,将每个小工作交给一些服务器来独立实现,最终实现这个简单的计算工作。本篇咱们介绍两个经典的计算框架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.