每一个 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. 手把手教你在Linux系统下安装MySQL

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1. 下载并安装MySQL官方的 Yum R ...

  2. JS的数据储存格式

    javaScript有三种数据存储方式,分别是:sessionStoragelocalStoragecookier 相同点:都保存在浏览器端,同源的 不同点:①传递方式不同cookie数据始终在同源的 ...

  3. session cookie傻傻分不清

    做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说会简单很多. 下面这篇文章希望能够帮助大家分 ...

  4. No suitable constructor was found in NUnit Parameterised tests

    No suitable constructor was found in NUnit Parameterised tests Fairly obvious, but can also happen i ...

  5. [MyBatis]五分钟向MySql数据库插入一千万条数据 批量插入 用时5分左右

    本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 我的数据库环境是mys ...

  6. Spring事务注解分析

    1.使用spring事务注解 2.手写事务注解 1).sql执行器 2).事务注解定义 3).AOP实现事务具体实现(同一个线程中使用同一个连接) 4).应用使用注解前 5).应用使用注解后

  7. jeecg中的datagrid显示一条记录为橙色表示完结

    效果如图: 1.操作小结后面的已完结js $(document).ready(function(){ $('.datagrid-toolbar').children("span") ...

  8. Linux(CentOS / RHEL 7) 防火墙

    CentOS / RHEL 7 防火墙 Table of Contents 1. 简述 2. 常用基本操作 2.1. 查看防火墙状态 2.2. 开启防火墙 2.3. 关闭防火墙 2.4. 开机自动启动 ...

  9. ScrollView-基本设置

    一: 掌握两点: 1. ScrollView必须有一个确定的高度才能正常工作,因为它实际上所做的就是将一系列不确定高度的子组件装进一个确定高度的容器(通过滚动操作).要给一个ScrollView确定一 ...

  10. Centos7 FastDFS 搭建

    安装libfastcommon 首先第一步是安装libfastcommon,我这里将libfastcommon上传到的/opt目录下,直接解压: yum -y install gcc-c++ yum ...