一、Spark介绍
Spark最初由美国加州伯克利大学(UCBerkeley)的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。2013年Spark加入Apache孵化器项目后发展迅猛,如今已成为Apache软件基金会最重要的三大分布式计算系统开源项目之一(Hadoop、Spark、Storm)。
Spark具有如下几个主要特点:
- 运行速度快:使用DAG执行引擎以支持循环数据流与内存计算。
- 容易使用:支持使用Scala、Java、Python和R语言进行编程,可以通过Spark Shell进行交互式编程。
- 通用性:Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件。
- 运行模式多样:可运行于独立的集群模式中,可运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
1.1 Spark核心问题
- 是什么?
是一个基于内存的分布式批处理引擎
- 做什么?
- 数据处理(Data Processing):可以用来快速处理数据,兼具容错性和可扩展性。
- 迭代计算(Iterrative Computation):支持迭代计算,有效应对多步数据处理逻辑。
- 数据挖掘(Data Mining):在还海量数据的基础上进程复杂的挖掘分析,可支持各种数据挖掘和机器学习算法。
- Spark和Hadoop相比优势在哪里?
- 性能上提升高于100倍。
- Spark的中间数据存放在内存中,对于迭代运算的效率更高,进行批处理时更高效。
- 更低的延时。
- Spark提供更多的数据操作类型,编程模型比Hadoop更灵活,开发效率更高。
- 更高的容错能力(血统机制)。
Hadoop的不足在于:
-
表达能力有限
-
磁盘IO开销大
-
延迟高
-
任务之间的衔接涉及IO开销
-
在前一个任务执行完成之前,其他任务就无法开始,难以胜任复杂、多阶段的计算任务
相比Hadoop的MR计算,Spark的优势在于:
- Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比Hadoop MapReduce更灵活。
- Spark提供了内存计算,可将中间结果放到内存中,对于迭代运算效率更高 Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制。
1.2 Spark生态体系
Spark的设计遵循“一个软件栈满足不同应用场景”的理念,逐渐形成了一套完整的生态系统。既能够提供内存计算框架,也可以支持SQL即席查询、实时流式计算、机器学习和图计算等。Spark可以部署在资源管理器YARN之上,提供一站式的大数据解决方案。因此,Spark所提供的生态系统足以应对上述三种场景,即同时支持批处理、交互式查询和流数据处理。
Spark生态圈以Spark Core为核心,从HDFS、Amazon S3和HBase等持久层读取数据,以MESS、YARN和自身携带的Standalone为资源管理器调度Job完成Spark应用程序的计算。 这些应用程序可以来自于不同的组件,如Spark的批处理、Spark Streaming的实时处理应用、Spark SQL的即席查询、MLlib的机器学习、GraphX的图处理等等。
1.2.1 Spark Core
Spark Core是构建在Apache Spark之上的基础模块,提供了分布式计算的基本能力和基础设施,为构建各种高级功能和应用提供了支持。可以总结出以下特点:
- 提供了有向无环图(DAG)的分布式并行计算框架,并提供Cache机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据局的开销,这对于需要进行多次迭代的数据挖掘和分析性能有很大提升
- DAG:有向无环图,是一组顶点和边的组合。顶点代表了 RDD, 边代表了对 RDD 的一系列操作。DAG Scheduler 会根据 RDD 的 transformation 动作,将 DAG 分为不同的 stage,每个 stage 中分为多个 task,这些 task 可以并行运行(如下图)。
In Apache Spark, DAG stands for Directed Acyclic Graph. It is a fundamental concept used by Spark’s execution engine to represent and optimize the flow of operations in a data processing job.
- DAG解决了什么问题?
主要解决Hadoop框架的局限性,包括以下两点:
- 每个 MapReduce 操作都是相互独立的,HADOOP不知道接下来会有哪些Map Reduce。
- MR每一步的输出结果,都会持久化到硬盘或者 HDFS 上。
由以上两点原因导致MR的IO开销比Spark相差较大。有关DAG详情请看:Directed Acyclic Graph DAG in Apache Spark - DataFlair
- 在Spark中引入了RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”对它们进行重建,保证了数据的高容错性;
- RDD:RDD是弹性分布式数据集,指的是一个只读的,可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多次计算间重用。RDD相关请看
- 移动计算而非移动数据,RDD Partition可以就近读取分布式文件系统中的数据块到各个节点内存中进行计算
- 使用多线程池模型来减少task启动开稍
- 采用Netty通信框架,Spark通信框架请看
1.2.2 Spark Streaming
Spark Streaming 是个批处理的流式(实时)计算框架。其基本原理是把输入数据以某一时间间隔批量的处理,当批处理间隔缩短到秒级时,便可以用于处理实时数据流。支持从多种数据源获取数据,包括Kafk、Flume、Twitter、ZeroMQ、Kinesis以及TCP sockets,从数据源获取数据之后,可以使用诸如map、reduce、join等高级函数进行复杂算法的处理。最后还可以将处理结果存储到文件系统,数据库等数据持久化系统。
1.2.3 Spark SQL
Spark SQL 是 Spark 中用来处理结构化数据的一个模块,它提供了一个编程抽象(DataFrame),并且可以作为分布式 SQL 的查询引擎。
Spark SQL 可以将数据的计算任务通过 SQL 的形式转换成 RDD再提交到集群执行计算,类似于 Hive 通过 SQL 的形式将数据的计算任务转换成 MapReduce,大大简化了编写 Spark 数据计算操作程序的复杂性,且执行效率比 MapReduce 这种计算模型高。