spark工作机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011283591/article/details/65445708

spark

这里以wordcount程序为例,演示spark的基本流程和原理

基本概念

  • RDD:弹性分布式数据集。数据存放在各个节点上。spark对RDD进行操作。
  • 算子:各种操作/行动。spark中的函数
    • 创建
    • 变换
    • 缓存
    • 行动

spark架构分析

spark

  • application:用户编写的spakr程序,包含驱动程序和要运行的代码
  • driver驱动程序:main创建sparkcontent,程序结束后负责关闭sparkcontent。
  • sparkcontent:与clustermanager通信
  • clustermaster:集群资源管理器。
    • 是这个spark集群的核心。不负责具体的执行,只负责管理整个集群的计算机资源。(内存,cpu等)。每个计算节点都要向clustermaster注册自己的资源情况。
    • yarn,mesos等。
  • master节点:主节点,负责管理分配集群资源
  • slave节点:执行作业的逻辑节点。根据功能不同分成两类,任务调度节点和任务执行节点
    • Driver节点:整理程序逻辑的七点,创建sparkcontext,定义一个或多个RDD。
      • 将一个程序分割成物理上可执行的task。
      • 将task分到最合适的task节点上运行
    • worker节点
      • 运行executor进程。
      • 实际计算task任务
      • 为RDD提供内存
        spark可运行在单机上,也可以运行在集群上。这使得spark可以运行多种模式。
    • 本地模式
    • 单机模式
    • 伪分布式模式
    • yarn模式
    • mesos模式

一个spark程序的执行

spark相比mr更简介,容易理解。scala最大的特点是每次操作都是一次方法调用。先用map将所有的单词以空格为分隔符分成单词,在用flatMap将所有的单词都转化成kv模式,最后用reduce统计value的次数。

val file = sc.textFile("文本路径")
val result = file.flatMap(s => (x.split(" ")).map(x => (x,1)).reduceByValue(_+_)
result.saveAsTxtFile("文本路径")

(1) 创建RDD。用textFile()是一个创建RDD的算子。从指定的HDFS文件中读取指定的数据。这里还可以指定分片的个数。
(2) spark中的分区是一个逻辑概念,真正存储的是数据块。一个分区对应一个物理上的数据块,一个partion对应一个block。
(3) flatMap对RDD算子进行一对一的变换,这个stage是窄依赖的,生成的partion仍然是跟原来partion的个数一样。
(4) reduceByKey操作是宽依赖。执行一个shuffle操作。这里将partion个数处理成spark中默认的个数。partion的个数可能变化。reduceByValue是真正触发操作的行动,其他的都是惰性求值。
(5) 最后将执行结果保存到指定路径中。

结合wordcount和spark架构

spark的初始化可以通过sparkshell和sparksubmit进行。
初始化之后:
(1) 编写一个主函数,里面包含RDD的创建,转换等操作。 用户将完整的spark程序提交到集群上,申请并执行。集群收到请求后,启动Driver节点,相应主函数。
(2) 当Driver启动后,发现RDD需要一系列的转换操作,这时候会与master节点通信,通过mastrer节点申请程序所需的资源。
(3) soark上的worker节点都向master注册了自己的计算资源,当mastre收到driver的通信后,会通过心跳机制检测各个worker节点是否能正常工作,然后通过已经注册的worker节点启动executor进程
(4) master通知dirver节点哪些worker节点正常启动运行了,让driver节点使用这些worker节点运行程序
(5) driver对RDD进行分割。然后分发给worker节点操作,并随时监控执行情况。具体的driver对RDD的操作见后
(6) worker节点上的executor进程是真正的任务执行者。一个worker上可以有多个executor进程。每个executor运行在一个jvm中。
(7) driver通知client完成任务。

spark中driver节点对RDD的操作

  • 构建RDD的DAG(有向无环图)
  • DAG的拆分(把job拆分成stage。一个job对应一个action)
    • 利用宽窄依赖,区分各个不同的stage。当提交RDD
    • DAGscheduler会遍历RDD有向无环图,碰到相同的依赖就放到同一个阶段。每个stage内都是一组相互关联但彼此之间没有关系的任务集合。(taskset)
    • DAGscheduler调度:最高层次的调度调度的对象是stage
      • 为每个job绘出DAG,绘出DAG并查找最短路径。(非递归层次遍历)
      • 把每个job分割成不同的阶段stage。并生成了stage的有序执行序列。stage内是taskset
      • 把task交给taskscheduler。
      • waitingstages 父stage未执行完的stage
      • runningstages 正在运行的stage
      • faildstages 执行失败的stage
    • Taskscheduler调度:对象是task
      • 为收到的不同taskset创建一个tasksetmanager,tasksetmanager实际负责taskset中task的调度。
      • tasksetmanager通过taskset与底层物理节点通信
      • fifo和fair调度模式
  • task的执行
    • 由taskscheduler选择合适的节点,分配给worker节点,然后在节点上启动executor进程。
    • 一个executor对应一个jvm进程中。
  • spakr可以灵活设计DAG调度,还能结合其他系统资源调度。

spark作业执行流程

  • 流程:
    DAGschedler–>taskset(多个task组成)–>taskschuduler–>taskmanager–>workor(多个jvm组成)–>executor–>执行
  • spark 作业提交,并向master申请资源(多个作业的时候采用fifo或fair模式)
  • master收到申请,分配资源
  • 对spark的RDD做转换操作,构建DAG图
  • DAG中把job拆分成stage,判断finalstage是否存在shuffle操作。
  • 作业真正的提交是在碰到action操作的时候(与依赖无关)

没有更多推荐了,返回首页