学习链接如下:Spark简介

一、Spark简介

数据处理时大概需要三个部分:1.资源管理框架 2.计算框架 3.存储框架
资源管理框架大致可以有Hadoop原装的yarn,spark自带的standalone,还有messos等
计算框架有rm(resource manager),spark
存储可用HDFS,HIVE,HBASE

Spark是加州大学伯克利分校AMP实验室(Algorithms,Machines,and People Lab) 开发的通用内存并行计算框架
Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集,具有以下特点。

  1. 运行速度快:Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算,官方提供的数据表明,如果数据由磁盘读取,速度是Hadoop MapReduce的10倍以上,如果数据从内存中读取,速度可以高达100多倍。
  2. 易用性好:Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写。特别是Scala是一种高效的,可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
  3. 通用性强:Spark生态圈即BDAS(伯克利数据分析栈)包含了Spark Core、Spark SQL、Spark Streaming、MLlib 和 GraphX等组件。Spark Core:提供内存计算框架 Spark Streaming:实时处理应用、Spark SQL:即席查询、MLlib或MLbase的机器学习和GraphX的图处理。
  4. 随时运行:Spark具有很强的适应性,能够读取HDFS、Cassandra、HBase、S3和Techyon 为持久层读写原生数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算
    在这里插入图片描述

二、Spark与Hadoop差异

Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式计算的优点并改进了MapReduce明显的缺陷,具体如下:
首先,Spark把中间数据放到内存中,迭代运算效率高。MapReduce中计算结果需要落地,保存到磁盘上,这样势必会影响整体速度,而Spark支持DAG图(Directed Acyclic Graph)的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。

其次,Spark容错性高,Spark引进了弹性分布式数据集RDD(Resilient Distributed Dataset)的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程) 对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。

最后,Spark更加通用。不像Hadoop只提供了Map和Reduce两种操作,Spark 提供的数据集操作有很多种,大致分为:Transformations和Actions两大类。Transformations包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort和PartionBy等多种操作类型,同时还提供Count、Actions包括Collect、Reduce、Lookup和Save等操作。另外各个处理节点之间的通信模型不再像Hadoop只有Shuffle一种模式,用户可以命名、物化、控制中间结果的存储、分区等。

Spark的适用场景

目前大数据处理场景有以下几个类型:

  1. 复杂的批量处理(Batch Data Processing) ,偏重点在于处理海量数据的能力,至于处理速度可忍受,通常的时间可能是在数十分钟到数小时;
  2. 基于历史数据的交互式查询(Interactive Query) ,通常的时间在数十秒到数十分钟之间
  3. 基于实时数据流的数据处理(Streaming Data Processing),通常在数百毫秒到数秒之间

目前对以上三种场景需求有比较成熟的处理框架,第一种情况可以用Hadoop的MapReduce来进行批量海量数据的处理,第二种情况可以Impala进行交互式查询,对于第三种情况可以用Storm分布式处理框架处理实时流式数据。以上三者都是比较独立,各自一套维护成本比较高,而Spark的出现能够一站式品台满足以上需求。

通过以上分析,总结Spark场景有以下几个:

  1. Spark是基于内存的迭代计算框架,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大。收益越大,数据量小但是计算密集度较大的场合,收益就相对较小
  2. 由于RDD的特性,Spark不适用那种异步细粒度更新状态的应用,例如web服务的存储或者是增量的web爬虫或索引。就是对于那种增量修改的应用模型不适合
  3. 数据量不是特别大,但是要求实时统计分析需求

四、Spark常用术语

