每一个 spark job 根据 shuffle 划分 stage,每个 stage 形成一个或者多个 taskSet,了解了每个 stage 需要运行多少个 task,有助于我们优化 spark 运行

task 数

首先需要了解以下概念:

RDD,弹性分布式数据集,多个 partition;

split,切片,HDFS 上文件为什么要切片,如何切片,参考我的博客 hadoop 的 Split

textFlie 分区,textFile 如何对一个文件分区,参考我的博客 RDD认知与创建

创建 RDD 的过程我们可以认为没有 task 的概念,比如 读取 HDFS 文件;

有了 RDD 后才有 task 的概念;

重点

一个 inputSplit 对应 RDD 的一个 partition;

RDD 的一个 partition 对应一个 task,也就是说 一个 inputSplit 对应一个 task;

通常情况下 一个 block 对应一个 inputSplit;

  // 以 textFile 为例,每个 inputSplit 不能大于 blockSize,也就是说 可以把 block 切开,但不能把多个 block 组合起来,如果不指定分区,那么每个切片就是 block;

作如下实验证明上述结论

import time
from pyspark import SparkContext time.clock()
sc = SparkContext(master='yarn')
rdd = sc.textFile('/spark/gps/GPS3.csv', 2).repartition(100).map(lambda x: x).count()
print(time.clock()) ##### GPS3.csv 315M,分为 3 个 block
#### 不指定分区-100 runtime:0.64
### 划分2个 stage,
# 第一个 stage sc.textFile('/spark/gps/GPS3.csv').repartition(100) 共 3 个task,
# 第二个 stage .map(lambda x: x).count() 共 100个task
# 19/12/10 22:16:15 INFO cluster.YarnScheduler: Adding task set 0.0 with 3 tasks
# 19/12/10 22:16:34 INFO scheduler.TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, hadoop13, executor 2, partition 0, NODE_LOCAL, 7899 bytes)
# 19/12/10 22:17:07 INFO cluster.YarnScheduler: Adding task set 1.0 with 100 tasks #### 指定 5 个分区-100 runtime:0.54
### 划分2个 stage,
# 第一个 stage sc.textFile('/spark/gps/GPS3.csv').repartition(100) 共 5 个task,
# 第二个 stage .map(lambda x: x).count() 共 100个task
# 19/12/10 22:23:09 INFO cluster.YarnScheduler: Adding task set 0.0 with 5 tasks
# 19/12/10 22:17:07 INFO cluster.YarnScheduler: Adding task set 1.0 with 100 tasks #### 指定 2 个分区-100 runtime:0.6
### 划分2个 stage,
# 第一个 stage sc.textFile('/spark/gps/GPS3.csv').repartition(100) 共 3 个task,
# 第二个 stage .map(lambda x: x).count() 共 100个task
# 19/12/10 22:23:09 INFO cluster.YarnScheduler: Adding task set 0.0 with 3 tasks
# 19/12/10 22:17:07 INFO cluster.YarnScheduler: Adding task set 1.0 with 100 tasks

可以看到

task 并行度

首先明确一点,并行度与 task 数并无关系,并行度是由 spark-submit 提交的参数决定的

taskSet 被分发到多个 Executor 执行;

每个节点可以运行多个 Executor,一个 Executor 相当于一个进程;

一个 Executor 可以有多个 core,一个 core 执行一个 task,一个 core 相当于 Executor 进程里的一个线程;

task 的并发度 = Executor 数 x core 数 = 总 core 数;

对应到 yarn 模式的 spark-submit 参数

--num-executors

--executor-cores

--total-executor-cores  【这个参数官方解释只能用于 Spark standalone and Mesos only 模式,不过我用在 yarn 模式没报错】

试想如果有 100 个任务,20 个 Executor,每个 Executor 5 个 core,那么资源利用率极高;

然而加入只有 10 个任务,还是 20 个 Executor,每个 Executor 5 个 core,那么资源有很大浪费,这是 spark 调优的一个方向

参考资料:

