Spark 从入门到放弃(一)Spark基础概念

(一)Spark基础概念

1、Application:Spark应用程序

application(应用)其实就是用spark-submit提交的程序。一个application通常包含三部分:从数据源(比方说HDFS)取数据形成RDD,通过RDD的transformation和action进行计算,将结果输出到console或者外部存储(比方说collect收集输出到console)。

 2、Driver:驱动程序

Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等;当Executor部分运行完毕后,Driver负责将SparkContext关闭。通常SparkContext代表Driver。

  • 创建spark的上下文
  • 划分RDD并生成有向无环图(DAGScheduler)
  • 与spark中的其他组进行协调,协调资源等等(SchedulerBackend)
  • 生成并发送task到executor(taskScheduler) 

 3、Executor:执行器

Application运行在Worker节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。
1、spark.executor.cores:是用来指定executor的cpu内核个数,分配更多的内核意味着executor并发能力越强,能够同时执行更多的task
2、spark.cores.max :为一个application分配的最大cpu核心数,如果没有设置这个值默认为spark.deploy.defaultCores
3、spark.executor.memory:配置executor内存大小
总结:executor 数量 = spark.cores.max/spark.executor.cores
spark.cores.max 是指你的spark程序需要的总核数
spark.executor.cores 是指每个executor需要的核数

 4、Executor:执行器

集群中任何可以运行Application代码的节点,是spark任务(task)的执行单元,运行在worker上,但是不等同于worker,实际上它是一组计算资源(cpu核心、memory)的集合。一个worker上的memory、cpu由多个executor共同分摊,类似于Yarn中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点,在Spark on Messos模式中指的就是Messos Slave节点。

 executor主要参数示例
1、spark.executor.cores:顾名思义这个参数是用来指定executor的cpu内核个数,分配更多的内核意味着executor并发能力越强,能够同时执行更多的task
2、spark.cores.max :为一个application分配的最大cpu核心数,如果没有设置这个值默认为spark.deploy.defaultCores
3、spark.executor.memory:配置executor内存大小
总结:executor 数量 = spark.cores.max/spark.executor.cores
spark.cores.max 是指你的spark程序需要的总核数
spark.executor.cores 是指每个executor需要的核数

5、RDD:弹性分布式数据集

resilient distributed datasets 弹性分布式数据集,是 Spark 中最基本的数据抽象,它代表一个不可变、只读的,被分区的数据集(物理不存在,只是一个逻辑概念)
RDD的三种创建形式
1、集合并行化创建(通过 scala 集合创建) scala 中的本地集合—> spark RDD
val arr = Array(1,2,3,4,5)
val rdd = sc.parallelize(arr)
val rdd =sc.makeRDD(arr)
通过集合并行化方式创建 RDD,适用于本地测试,做实验
2、读取外部文件系统,比如 HDFS 等
// 读取外部文件
val rdd2 = sc.textFile(“hdfs://hdp-01:9000/words.txt”)
// 读取本地文件
val rdd2 = sc.textFile(“file:///root/words.txt”) // 文件的前缀,可加可不加
3、rdd之间的转换
已存在的rdd,经过调用转换类的算子,生成一个新的rdd

6、Shuffle

目的是为了使具有某种共同风格的数据重新汇聚到一个计算节点上;
shuffle是会进行磁盘读写的,因为shuffle是将几百甚至几千机器上的数据汇聚到一个节点或者partition上,内存有可能装不下,这个过程会发生多次硬盘续写;
首先,哪种rdd间的操作会需要shuffle呢?
这取决于该rdd和它的所依赖的rdd 的关系(rdd和它依赖的parent rdd 的关系有两种不同的类型:窄依赖和宽依赖)
-----------------很烦呀,shuffle没弄明白又出来一个宽依赖(wide dependency)和窄依赖(narrow dependency).....
1、窄依赖(narrow dependency):由于rdd的每个partition依赖固定数量的parent rdd 的partition,因此可以用一个task来处理这些partition,这些partition相互独立,所以这些task 可以并行计算(父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区)。


2、宽依赖(wide dependency):由于需要shuffle ,因此所有的 rdd 的parent partition shuffle完成之后,新的partition 才会出现,这样接下来的task才能被处理,因此,宽依赖可以认为是dag的分割线,或者说spark根据宽依赖将job划分为不同的阶段(stage)((父RDD每一个分区最多被一个子RDD的分区所用;表现为一个父RDD的分区对应于一个子RDD的分区,或两个父RDD的分区对应于一个子RDD 的分区))。

常见的窄依赖有:map、filter、union、mapPartitions、mapValues、join(父RDD是hash-partitioned :如果JoinAPI之前被调用的RDD API是宽依赖(存在shuffle), 而且两个join的RDD的分区数量一致,join结果的rdd分区数量也一样,这个时候join api是窄依赖)。

常见的宽依赖有groupByKey、partitionBy、reduceByKey、join(父RDD不是hash-partitioned :除此之外的,rdd 的join api是宽依赖)。

7、DAG:有向无环图

有向无环图,Directed Acyclic Graph的缩写,常用于建模。Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage,RDD的依赖关系使用Dependency维护,参考Spark RDD之Dependency,DAG在Spark中的对应的实现为DAGScheduler。

8、DAGScheduler:有向无环图调度器

基于DAG划分Stage 并以TaskSet的形势提交Stage给TaskScheduler;负责将作业拆分成不同阶段的具有依赖关系的多批任务;最重要的任务之一就是:计算作业和任务的依赖关系,制定调度逻辑。在SparkContext初始化的过程中被实例化,一个SparkContext对应创建一个DAGScheduler。

9、TaskScheduler:任务调度器

将Taskset提交给worker(集群)运行并回报结果;负责每个具体任务的实际物理调度。

10、Job:作业

原始的rdd经过一系列转换在最后一个action会触发一个动作,这个动作会生成一个job;一个JOB包含多个RDD及作用于相应RDD上的各种Operation,由多个Task组成的并行计算;DAGScheduler将job 提交由TaskSCheduler最后提交至executor计算运行。

11、Stage:调度阶段

一个任务集对应的调度阶段;每个Job会被拆分很多组Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段;Stage分成两种类型ShuffleMapStage、ResultStage。
一个stage的开始就是从外部储存或者shuffle结果中读取数据,一个stage的结束就是由于发生了shuffle或者生成结果时;

12、TaskSet:任务集

由一组关联的,但相互之间没有Shuffle依赖关系的任务所组成的任务集。

1)一个Stage创建一个TaskSet;
2)为Stage的每个Rdd分区创建一个Task,多个Task封装成TaskSet

13、Task:任务

Task是Spark中最新的执行单元,是被送到某个Executor上的工作任务;单个分区数据集上的最小处理流程单元。RDD一般是带有partitions的,每个partition的在一个executor上的执行可以任务是一个Task。

总体如图所示:

参考链接:http://www.raincent.com/content-85-11052-1.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值