Spark中Task,Partition,RDD、节点数、Executor数、core数目的关系和Application,Driver,Job,Task,Stage理解

本文详细阐述了Spark中并发度涉及的概念,如File、Block、Split、Task、Partition及RDD之间的关系。同时介绍了资源分配原理,包括节点、Executor、core数目关系,以及不同模式下的资源计算方式。

转自:https://www.cnblogs.com/bonelee/p/11063453.html,做了一些修改和调整

梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数、Executor数、core数目的关系。

输入可能以多个文件的形式存储在HDFS上,每个File都包含了很多块,称为Block。
当Spark读取这些文件作为输入时,会根据具体数据格式对应的InputFormat进行解析,一般是将若干个Block合并成一个输入分片,称为InputSplit,注意InputSplit不能跨越文件。
随后将为这些输入分片生成具体的Task。InputSplit与Task是一一对应的关系。
随后这些具体的Task每个都会被分配到集群上的某个节点的某个Executor去执行。

  • 每个节点可以起一个或多个Executor。
  • 每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
  • 每个Task执行的结果就是生成了目标RDD的一个partiton。

注意: 这里的core是虚拟的core而不是机器的物理CPU核,可以理解为就是Executor的一个工作线程。

而 Task被执行的并发度 = Executor数目 * 每个Executor核数。

至于partition的数目:

  • 对于数据读入阶段,例如sc.textFile,输入文件被划分为多少InputSplit就会需要多少初始Task。
  • 在Map阶段partition数目保持不变。
  • 在Reduce阶段,RDD的聚合会触发shuffle操作,聚合后的RDD的partition数目跟具体操作有关,例如repartition操作会聚合成指定分区数,还有一些算子是可配置的。

1,Application

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

2,Driver

 Spark中的driver感觉其实和yarn中Application Master的功能相类似。主要完成任务的调度以及和executor和cluster manager进行协调。有client和cluster联众模式。client模式driver在任务提交的机器上运行,而cluster模式会随机选择机器中的一台机器启动driver。从spark官网截图的一张图可以大致了解driver的功能。

 

3,Job

 Spark中的Job和MR中Job不一样不一样。MR中Job主要是Map或者Reduce Job。而Spark的Job其实很好区别,一个action算子就算一个Job,比方说count,first等。

4, Task

Task是Spark中最新的执行单元。RDD一般是带有partitions的,每个partition的在一个executor上的执行可以任务是一个Task。 

5, Stage

Stage概念是spark中独有的。一般而言一个Job会切换成一定数量的stage。各个stage之间按照顺序执行。至于stage是怎么切分的,首选得知道spark论文中提到的narrow dependency(窄依赖)和wide dependency( 宽依赖)的概念。其实很好区分,看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。宽依赖和窄依赖的边界就是stage的划分点

 

下面是一个资源分配的具体的例子

参数列表如下所示:

--class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client --driver-memory 4g --num-executors 2 --executor-memory 2g --executor-cores 2 /opt/apps/spark-1.6.0-bin-hadoop2.6/lib/spark-examples*.jar 10

参数说明如下所示:

 
参数参考值说明
classorg.apache.spark.examples.SparkPi作业的主类。
masteryarn以yarn模式运行spark应用。
yarn-client等同于 –-master yarn —deploy-mode client, 此时不需要指定deploy-mode。
yarn-cluster等同于 –-master yarn —deploy-mode cluster, 此时不需要指定deploy-mode。
deploy-modeclientclient 模式表示作业的 AM 会放在 Master 节点上运行。要注意的是,如果设置这个参数,那么需要同时指定上面 master 为 yarn。
clustercluster 模式表示 AM 会随机的在 worker 节点中的任意一台上启动运行。要注意的是,如果设置这个参数,那么需要同时指定上面 master 为yarn。
driver-memory4gdriver 进程使用的内存,不可超过单机的最大可使用内存。
num-executors2创建多少个 executor。
executor-memory2g各个 executor 使用的最大内存,不可超过单机的最大可使用内存。
executor-cores2各个 executor 使用的并发线程数,也即每个 executor 最大可并发执行的 Task 数目。

资源计算

在不同模式、不同的设置下运行时,作业使用的资源情况如下表所示:

  • yarn-client 模式的资源计算
     
    节点资源类型资源量(结果使用上面的例子计算得到)
    mastercore1
    memdriver-memroy = 4G
    workercorenum-executors * executor-cores = 4
    memnum-executors * executor-memory = 4G
    • 作业主程序(Driver 程序)会在 master 节点上执行。按照作业配置将分配 4G(由 —driver-memroy 指定)的内存给它(当然实际上可能没有用到)。
    • 会在 worker 节点上起 2 个(由 —num-executors 指定)executor,每一个 executor 最大能分配 2G(由 —executor-memory 指定)的内存,并最大支持 2 个(由—executor-cores 指定)task 的并发执行。
  • yarn-cluster 模式的资源计算
     
    节点资源类型资源量(结果使用上面的例子计算得到)
    master 一个很小的 client 程序,负责同步 job 信息,占用很小。
    workercorenum-executors * executor-cores+spark.driver.cores = 5
    memnum-executors * executor-memory + driver-memroy = 8g

    说明:这里的 spark.driver.cores 默认是 1,也可以设置为更多。

