Spark基础之1.0-原理

1. Hadoop与spark的关系

  1. Hadoop是典型的大数据批量处理架构,有HDFS负责静态数据的存储,并通过MapReduce将计算逻辑分配到个数据节点进行数据计算;将每次MapReduce的结果从内存写入磁盘,IO很大;

  2. Spark与Hadoop配合开发,将数据一直存在内存当中,指导获取最后的结果后才会写入磁盘;
    在这里插入图片描述

  3. 伯克利大学将 Spark 的整个生态系统成为 伯克利数据分析栈(BDAS),在核心框架 Spark 的基础上,主要提供四个范畴的计算框架:
    3.1 spark SQL 提供SQL查询,返回Dataframe结构,可parquet格式存放,数据操作方式类似与Hive;需获取SQL context
    3.2 Spark Streaming:流式计算,主要用于处理实时线上数据 (后面会接着写博客)
    3.3 MLlib:提供机器学习的各种模式调优
    3.4 GraphX:提供基于图的算法,如PageRank

  4. Spark的主要特点还包括:
    4.1 提供cache机制来支持需要反复迭代计算,可以多次共享,减少IO;
    4.2 提供DAG(有向无环图)计算框架,减少了将中间结果写入HDFS的开销,每次计算得到的结果,如果没有cache的情况下都是从图的开始重新运行一次获得的;
    4.3 使用多线程池模型,减少task启动开销,shuffle过程避免不必要的sort操作,减少了IO操作

2. Spark系统架构

  1. Application:基于Spark的用户程序,比如写的一个spark作业运行起来,整体就是一个Application
  2. Driver:运行Application的main函数,并且创建了SparkContext,在Master上完成
  3. job:作业,多个Rdd的操作,submit提交后就是一个作业
  4. Stage:阶段,spark将写的作业代码,分成一个个stage来按照顺序完成,每个stage都会被分配到Executor上按照Task的形式运行
  5. Executor:运行在集群节点(Worker)上的一个进程,这个进程上会有很多Task在运行,并将数据存在内存和该节点的本地磁盘,一个Application有很多Executor在提交任务作业的时候通过参数指定
  6. Cluster Manager:在集群上获取的外部服务,如Yarn,提供运行的集群资源
  7. Operation:作用与RDD的操作:Transformation和Action

总结:一个Application是有Driver启动,然后可以由多个job组成,job根据代码区分出stage,然后Driver将stage中的代码交给Executor的task去完成,stage是作业调度的基本单位。

整个Spark集群中分为Master节点和worker节点,其中Master节点上常驻Master守护进程和Driver进程,Master负责将串行的任务变成可并行执行的任务集Tasks,同时负责出错问题的处理;Worker节点常驻worker守护进程 Master节点和Worker节点的分工不同,Master负责管理全部Worker节点,Worker负责执行任务。

Driver的功能是创建SparkContext,负责执行用户写的main函数,Application就是用户写的。

每个Worker上存在一个或者多个Executor进程,该对象有一个线程池,每个线程负责一个Task任务执行,根据Executor 上CPU core的数量,每个时间可以并行多个跟core一样数量的Task,Task任务就是具体执行的Spark程序的任务
在这里插入图片描述

3. Spark运行流程

在使用Spark-submit提交作业后:

  1. 首先启动一个对应的Driver进程,根据部署模式,Driver在集群的某个节点或者本地启动;
  2. 向集群管理器申请spark作业需要的资源,这里的资源指的是Executor的数量,在提交作业的参数中已经指定;
  3. 集群管理器根据申请的资源,启动指定数量的Executor,每个Executor都占用一定数量的内存和cpu core;
  4. 申请到资源后,Driver开始调度和执行编写的代码,首先将代码拆分成多个stage,每个stage执行部分代码片段,并且为每一个stage创建一批Task;
  5. 然后将这些Task分配到各个Executor上执行,Task是最小的计算单元,负责执行一模一样的逻辑只是每个Task处理的数据不同而已;
  6. 一个stage的所有Executor上的Task执行完毕之后,会在所在的各节点的本地磁盘中写入计算的中间结果;
  7. Driver开始调度运行下一个stage,其输入是上一个stage的输出;
  8. 反复循环,计算完所有的数据,得到结果。

注:

  1. Spark是根据shuffle类算子来进行stage的划分,如果执行的代码中存在某个shuffle算子(reduceByKey,join等),那么就会在该处划分一个stage,大致可以理解为,shuffle执行前是一个stage,shuffle操作以及之后的代码是一个stage。因此,一个有shuffle操作的stage刚开始执行的时候,他的每个task可能需要从上一个stage的task所在的节点,通过网络传输的方式拉取自己需要处理的所有Key,然后将拉取的数据进行后续的聚合操作;
  2. 当执行持久化操作cache/persist时,根据持久化的级别不同,每个task计算出来保存到Executor进程的内存或者磁盘中;
    因此,Executor的内存主要分为三块:
    第一块:让Task执行自己编写的代码,默认20%
    第二块:Task通过shuffle过程拉取上一个stage的输出,进行聚合使用,默认20%
    第三块:RDD持久化使用,默认60%
  3. Task执行的速度,跟每个Executor进程的CPU core数量有直接的关系,一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式多线程并发执行,如果CPU core数量比较充足,而且分配到的Task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些Task线程。

实际编程中,我们不需关心以上调度细节.只需使用 Spark 提供的指定语言的编程接口调用相应的 API 即可.
  在 Spark API 中, 一个 应用(Application) 对应一个 SparkContext 的实例。一个 应用 可以用于单个 Job,或者分开的多个 Job 的 session,或者响应请求的长时间生存的服务器。与 MapReduce 不同的是,一个 应用 的进程(我们称之为 Executor),会一直在集群上运行,即使当时没有 Job 在上面运行。
  而调用一个Spark内部的 Action 会产生一个 Spark job 来完成它。 为了确定这些job实际的内容,Spark 检查 RDD 的DAG再计算出执行 plan 。这个 plan 以最远端的 RDD 为起点(最远端指的是对外没有依赖的 RDD 或者 数据已经缓存下来的 RDD),产生结果 RDD 的 Action 为结束 。并根据是否发生 shuffle 划分 DAG 的 stage.

参考链接

https://zhuanlan.zhihu.com/p/34436165

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值