zoukankan      html  css  js  c++  java
  • RDD机制实现模型Spark初识

    Spark简介

           Spark是基于内存计算的大数据分布式计算框架。Spark基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性。
           在Spark中,通过RDD(Resilient Distributed Dataset,弹性分布式数据集)来进行计算,这些分布式集合,并行的分布在整个集群中。RDDs是Spark分发数据和计算的基础抽象类。

    RDD属性:

     
    1. - A list of partitions  
    2. - A function for computing each split  
    3. - A list of dependencies on other RDDs  
    4. - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)  
    5. - Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)  

    Spark术语

           Application:用户自定义的Spark程序,用户提交后,Spark为App分配资源将程序转换并执行。
           Driver Program:运行Application的main()函数并且创建SparkContext。
           SparkContext:是用户逻辑与Spark集群主要的交互接口,它会和Cluster Manager进行交互,负责计算资源的申请等。
           Cluster Manager:资源管理器,负责集群资源的管理和调度,支持的有:Standalone,Mesos和YARN。在standalone模式中即为Master主节点,控制整个集群,监控Worker。在YARN模式中为资源管理器。
           Worker Node:从节点,负责控制计算节点,启动Executor或Driver。在YARN模式中为NodeManager,负责计算节点的控制。
           Executor:执行器,是为某Application运行在worker node上的一个进程,该进程里面会通过线程池的方式负责运行任务,并负责将数据存在内存或者磁盘上。每个Application拥有独立的一组executors。
           RDD DAG:当RDD遇到Action算子,将之前的所有算子形成一个有向无环图(DAG)。再在Spark中转化为Job,提交到集群进行执行。一个App可以包含多个Job。
           Job:一个RDD Graph触发的作业,往往由Spark Action算子触发,在SparkContext中通过runJob()向Spark提交Job。
           Stage:每个Job会根据RDD的宽依赖关系被切分成很多Stage,每个Stage中包含一组相同的Task,这一组Task也叫TaskSet。
           Task:一个分区对应一个Task,Task执行RDD中对应Stage中所包含的算子。Task被封装好后放入Executor的线程池中执行。
           DAG Scheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler。
           TaskScheduler:将Task分发给Executor执行。
           SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。

    Spark架构

            
            
           Client提交Application,用户程序中会创建一个SparkContext,新创建的SparkContext会根据用户在编程的时候设置的参数,或者是系统默认的配置连接到Cluster Manager上。
           Cluster Manager找到一个Worker启动Driver,Driver向Cluster Manager或者资源管理器申请资源,之后将应用转化为RDD Graph,再由DAGScheduler将RDD Graph转化为Stage的有向无环图(taskset)提交给TaskScheduler,由TaskScheduler提交任务(Task)给Executor进行执行。
           Executor在接收到Task之后,会下载Task的运行时依赖的包和库,准备好Task运行环境所需要的信息之后,就会在线程池中执行task。task在运行的时候会把状态以及结果汇报给Driver。
           Driver会根据收到的Task的运行状态处理不同的状态更新,Task分为两种,一种是Shuffle Map Task,它实现数据的从新洗牌,在所有stage中,除最后一个之外,所有的stage都成为Shuffle阶段,结果会保存在Executor的本地文件系统中,另一种,也就是最后一个stage称为:result Task,它负责生成结果数据。
           Driver会不断的调用Task,将Task发送到Executor执行,在所有的Task都正确执行或者超过执行次数的限制仍然没有执行成功时停止。

           注意:Spark程序是在注册时完成资源分配的。在Worker上启动Executor,分配多少core,这些内容都是在程序启动初始化的时候完成的,而不是在工作过程中完成的。程序向Master注册,Master分配资源后交给 CoarseGrainedSchedulerBackend下的子类:SparkDeploySchedulerBackend 管理。然后是Driver的DAG的划分,然后交给DAG Scheduler(Standalone模式下就是TaskSchedulerImpl),TaskSchedulerImpl通过SchedulerBackend获得资源,把具体的任务分配到具体的机器(Executor)上。

  • 相关阅读:
    原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration
    vavr:让你像写Scala一样写Java
    Java黑科技之源:JVMTI完全解读
    JVM 源码解读之 CMS 何时会进行 Full GC
    MySQL 如何优化大分页查询?
    025:为什么需要将Logger对象声明为private static final类型的
    酷家乐一面二面
    趋势科技面试
    生活就是好好经历,无问西东----三月份总结
    30号快手笔试(三道ac两道半)————-历史上最大的网络失误orz
  • 原文地址:https://www.cnblogs.com/kloseking/p/5751293.html
Copyright © 2011-2022 走看看