Spark基础入门

9 篇文章 0 订阅
3 篇文章 0 订阅
  • 最近在研究spark,spark现在可以算是最流行的大数据计算框架啦,mr只能进行离线计算的批处理,presto,implala进行交互式查询,storm只能进行流计算,而spark恰恰集成了这些。我这篇文章只进行基础入门的介绍(系统架构,运行模式)。
    - spark和mr的比较
    在这里插入图片描述
    spark把计算中间数据放到内存(cache,persist),mr的map阶段和ruduce阶段都需要进行溢写落盘,这样过多的磁盘io,会大大影响磁盘效率。
    sparkDAG(有向无环图)的概念,更加的适合于计算,mr如果实现需要编写n个mr,过于麻烦。
    spark使用多线程池模型来减少task启动开稍,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作
    运行模式
    在这里插入图片描述
    这里是我之前一直不理解的地方,问了一个朋友,查了一些资料,了解到了其运行原理。
    Driver:Spark中的Driver即运行main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭。
    Executer:是运行在worker上的一个进程,负责运行task。每个executer 有多个线程 每个线程执行一个task,一个executer对应一个jvm。
    cache:spark计算中间中间数据存放地方(缓存)
    task:spark上的工作单元,一个task对应一个partition,mr 一个进程启动一个线程 执行任务,而spark是一个进程启动多个线程,一个线程执行一个task
    Job:一个Job包含多个RDD及作用于相应RDD上的各种操作。、
    Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表一组关联的,相互之间没有Shuffle依赖关系的任务组成的任务集。
    Cluter Manager:指的是在集群上获取资源的外部服务。目前有三种类型
    spark的四中运行模式
    local:本地模式
    将Spark应用以多线程方式,直接运行在本地,便于调试本地模式分类(一般用于开发测试)
    local:只启动一个executor
    local[K]:启动K个executor
    local[*]:启动跟cpu数目相同的executor
    这个模式下本地会出现一个SparkSubmit进程,这个进程充当了集群模式中所有角色,包括master,worker,Client进程,Spark的driver程序,Spark执行Task的Executor的角色,说通俗点就是既当爹又当娘
    在这里插入图片描述
    Standlone:独立模式
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181126155305538.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzIzODc1MQ==,size_16,color_FFFFFF,t_70
    Standalone模式使用的是Spark自己实现的资源调度框架,其主要的节点有Client节点、Master节点和Worker节点。其中Driver既可以运行在Master节点上中,也可以运行在本地Client端。当用spark-shell交互式工具提交Spark的Job时,Driver在Master节点上运行;当使用spark-submit工具提交Job或者在Eclips、IDEA等开发平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的
    工作流程:
    (1).SparkContext连接到Master,向Master注册并申请资源(CPU Core 和Memory);
    (2).Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源,然后在该Worker上获取资源,然后启动StandaloneExecutorBackend;
    (3).StandaloneExecutorBackend向SparkContext注册;
    (4).SparkContext将Applicaiton(main)代码发送给StandaloneExecutorBackend;并且SparkContext解析Applicaiton代码,构建DAG图,并提交给DAG Scheduler分解成Stage(当碰到Action操作时,就会催生Job;每个Job中含有1个或多个Stage,Stage一般在获取外部数据和shuffle之前产生),然后以Stage(或者称为TaskSet)提交给Task Scheduler,Task Scheduler负责将Task分配到相应的Worker,最后提交给StandaloneExecutorBackend执行;
    (5).StandaloneExecutorBackend会建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成。
    (6).所有Task完成后,SparkContext向Master注销,释放资源。
    在这里插入图片描述
    在这里插入图片描述

yarn client:分布式模式
在yarn上运行spark集群。这个模式不需要启动master和worker守护进程,即没必要提前执行spark集群,当我们以yarn client模式执行spark应用时,yarn会启动spark集群。在该模式可以打开交互式shell。
执行流程:
(1).Spark Yarn Client向YARN的ResourceManager申请启动Application Master。同时在SparkContent初始化中将创建DAGScheduler和TASKScheduler等,由于我们选择的是Yarn-Client模式,程序会选择YarnClientClusterScheduler和YarnClientSchedulerBackend;
(2).ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,与YARN-Cluster区别的是在该ApplicationMaster不运行SparkContext,只与SparkContext进行联系进行资源的分派;
(3).Client中的SparkContext初始化完毕后,与ApplicationMaster建立通讯,向ResourceManager注册,根据任务信息向ResourceManager申请资源(Container);
(4).一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向Client中的SparkContext注册并申请Task;
(5).Client中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向Driver汇报运行的状态和进度,以让Client随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
(6).应用程序运行完成后,Client的SparkContext向ResourceManager申请注销并关闭自己
yarn cluster:
在这里插入图片描述
该模式和yarn client差不多,都是在yarn上运行spark集群。区别在于yarn client可以打开shell交互模式,而yarn cluster不允许
执行流程:
(1). Spark Yarn Client向YARN中提交应用程序,包括ApplicationMaster程序、启动ApplicationMaster的命令、需要在Executor中运行的程序等;
(2). ResourceManager收到请求后,在集群中选择一个NodeManager,为该应用程序分配第一个Container,要求它在这个Container中启动应用程序的ApplicationMaster,其中ApplicationMaster进行SparkContext等的初始化;
(3). ApplicationMaster向ResourceManager注册,这样用户可以直接通过ResourceManage查看应用程序的运行状态,然后它将采用轮询的方式通过RPC协议为各个任务申请资源,并监控它们的运行状态直到运行结束;
(4). 一旦ApplicationMaster申请到资源(也就是Container)后,便与对应的NodeManager通信,要求它在获得的Container中启动启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请Task。这一点和Standalone模式一样,只不过SparkContext在Spark Application中初始化时,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler进行任务的调度,其中YarnClusterScheduler只是对TaskSchedulerImpl的一个简单包装,增加了对Executor的等待逻辑等;
(5). ApplicationMaster中的SparkContext分配Task给CoarseGrainedExecutorBackend执行,CoarseGrainedExecutorBackend运行Task并向ApplicationMaster汇报运行的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务;
(6). 应用程序运行完成后,ApplicationMaster向ResourceManager申请注销并关闭自己。
区别:
YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业;
YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开。

重点:
在Yarn的NodeManager节点上启动一个map task或者reduce task,在物理上启动的是一个jvm进程;而Spark的task是Executor进程中的一个线程
每个节点可以起一个或多个 Executor,当task被提交到executor之后,会根据executor可用的cpu核数,决定一个executor中最多同时运行多少个task,Task 被执行的并发度 = Executor 数目 * 每个 Executor 核数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值