作者:Kira玄玄 | 来源:互联网 | 2023-08-28 17:18
Spark使用小结(一)spark来源历史Spark是一种基于内存计算的大数据并行计算框架。Spark最初是2009年加州大学伯克利分校开发,2010年开源、2013年成为Apache
Spark 使用小结(一)
spark 来源历史
Spark 是一种基于内存计算的大数据并行计算框架。Spark 最初是2009年加州大学伯克利分校开发,2010年开源、2013年成为Apache的开源项目,2014年成为顶级项目。目前使用的主要有2个大的版本1.6 和2.x版本。
Spark 定位
Spark 是一个统一的规模数据分析引擎,是一个基于内存计算的大数据并行计算框架。其主要用于大规模的数据分析运算中。
spark 与MapReduce 区别
在上一节,我们提到spark 是一个基于内存的计算框架。而传统的MR任务却是要将中间数据写入到磁盘的,对同一数据集的多个查询会分别读取数据,产生大量的磁盘读写,导致速度缓慢。关于Spark和MR 的差异,互联网上有很多这方面的比较,这里简单谈点自己的感觉:
- 更加易用。MR 代码需要大量的样本代码。写代码的时候,必须严格按照map和reduce的思想对数据进行拆分,聚合。一个完整的计算任务,就需要多次重复地编写多个MR 作业来完成整个任务。
- 性能。根据官网的视图。是传统的MR任务的100倍以上。
迭代处理能力。 每个MR 作业都是把数据写到磁盘里,下一轮迭代再从磁盘里读取数据。而Spark 是在内存中处理了的,效率提高了一个数量级。这里除了内存读写速度更快,还有架构的原因。我们先看下MR框架:
我们首先看MR 任务中的map操作。map 的主要目的是将原始数据转化为Key-value的样式;reduce主要是左聚合预算,两者都是在不同机器上独立且同步运行的,因此两者中间也必然就存在数据的移动,也就是shuffle。由于数据在不同的机器上,所以每次数据的移动都会涉及大量的网络传输,耗费大量的时间。但由于一个MR任务只能包含一次map和一次reduce,其中间数据只能写回到磁盘中供下次数据使用。如果是做随机梯度下降这样的迭代运算,那就将不断的产生新数据,读取新数据的过程,而每次的读写数据都将进行大量的数据移动,而这些读写实际上都是不太必要的。
Spark正是基于这些不必要,进行了一些改进。本质上spark也是MR任务。但是,不同的是一个spakr 任务可以不止一个MR任务,而是一组。这样的话,计算的中间结果直接就通过内存的方式传递给了下一个MR任务,而不用再读写一次磁盘了,效率自然也就提高了。
- 容错能力。spark容错性高,它通过弹性分布式数据集RDD来实现高效容错,RDD是一组分布式的存储在节点内存中的只读性质的数据集,这些集合是弹性的,某一部分丢失或者出错,可以通过整个数据集的计算流程的血缘关系来实现重建;mapreduce的话容错可能只能重新计算了,成本较高。
- 运行时架构。MR为每个映射器(map)和化简器(reduce)创建单独的JVM,而启动JVM需要时间较长。 Spark的任务都是在一个预先分配的JVM里面运行,省去了启动JVM的过程时间。
执行模式:MR只有批处理。Spark 还有流处理。
Spark 框架组成
Spark的数据分析栈主要包括:Spark(核心组件)、Spark SQL、SparkStreaming(类实时、流处理)、MLib(机器学习)、GraphX(图计算)。
针对这几个模块的介绍,网上有很多,这里就不再一一说明了。
spark 的几个组件
- Application:Application是指用户编写的Spark应用程序,其中包含一个river功能的代码和分布在集群中多个节点上运行的Executor代码。
- Driver: 运行Application的main()函数并且创建SparkContext。在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭,所以通常用SparkContext代表driver。
- Client:用户提交作业的客户端。
- Worker:集群中任何可以运行Application代码的节点,运行一个或多个Executor进程。(可以简单理解为Spark节点,当然这里的节点多数时候是受Yarn管理的)。
- Executor:运行在Worker的Task执行器。Executor启动线程池运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executir来处理任务。
- SparkContext:整个应用的上下文,控制应用的生命周期。
- DAG Scheduler: 根据job构建基于Stage的DAG 工作流,并提交Stage给TaskScheduler。
- Task:被送到某个Executor上的工作单元,多个task组成一个Stage。
- TaskScheduler:将Task 分发给Executor执行。
- Stage:每个job会被拆分成多组Task,作为一个TaskSet,其名称为Stage.Stage的边界就是发生shuffle的地方。
- SparkEnv:线程级别的上下文。
Spark作业提交流程
Client 提交应用,Master(Stabdalone模式下)找到一个Worker启动Driver,Driver向Master或者资源管理器申请资源,之后将应用转化为RDD有向无环图,再由DAGScheduler将RDD有向无环图转化为Stage的有向无环图提交给TaskScheduler,再由TaskScheduler提交任务给Executor执行。
(TaskScheduler此时实际上又是通过Yarn的CluseterManager来执行的具体的分配)