术语描述
ApplicationSpark的应用程序,包含一个Driver program 和若干Executor
SparkContextSpark应用程序的入口,负责调度各个运算资源,协调各个Worker Node上的Executor
Driver program运行Application的main函数并且创建SparkContext
Executor是为Application运行在Worker node上的一个进程,该进程负责运行Task,并负责将数据存在内存或者磁盘上,每个Application都会申请各自的Executor来处理任务
Cluster Manager在集群上获取资源的外部服务(例如:Standalone、Mesos、Yarn)
Worker Node集群中任何可以运行Application代码的节点,运行一个或多个Executor进程
Task运行在Executor上的工作单元
JobSparkContext提交的具体Action操作,常和Action对应
Stage每个Job会被拆分很多组task,每组任务被称为Stage,也称TaskSet
RDD是Resilient distributed dataset 的简称,中文为弹性分布式数据集;是spark最核心的模块和类
DAGScheduler根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
TaskScheduler将TaskSet提交给Worker node集群运行并返回结果
Transformations是Spark API的一种类型,Transformation 返回值还是一个RDD。所有的Transformation 采用的都是懒策略,如果只是将Transformation提交是不会执行计算
Action是Spark API 的一种类型,Action返回值不是一个RDD,而是一个scala 集合;计算只有在Action被提交的时候才被触发

Spark工作流程

学习链接如下: Spark工作流程
在工作时,大致是这个所属关系(本图是以yarn为例)。
一:用户提交应用
在这里插入图片描述
spark App 是用户提交的代码,代码分为了Driver代码和Executor 执行代码。首先spark App会去yarn中的AppManager中申请一个Container去创建AppMaster实例,Driver就是运行在AppMaster之上。

在这里插入图片描述
得到Driver以后,它会运行main()函数且创建SparkContext,scxt也叫做spark上下文,其为运行环境做好准备,也有与资源管理者通信,申请,分配任务,监控的工作。

DAG(RDD关系图)
创建完spark上下文之后,上下文会对RDD进行处理。在对代码解析时,遇到转化类代码,不会立即执行而是记录下它的轨迹,并创建一副DAG图

DAGScheduler
在实例化上下文的同时,上下文会创建一个DAGScheduler对象,这个对象的任务是计算作业和任务的依赖,制定调度逻辑。

在这里插入图片描述
Job->Stage->Task都是一对多的关系,一个Job可有一个或多个Stage,Stage也对应着多个Task,所以Stage也叫TaskSet

首先它会根据DAG图划分Stage,每个动作Active都会生成一个Job,将Job分为Stage的依据是什么呢?
沿着第一个操作开始,遇到窄依赖就加入本Stage,遇到宽依赖操作重新创建Stage。所谓的窄依赖是RDD中父RDD和子RDD是1对1或者n对1的关系,比如操作map,filter(1->1),union(n->1)。宽依赖就是父子一对多的关系,比如bykey的系列操作(一般为shuffle操作)。
Stage队列
因为后面的Stage对前面的Stage结果产生了依赖,所以要等前面的Stage队列执行完后,才会进行后面的。

任务执行
最后拆分完的Stage进行提交,提交时。。。。先不看了 后面再看。

五、Spark宽依赖和窄依赖深度剖析

学习链接Spark宽依赖和窄依赖深度剖析

我们知道Spark应用执行过程中,会在逻辑上生成有向无环图(DAG)。当Active算子被触发后,会将所有积累的算子生成有向无环图并由调度器对图上任务进行调度执行。Spark的调度方式较传统的MapReduce复杂许多,它会根据RDD之间的依赖关系来划分不同的阶段(Stage),而一个Stage则包含一系列的执行任务(TaskSet) .
Stage划分是基于数据依赖关系的,一般分为两类:宽依赖(ShuffleDependency) 与窄依赖(NarrowDependency).

  • 宽依赖,父RDD的一个分区会被子RDD的多个分区使用
  • 窄依赖,父RDD的分区最多只会被子RDD的一个分区使用

其实区分宽窄依赖的主要判断条件是–父RDD的Partition流向–要是流向单个RDD就是窄依赖,流向多个RDD就是宽依赖。

宽窄依赖
所谓划分Stage的算法就是:从最后一个RDD往前推算,遇到窄依赖(NarrowDependency)就将其加入该Stage,当遇到宽依赖(ShuffleDependency)就断开。每个Stage里Task的数量由Stage最后一个RDD中的分区数决定。如果Stage要生成Result,则该Stage里的Task都是ResultTask,否则是ShuffleMap。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