J 第1章 Spark系统概述 在过去的多年中,我们可以看见计算机科学发生了比较大的变化,不断增加的 数据量要求越来越多的应用程序能够扩展到更大的集群里去计算。在商业和科学领 域,新的数据源和数据设备(智能手机、平板、可穿戴式设备、智能家居、各种传 感器)正在迅速地产生大量的信息。但是单台机器的处理能力和I/O性能并不能赶上 数据的增长。所以越来越多的机构将他们的计算扩展到集群中。 1.1大数据处理框架 集群环境对于编程来说带来了很多挑战,首先就是并行化:这就要求我们以并 行化的方式重写应用程序,以便我们可以利用更大范围节点的计算能力。集群环境 的第二个挑战就是对单点失败的处理,节点宕机以及个别节点计算缓慢在集群环境 中非常普遍,这会极大地影响程序的性能。最后一个挑战是集群在大多数情况下都 Spark大数据处理技术
2●第1章Spark系统概述 会被多个用户分享,那么动态地进行计算资源的分配,也会干扰程序的执行。 因此,针对集群环境出现了大量的大数据编程框架。首先我们要提到的就是 Google的MapReduce,.它给我们展示了一个简单通用和自动容错的批处理计算模型。 但是对于其他类型的计算,比如交互式和流式计算,MapReduce并不适合,这也导 致了大量的不同于MapReduce的专有的数据处理模型的出现,比如Storm、Impala 和GraphLab。随着新模型的不断出现,似乎对于大数据处理而言,我们应对不同类 型的作业需要一系列不同的处理框架才能很好地完成。但是这些专有系统也有一些 不足。 ·重复工作:许多专有系统在解决同样的问题,比如分布式作业以及容错。举 例来说.一个分布式的$QL引擎或者一个机器学习系统都需要实现并行聚 合。这些问题在每个专有系统中会重复地被解决 ·组合问题:在不同的系统之间进行组合计算是一件费力又不讨好的事情。对 于特定的大数据应用程序而言,中间数据集是非常大的,而且移动的成本也 非常高昂。在目前的环境中,我们需要将数据复制到稳定的存储系统中(比 如HDS),以便在不同的计算引擎中进行分享。然而,这样的复制可能比真 正的计算所花费的代价要大,所以以流水线的形式将多个系统组合起来效率 并不高。 。适用范围的局限性:如果一个应用不适合一个专有的计算系统,那么使用者 只能换一个系统,或者重写一个新的计算系统。 资源分配:在不同的计算引擎之间进行资源的动态共享是比较困难的,因为 大多数的计算引擎都会假设它们在程序运行结束之前拥有相同的机器节点 的资源。 ·管理问题:对于多个专有系统,需要花费更多的精力和时间来管理和部署。 尤其是对于终端使用者而言,他们需要学习多种API和系统模型。 Spark大数据处理技术
43 1.2 Spark大数据处理框架 针对上一节中MapReduce及各种专有系统中出现的不足,伯克利大学推出了全 新的统一大数据处理框架Spark.,创新性地提出了RDD概念(一种新的抽象的弹性 数据集),在某种程度上Spark是对MapReduce模型的一种扩展。要在MapReduce 上实现其不擅长的计算工作(比如迭代式、交互式和流式),看上去是一件非常困难 的事情,其实主要的原因是MapReduce缺乏一种特性,即在并行计算的各个阶段进 行有效的数据共享,这种共享就是RDD的本质。利用这种有效的数据共享和类似 MapReduce的操作接口,上述的各种专有类型计算都能够有效地表达,而且能够获 得与专有系统同等的性能。 特别值得一提的是,从前对于集群处理的容错方式,比如MapReduce和Dryad, 是将计算构建成为一个有向无环图的任务集。而这只能允许它们有效地重新计算部 分DAG。在单独的计算之间(在迭代的计算步骤之间),除了复制文件,这些模型没 有提供其他的存储抽象,这就显著地增加了在网络之间复制文件的代价。RDD能够 适应当前大部分的数据并行算法和编程模型。 1.2.1RDD表达能力 可以使用RDD实现很多现有的集群编程模型以及一些以前的模型不支持的新应 用。在这些模型中,RDD能够取得和专有系统同样的性能,还能提供包括容错处理、 滞后节点(straggler node)处理等这些专有系统缺乏的特性。这里会重点讨论如下四 类模型。 。迭代算法:这是日前专有系统实现的非常普遍的一种应用场景,比如迭代算 法可以用于图处理和机器学习。RDD能够很好地实现这些模型,包括Pregel、 HaLoop和GraphLab等模型。 关系型查询:对于MapReduce来说非常重要的需求就是运行SQL查询,包 括长期运行、数小时的批处理作业和交互式的查询。然而对于MapReduce而 Spark大数据处理技术
4第1章 Spark系统概述 言,对比并行数据库进行交互式查询,有其内在的缺点,比如由于其容错的 模型而导致速度很慢。利用RDD模型,可以通过实现许多通用的数据库引 擎特性,从而获得非常好的性能。 ·MapReduce批处理:RDD提供的接口是MapReduce的超集,所以RDD可以 有效地运行利用MapReduce实现的应用程序,另外RDD还适合更加抽象的 基于DAG的应用程序,比如DryadLINQ。 流式处理:目前的流式系统也只提供了有限的容错处理,需要消耗系统非常 大的拷贝代价或者非常长的容错时间。特别是在目前的系统中,基本都是基 于连续计算的模型,常驻的有状态的操作会处理到达的每一条记录。为了恢 复失败的节点,它们需要为每一个操作复制两份操作,或者是将上游的数据 进行代价非常大的操作重放。利用DD实现一种新的模型一离散数据流 (D-Stream),可以克服上面的这些问题。D-Stream将流式计算当作一系列 的短小而确定的批处理操作,而不是常驻的有状态的操作,将两个离散流之 间的状态保存在RDD中。离散流模型能够允许通过RDD的继承关系图 (lineage)进行并行性的恢复而不需要进行数据拷贝。 1.2.2 Spark子系统 如果按照目前流行的大数据处理场景来划分,可以将大数据处理分为如下三种 情况。 ·复杂的批量数据处理(batch data processing),通常的时间跨度为数十分钟到 数小时。 ·基于历史数据的交互式查询(interactive query),通常的时间跨度为数十秒到 数分钟。 ·基于实时数据流的数据处理(streaming data processing),通常的时间跨度为 数百毫秒到数秒。 Spark大数据处理技术
45 由于RDD具有丰富的表达能力,所以伯克利在Spark Core的基础之上衍生出了 能够同时处理上述三种情形的统一大数据处理平台,如图1-1所示。 Shark/Spark SQL Spark Streaming GraphX MLlib Spark Core 图l-】Spark生态系统 ·Spark Core:基于RDD提供了丰富的操作接口,利用DAG进行统一的任务 规划,使得Spark能够更加灵活地处理类似MapReduce的批处理作业. ·Shark/Spark SQL:兼容Hive的接口HQL,提供了比Hive高出l0~100倍的 查询速度的分布式SQL引擎。 ·Spark Streaming:将流式计算分解成一系列的短小的批处理作业,利用Spark 轻量级和低延时的调度框架,可以很好地支持流式处理。目前已经支持的数 据输入源包括Kafka、Flume、Twitter、TCP sockets。 。GraphX:基于Spark的图计算框架,兼容Pregel和GraphLab接口,增强了 图构建以及图转换功能。 ·MLlib:Spark Core天然地非常适合于迭代式运算,MLlib就是构建在Spark 上的机器学习算法库。目前已经可以支持常用的分类算法、聚类算法、推荐 算法等。 Spak生态系统的目标就是将批处理、交互式处理、流式处理融合到同一个软件 栈中。对于最终的用户或者是开发者而言,Spak生态系统有如下特性。 ·Spark生态系统兼容Hadoop生态系统。这个特性对于最终用户至关重要,虽 然Spark通用引擎在一定程度上是用来取代MapReduce系统的,但是Spark 能够完美兼容Hadoop生态中的HDFS和YARN等其他组件,使得现有的 Hadoop用户能够非常容易地迁移到Spark系统中。图1-2显示了Spark与 Hadoop生态的兼容性。 Spark大数据处理技术