https://blog.csdn.net/u012965373/article/details/80847543

https://blog.csdn.net/abc_321a/article/details/82020974

spark内核篇-task数与并行度的更多相关文章

  1. spark内核篇-任务调度机制

    在生产环境中,spark 部署方式一般都是 yarn-cluster 模式,本文针对该模式进行讲解,当然大体思路也适用于其他模式 基础概念 一个 spark 应用包含 job.stage.task 三 ...

  2. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  3. 【大数据】Spark内核解析

    1. Spark 内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spa ...

  4. 【Spark 内核】 Spark 内核解析-上

    Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spark内核原理,能够帮助我们更 ...

  5. Spark内核解析

    Spark内核概述 Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spark内核 ...

  6. Spark 核心篇-SparkContext

    本章内容: 1.功能描述 本篇文章就要根据源码分析SparkContext所做的一些事情,用过Spark的开发者都知道SparkContext是编写Spark程序用到的第一个类,足以说明SparkCo ...

  7. Spark 核心篇-SparkEnv

    本章内容: 1.功能概述 SparkEnv是Spark的执行环境对象,其中包括与众多Executor执行相关的对象.Spark 对任务的计算都依托于 Executor 的能力,所有的 Executor ...

  8. Spark内核| 调度策略| SparkShuffle| 内存管理| 内存空间分配| 核心组件

    1. 调度策略 TaskScheduler会先把DAGScheduler给过来的TaskSet封装成TaskSetManager扔到任务队列里,然后再从任务队列里按照一定的规则把它们取出来在Sched ...

  9. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

随机推荐

  1. Web安全(白帽子讲)之第一章

    安全问题的本质是信任的问题,并是一个持续的过程. 安全三要素 Confidentiality:机密性-----要求保护数据内容不能泄密 Integrity:完整性-----要求保护数据内容的完整,没有 ...

  2. Educational Codeforces Round 53 E. Segment Sum(数位DP)

    Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...

  3. HDU 4612 Warm up —— (缩点 + 求树的直径)

    题意:一个无向图,问建立一条新边以后桥的最小数量. 分析:缩点以后,找出新图的树的直径,将这两点连接即可. 但是题目有个note:两点之间可能有重边!而用普通的vector保存边的话,用v!=fa的话 ...

  4. CSS高级学习-1

    优先级 权值 标签权值为1,类权值为10,ID权值最高为100. p{color:red;} /*权值为1*/ p span{color:green;} /*权值为1+1=2*/ .warning{c ...

  5. oracle函数mysql替代方案

    =====1.日期相关===//获取当前日期在本周的周一select subdate(now(),date_format(now(),'%w')-1);//获取当前日期在本周的周日 select su ...

  6. 包与类的命名 - service tool util 区别

    包与类的命名和定位时,service tool util 常常搞混淆,在此分析一下它们的定位: 名称 特点与定位 独立性 方法和类的属性 util 通用的.与业务无关的,可以独立出来,可供其他项目使用 ...

  7. 【转载】详解CI、CD相关概念

    在软件的编译发布的过程中,经常能够看到CI.CD这样的词语.其实他们是专业的缩写短语,这里介绍下他们的概念和区别. 敏捷软件开发 敏捷软件开发,英文全称:Agile software developm ...

  8. 黑马vue---16、vue中通过属性绑定为元素设置class类样式

    黑马vue---16.vue中通过属性绑定为元素设置class类样式 一.总结 一句话总结: 这里就是为元素绑定class样式,和后面的style样式区别一下 vue中class样式绑定方式的相对于原 ...

  9. 中间件 | Nginx实现动静分离

    Nginx动静分离基本概述 动静分离,通过中间件将动静分离和静态请求进行分离: 通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同事能减少请求的延时. 通过中间件将动态请求和静态请求分离 ...

  10. linux内核中有哪些子系统(框架)呢?

    注意: 分析用的linux内核版本为5.1.3 1. RTC子系统 2. Remote Processor子系统 3. Remote Processor Message子系统 4. SCSI子系统 5 ...