同期文章:
HDFS知识体系(知其然,知其所以然) - 掘金 (juejin.cn)
YARN:分布式资源管理框架 - 掘金 (juejin.cn)
一文了解MapReduce的前世今生 - 掘金 (juejin.cn)
一文了解Hive的前世今生 - 掘金 (juejin.cn)
Hive与Hbase,傻傻分不清 - 掘金 (juejin.cn)
一、spark是什么
Spark是一个开源的大数据处理框架,由UC Berkeley AMP Lab开发,于2010年开源。它利用内存进行计算,可以对大量数据进行高速的流式处理。
重点来了,Spark使用了类似MapReduce的概念,但性能比MapReduce高很多。
事实上,spark的含义,火花,命名来源我觉得可能就是因为开发者无法忍受自己这么牛逼的人得受限于mapreduce这么慢的计算速度,才开发出这个像火花一样速度非常快的计算组件。
二、spark为什么出现
1. MapReduce存在的问题
在大数据的时代来临之际,如何处理海量的数据是大家共同面临的难题。
企业和组织纷纷加入了大数据的浪潮,希望从数据中挖掘出宝贵的信息,以做出更明智的决策。然而,这些数据量庞大、多样化的数据集却让传统的数据处理工具感到力不从心。
后来MapReduce出现了。MapReduce在分布式计算方面做得很好,也切实解决了一些大数据计算难题。但有个问题:它的计算模型对迭代式的算法支持不够友好。
然而在机器学习、图计算等领域,迭代是一种非常普遍的模式,然而MapReduce每次都需要将中间结果写入磁盘,这使得迭代变得相当低效。
现在,数据的高速发展需要一个一个更快、更灵活、更容易使用的数据处理框架。这个解决方案不仅仅要能够处理大规模数据集,还要能够很好地支持迭代式算法。
这时,Apache Spark闪亮登场。Spark采用了内存计算的思想,将中间结果存储在内存中,避免了频繁的磁盘读写,大大提高了处理速度。
当然这样的内存开销也造成了内存资源越发珍贵。
所以,我们完全可以认为,spark是针对MapReduce的改进。
2、spark相对于MapReduce的改进
Spark在性能、功能、易用性等多方面做了改进,提供了一个更强大、通用的大数据处理框架。
- 性能上的改进
Spark基于内存计算,可以缓存数据到内存中,避免每次都从磁盘读取数据,并且Spark有更高效的DAG执行引擎, 性能比MapReduce高10-100倍。
- 支持更多的数据处理场景
MapReduce更适合批处理和一遍读写的场景。而Spark提供了Spark SQL、Spark Streaming、GraphX、MLlib等组件,可以支持批处理、流式处理、迭代算法、图计算、机器学习等多种数据处理场景。
- 提供更易用的API
Spark提供了比MapReduce更高级、更易用的API,如DataFrames、DataSet等,降低了编程复杂度。
- 更好的兼容性
Spark可以通过Spark on YARN很好地与其他大数据技术栈(如Hadoop)兼容共享资源。
- 对开发者更友好
Spark使用Scala等语言开发,这些语言对开发者更友好。并提供了丰富的高级API。
3. 具体的数据对比
以下通过一个具体的数据对比来体现Spark相比MapReduce的性能提升:
场景:对1TB规模的文本数据进行WordCount统计
执行环境:
- 硬件规格:CPU 24核,内存256GB,网卡千兆
- 软件规格:Hadoop 2.7.2,Spark 2.3.1
测试结果:
测试项目 | MapReduce | Spark |
---|---|---|
运行时间 | 1605秒 | 54秒 |
CPU平均利用率 | 96% | 78% |
内存利用率 | 27% | 68% |
调度次数 | 24次 | 1次 |
读写HDFS次数 | 24次 | 2次 |
分析:
-
运行时间:Spark比MapReduce快了近30倍,Spark利用内存运算大大提升了处理速度。
-
CPU利用率:MapReduce CPU利用接近满,Spark还有空闲可以承载更多工作。
-
内存利用率:Spark使用内存缓存提高运算速度,内存利用率高。
-
调度&读写HDFS次数:MapReduce的多次调度和读写HDFS是其低效的主要原因。
三、Spark的架构
1. 一个核心RDD
Spark RDD(弹性分布式数据集)是Spark中一个核心的概念。
RDD是Spark对分布式数据的基本抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。主要特征包括:
-
分区:RDD按照分区存储,每个分区的数据在执行时都是在一个节点上计算的。
-
只读:RDD是只读的,对RDD的修改得到的实际上是一个新的RDD。
-
来源:RDD可能来自HDFS文件,另一个RDD的转换,或者HDFS输出等。
-
计算:RDD的计算通过确定性的操作(transformations)表示,这些操作会生成一个新RDD。
-
持久化:RDD可以被缓存在内存中,用于提高重用效率。
-
容错:RDD的分区可以重新计算,提供了容错能力。
-
依赖:RDD之间存在依赖关系,RDD的执行依赖底层的RDD。
RDD的特点使得Spark可以高效地对分布式数据进行并行计算。开发人员主要需要对RDD进行转换操作,而Spark框架会负责底层的调度、容错、依赖管理等工作,从而简化了分布式计算程序的开发。因此RDD是Spark简单易用且高效的来源。
2.多个组件
- Spark Core
Spark Core包含了Spark的基本功能,如任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core 中最基本的抽象是弹性分布式数据集(RDD)。
- Spark SQL
Spark SQL可以看作是Spark对结构化数据的支持。它提供了一个编程抽象叫做DataFrame,并且可以通过SQL或者 HiveQL进行查询。Spark SQL提供高性能的复杂分析。
- Spark Streaming
Spark Streaming用来处理实时流数据,内部使用微批次(micro-batch)的方式来对流数据进行处理。
- MLlib
MLlib是Spark提供的机器学习算法库,包括分类、回归、聚类、协同过滤等算法。
- GraphX
GraphX 是Spark对图计算的支持,提供了图(vertex)和边(edge)的抽象,并支持图上的迭代计算。
3. 数据处理流程
Spark以编程方式通过转换和行动来定义计算,DAG图负责执行计划的生成,整个执行过程完全由Spark框架自动管理。
-
Spark从数据源中读取数据,创建初始的RDD。
-
通过RDD的转换操作(transformations),得到新的RDD。转换是延迟执行的。
-
对RDD进行行动操作(actions),触发作业执行,并输出结果。
-
RDD可以通过persist()方法缓存,避免重计算。
-
转换和行动操作形成DAG执行图,提交给DAGScheduler进行任务调度。
-
DAGScheduler生成执行计划,提交给TaskScheduler进行任务调度。
-
Spark Executor执行任务并返回结果。