Spark_分区、任务等概念总结

https://blog.csdn.net/sandra_csdn/article/details/78110622

在这里插入图片描述

spark隐式创建由操作组成的逻辑上的有向无环图。驱动器执行时,它会把这个逻辑图转换为物理执行计划,然后将逻辑计划转换为一系列的步骤(stage),每个步骤由多个任务组成。

步骤组成任务、数据组成任务。所以数据和对数据的操作都封装在任务里面了?数据是分布的,那么步骤的执行是什么过程?因为是流水线操作,所以对于每一个工作节点,都有一份步骤,然后根据步骤一步步计算???

Spark文档中使用驱动器节点和执行器节点的概念来描述执行Spark的进程

主节点(master)和工作节点(worker)的概念被用来分别表述集群管理器中的中心化部分和分布式部分。

输入以多个文件的形式存储在HDFS上,每个File都包含了很多块,成为Block

如果输入只有一个文件存储在Hbase里,也是按块大小分布存储的吗?

以块形式存储的文件可以跨节点嘛?

Spark读取文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并为一个输入分片,成为InputSplit。InputSplit不能跨文件。

随后为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系

随后这些具体的Task每个都会被分配到集群上的某个节点的某个Ececutor去执行

每个节点可以起一个或多个Executor
executor就是执行器节点嘛?所以每个工作节点(主机)可以有多个执行器?

每个Executor由若干个core组成,每个Executor的每个core(虚拟core,可以理解为一个Executor的工作线程)一次只能执行一个Task
每个Task执行的结果就是生产了目标RDD的一个partition
Task执行的并发度 = Executor的个数 * Executor的核数

partition的数目:

数据读入阶段。例如sc.textFile,输入文件划分为多少个InputSpliter就会需要多少的初始Task
Map阶段partition不变
Reduce阶段,RDD会触发shuffle操作,聚合后的RDD的partition数目根具体的操作有关
RDD在计算的时候,每一个分区都会起一个Task,所以RDD的分区数目决定了总的Task数目

比如RDD有100个分区,那么计算的时候就会生成100个task,你的资源配置为10个计算节点,每个两2个核,同一时刻可以并行的task数目为20,计算这个RDD就需要5个轮次。
如果计算资源不变,你有101个task的话,就需要6个轮次,在最后一轮中,只有一个task在执行,其余核都在空转。
如果资源不变,你的RDD只有2个分区,那么同一时刻只有2个task运行,其余18个核空转,造成资源浪费。这就是在spark调优中,增大RDD分区数目,增大任务并行度的做法。

Spark的Driver、Job和Stage
csdn jwLee

例子说明

在这个例子中,假设你需要做如下一些事情:

将一个包含人名和地址的文件加载到RDD1中
将一个包含人名和电话的文件加载到RDD2中
通过name来Join RDD1和RDD2,生成RDD3
在RDD3上做Map,给每个人生成一个HTML展示卡作为RDD4
将RDD4保存到文件
在RDD1上做Map,从每个地址中提取邮编,结果生成RDD5
在RDD5上做聚合,计算出每个邮编地区中生活的人数,结果生成RDD6
Collect RDD6,并且将这些统计结果输出到stdout

在这里插入图片描述
其中红色虚线表示输入和输出,蓝色实线是对RDD的操作,圆圈中的数字对应了以上的8个步骤。接下来解释driver program, job和stage这几个概念:

Driver program是全部的代码,运行所有的8个步骤。
第五步中的save和第八步中的collect都是Spark Job。Spark中每个action对应着一个Job,transformation不是Job。
其他的步骤(1、2、3、4、6、7)被Spark组织成stages,每个job则是一些stage序列的结果。对于一些简单的场景,一个job可以只有一个stage。但是对于数据重分区的需求(比如第三步中的join),或者任何破坏数据局域性的事件,通常会导致更多的stage。可以将stage看作是能够产生中间结果的计算。这种计算可以被持久化,比如可以把RDD1持久化来避免重复计算。
以上全部三个概念解释了某个算法被拆分的逻辑。相比之下,task是一个特定的数据片段,在给定的executor上,它可以跨越某个特定的stage。
到了这里,很多概念就清楚了。驱动程序就是执行了一个Spark Application的main函数和创建Spark Context的进程,它包含了这个application的全部代码。Spark Application中的每个action会被Spark作为Job进行调度。每个Job是一个计算序列的最终结果,而这个序列中能够产生中间结果的计算就是一个stage。

通常Action对应了Job,而Transformation对应了Stage

官方解释如下(http://spark.apache.org/docs/latest/cluster-overview.html):
Driver Program: The process running the main() function of the application and creating the SparkContext.
Job: A parallel computation consisting of multiple tasks that gets spawned in response to a Spark action (e.g. save, collect); you’ll see this term used in the driver’s logs.
Stage: Each job gets divided into smaller sets of tasks called stages that depend on each other (similar to the map and reduce stages in MapReduce); you’ll see this term used in the driver’s logs.

一个Job被拆分成若干个Stage,每个Stage执行一些计算,产生一些中间结果。它们的目的是最终生成这个Job的计算结果。而每个Stage是一个task set,包含若干个task。Task是Spark中最小的工作单元,在一个executor上完成一个特定的事情。

Spark分区数、task数目、core数目、worker节点数目、executor数目梳理
三、理解从HDFS读入文件默认是怎样分区的

Spark从HDFS读入文件的分区数默认等于HDFS文件的块数(blocks),HDFS中的block是分布式存储的最小单元。如果我们上传一个30GB的非压缩的文件到HDFS,HDFS默认的块容量大小128MB,因此该文件在HDFS上会被分为235块(30GB/128MB);Spark读取SparkContext.textFile()读取该文件,默认分区数等于块数即235。

四、如何设置合理的分区数

1、分区数越多越好吗?

不是的,分区数太多意味着任务数太多,每次调度任务也是很耗时的,所以分区数太多会导致总体耗时增多。

2、分区数太少会有什么影响?

分区数太少的话,会导致一些结点没有分配到任务;另一方面,分区数少则每个分区要处理的数据量就会增大,从而对每个结点的内存要求就会提高;还有分区数不合理,会导致数据倾斜问题。

3、合理的分区数是多少?如何设置?

总核数=executor-cores * num-executor

一般合理的分区数设置为总核数的2~3倍

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值