资源使用的优化

  • yarn-client 模式若您有了一个大作业,使用 yarn-client 模式,想要多用一些这个集群的资源,请参见如下配置:
    --master yarn-client --driver-memory 5g –-num-executors 20 --executor-memory 4g --executor-cores 4

    注意

    • Spark 在分配内存时,会在用户设定的内存值上溢出 375M 或 7%(取大值)。
    • Yarn 分配 container 内存时,遵循向上取整的原则,这里也就是需要满足 1G 的整数倍。

    按照上述的资源计算公式,

    • master 的资源量为:

      • core:1
      • mem:6G (5G + 375M 向上取整为 6G)
    • workers 的资源量为:

      • core: 20*4 = 80
      • mem: 20*5G (4G + 375M 向上取整为 5G) = 100G
    可以看到总的资源没有超过集群的总资源,那么遵循这个原则,您还可以有很多种配置,例如:
    --master yarn-client --driver-memory 5g --num-executors 40 --executor-memory 1g --executor-cores 2
    --master yarn-client --driver-memory 5g --num-executors 15 --executor-memory 4g --executor-cores 4
    --master yarn-client --driver-memory 5g --num-executors 10 --executor-memory 9g --executor-cores 6

    原则上,按照上述的公式计算出来的需要资源不超过集群的最大资源量就可以。但在实际场景中,因为系统,hdfs 以及 E-MapReduce 的服务会需要使用 core 和 mem 资源,如果把 core 和 mem 都占用完了,反而会导致性能的下降,甚至无法运行。

    executor-cores 数一般也都会被设置成和集群的可使用核一致,因为如果设置的太多,CPU 会频繁切换,性能并不会提高。

  • yarn-cluster 模式当使用 yarn-cluster 模式后,Driver 程序会被放到 worker 节点上。资源会占用到 worker 的资源池里面,这时若想要多用一些这个集群的资源,请参加如下配置:
    --master yarn-cluster --driver-memory 5g --num-executors 15 --executor-memory 4g --executor-cores 4

     

### SparkJobStageTask Partition 的概念 #### 1. **Job** 在 Spark 中,一个作业(Job)是由驱动程序(Driver)提交的一组计算任务。当动作(Action)被触发时,Spark 将会创建一个新的 Job 来执行必要的转换操作并返回最终的结果给用户[^3]。每个 Job 可能由多个 Stage 组成。 #### 2. **Stage** 阶段(Stage)是 Job 的子集,表示一组可以连续运行的任务集合而无需等待其他据完成 Shuffle 操作。如果存在宽依赖关系(Wide Dependency),例如 `groupByKey` 或者 `reduceByKey`,那么这些操作将会引发一次 Shuffle,并划分出新的 Stage[^1]。因此,在同一个 Stage 内部只会有窄依赖(Narrow Dependency),即父 RDD 的分区可以直接映射到子 RDD 的分区上而不涉及跨节点的据移动。 #### 3. **Task** 任务(Task)是最基本的工作单元,它对应于某个特定的分区上的具体处理逻辑。每一个 Task 负责对输入的一个或几个分片进行实际的操作。Tasks 是分配给集群中的 Executor 执行的具体工作项,其量通常等于该 Stage 下所有 Partitions 的总数目。 #### 4. **Partition** 分区(Partition)是指 RDD 据结构内部的一种物理切分方式。它是 Spark 并行化的核心单位之一;通过合理设置分区数目能够有效提升性能以及资源利用率。对于某些需要重新分布据的情况(比如基于 Key 的聚合运算),可能会经历所谓的 Shuffle 过程来调整各节点间存储的内容布局以便满足后续计算需求[^2]。 ```python # Example Code Illustrating Basic Concepts in PySpark from pyspark.sql import SparkSession spark = SparkSession.builder.appName("example").getOrCreate() data = [(i,) for i in range(10)] rdd = spark.sparkContext.parallelize(data, numSlices=5) def process(x): return (x[0], x[0]*2) mapped_rdd = rdd.map(process).cache() result = mapped_rdd.collect() print(result) ``` 上述代码片段展示了如何创建一个简单的 RDD 对象及其相关联的基本属性设定过程。这里我们指定了初始据源划分为五个部分来进行进一步加工前后的各种变换流程演示。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值