1.1 初识Spark

Spark是基于内存计算的大数据并行计算框架,因为它基于内存计算,所以提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量廉价硬件之上,形成集群。

1.Spark执行的特点

Hadoop中包含计算框架MapReduce和分布式文件系统HDFS。

Spark是MapReduce的替代方案,而且兼容HDFS、Hive等分布式存储层,融入Hadoop的生态系统,并弥补MapReduce的不足。

(1)中间结果输出

Spark将执行工作流抽象为通用的有向无环图执行计划(DAG),可以将多Stage的任务串联或者并行执行,而无需将Stage的中间结果输出到HDFS中,类似的引擎包括Flink、Dryad、Tez。

(2)数据格式和内存布局

Spark抽象出分布式内存存储结构弹性分布式数据集RDD,可以理解为利用分布式的数组来进行数据的存储。RDD能支持粗粒度写操作,但对于读取操作,它可以精确到每条记录。Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略。

(3)执行策略

Spark执行过程中不同Stage之间需要进行Shuffle。Shuffle是连接有依赖的Stage的桥梁,上游Stage输出到下游Stage中必须经过Shuffle这个环节,通过Shuffle将相同的分组数据拆分后聚合到同一个节点再处理。Spark Shuffle支持基于Hash或基于排序的分布式聚合机制。

(4)任务调度的开销

Spark采用了事件驱动的类库AKKA来启动任务,通过线程池的复用线程来避免系统启动和切换开销。

2.Spark的优势

Spark的一站式解决方案有很多的优势,分别如下所述。

(1)打造全栈多计算范式的高效数据流水线

支持复杂查询与数据分析任务。在简单的“Map”及“Reduce”操作之外,Spark还支持SQL查询、流式计算、机器学习和图算法。同时,用户可以在同一个工作流中无缝搭配这些计算范式。

(2)轻量级快速处理

Spark代码量较小,这得益于Scala语言的简洁和丰富表达力,以及Spark通过External DataSource API充分利用和集成Hadoop等其他第三方组件的能力。同时Spark基于内存计算,可通过中间结果缓存在内存来减少磁盘I/O以达到性能的提升。

(3)易于使用,支持多语言

Spark支持通过Scala、Java和Python编写程序,这允许开发者在自己熟悉的语言环境下进行工作。它自带了80多个算子,同时允许在Shell中进行交互式计算。用户可以利用Spark像书写单机程序一样书写分布式程序,轻松利用Spark搭建大数据内存计算平台并充分利用内存计算,实现海量数据的实时处理。

(4)与External Data Source多数据源支持

Spark可以独立运行,除了可以运行在当下的Yarn集群管理之外,它还可以读取已有的任何Hadoop数据。它可以运行多种数据源,比如Parquet、Hive、HBase、HDFS等。这个特性让用户可以轻易迁移已有的持久化层数据。

(5)社区活跃度高

Spark起源于2009年,当下已有超过600多位工程师贡献过代码。开源系统的发展不应只看一时之快,更重要的是一个活跃的社区和强大的生态系统的支持。

同时也应该看到Spark并不是完美的,RDD模型适合的是粗粒度的全局数据并行计算;不适合细粒度的、需要异步更新的计算。对于一些计算需求,如果要针对特定工作负载达到最优性能,还需要使用一些其他的大数据系统。例如,图计算领域的GraphLab在特定计算负载性能上优于GraphX,流计算中的Storm在实时性要求很高的场合要更胜Spark Streaming一筹。