Spark定义作用
Spark是由美国加州伯克利大学(UCBerkeley)实验室开发,基于内存计算的大数据并行计算框架,后续Spark加入Apache成为顶级项目。
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎,设计用于大型分布式数据处理、数据中心或云计算。
Spark的特点
Spark主要有以下4大特点:
1.计算速度快
由于Spark是基于内存的分布式计算引擎,因此其运算效率很快,比如:Spark基于内存运算效率是Hadoop的100被以上,基于硬盘的运算奥效率也要快10倍以上。
2.易用性
Spark编程支持Java、Scala、Python和R等编程语言,并且拥有了80余种算法,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程。
3.通用性
Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算。
4.可扩展
Spark是专注于快速并行计算的引擎,而不是存储,与Apache Hadoop包括存储和计算不同,Spark对存储和计算进行解耦,简单的事情简单做。
这意味着你可以使用Spark来读取存储在各种数据源的数据,例如:Apache Hadoop、Apache Cassandra、Apache Hbase、MongoDB、Apache Hive、RDBMS等存储介质,并在内存中处理它们。
Spark VS Hadoop
Hadoop虽然已成为大数据技术的事实标准,但其本身还存在诸多缺陷,最主要的缺陷是其MapReduce计算模型延迟过高,无法胜任实时、快速计算的需求,因而适用于离线批处理的应用场景。
Spark在借鉴Hadoop MapReduce优点的同时,很好地解决了MapReduce所面临的问题,相比于MapReduce,Spark主要具有如下优点:
- Spark的计算模式也属于MapReduce,但不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;
- Spark提供了内存计算,中间结果直接放到内存中,带来了更高的迭代运算效率;
- Spark基于DAG的任务调度执行机制,要优于MapReduce的迭代执行机制;
Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据通信是基于内存,而 Hadoop 是基于磁盘。
Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据。
但是 Spark 是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以 Spark并不能完全替代Hadoop。
Spark架构
Spark的架构如下图所示:
Spark核心组件
Spark主要包含Spark Core、Spark SQL等5大核心组件模块,具体作用如下:
1.Spark Core
Spark Core包含了Spark的基本功能:任务调度、内存管理、错误恢复、存储系统交互等模块,以及对弹性分布式数据集RDD的API定义。
2.Spark SQL
Spark SQL是操作结构化数据的程序包,通过Spark SQL可以使用SQL来查询多种数据源,比如:Hive表、Parquet以及JSON等。
3.Spark Streaming
Spark Streaming是实时流式数据计算的组件,它允许程序能够像普通RDD一样处理实时数据。
4.Spark MLlib
Spark包含了一个包含通用机器学习算法的库,称为MLlib,MLlib 不仅提供了模型评估、数据导入等额外的功能,还提供了一些更底层的机器学习原语。
5.GraphX
GrahpX是控制图、并行图操作和计算的一组算法和工具的集合。
Spark运行原理
Spark运行流程,如下图所示:
首先:为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请、任务的分配和监控;
其次:资源管理器为Executor分配资源,并启动Executor进程;
再次:SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器TaskScheduler处理;
最后:Task在Executor上运行,把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。
Spark应用场景
Spark的典型应用场景,主要分为如下3类:
- 复杂的批量处理:偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
- 基于历史数据的交互式查询:通常的时间在数十秒到数十分钟之间;
- 基于实时数据流的数据处理:通常在数百毫秒到数秒之间。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》