本文主要说一下Spark中Task相关概念、RDD计算时Task的数量、Spark Streaming计算时Task的数量。

Task作为Spark作业执行的最小单位,Task的数量及运行快慢间接决定了作业运行的快慢。

开始

先说明一下Spark作业的几个核心概念

Job(作业):Spark根据行动操作触发提交作业,以行动操作将我们的代码切分为多个Job。

Stage(调度阶段):每个Job中,又会根据宽依赖将Job划分为多个Stage(包括ShuffleMapStage和ResultStage)。

Task(任务):真正执行计算的部分。Stage相当于TaskSet,每个Stage内部包含了多个Task,将各个Task下发到各个Executor执行计算。

每个Task的处理逻辑完全一样,不同的是对应处理的数据。即:移动计算而不是移动数据。

Partition(分区):这个是针对RDD而言的,RDD内部维护了分区列表,表示数据在集群中存放的不同位置。

Job、Stage、Task的对应关系如下:

Task是真正干活的,所以说是它间接决定了Spark程序的快慢也不过分。

再看看Spark任务提交时的几个相关配置

num-executors:配置执行任务的Executor的数量。

executor-cores:每个Executor的核的数量。此核非彼核,它不是机器的CPU核,可以理解为Executor的一个线程。

每个核同时只可以执行一个Task。

也就是说一个Spark应用同时执行的任务数 = 用于执行任务的Executor数 * 每个Executor的核数

spark.executor.memory:每个Executor的内存大小。

spark.default.parallelism:RDD的默认分区数。

在我们没有指定这个参数的前提下,如果是shuffle操作,这个值默认是父RDD中分区数较大的那个值;如果是普通操作,这个值的默认大小取决于集群管理器(YARN, Local这些)。

以YARN为例,如果我们没有指定,它的大小就是所有用于执行任务的Executor核的总数

spark.sql.shuffle.partitions:这个配置是针对于Spark SQL在shuffle时的默认分区数。默认值是200。只对Spark SQL起作用。

RDD计算时Task的数量

在基于RDD计算时,Task的数量 = RDD的分区数

所以调整RDD分区的数量就可以变相的调整Task的数量。

所以当RDD计算跑的很慢时,可以通过适当的调整RDD分区数来实现提速。

看看Spark.parallelize生成RDD时的源码实现:

def parallelize[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
assertNotStopped()
new ParallelCollectionRDD[T](this, seq, numSlices, Map[Int, Seq[String]]())
} // 这里的taskScheduler.defaultParallelism就是
// 取的配值中spark.default.parallelism的值。
def defaultParallelism: Int = {
assertNotStopped()
taskScheduler.defaultParallelism
}

可以发现通过Spark.parallelize创建的RDD分区,如果我们不指定分区数,那么分区数就是由配置的spark.default.parallelism来决定。

Spark读Hive、HDFS时的Task数量

这块之后补上来。。。

Spark Streaming流处理时的Task数量

Spark Streaming作为Spark中用于流处理的一员,它的原理就是运行一个接收器接收数据,然后将接收的数据按块进行存储,之后划分Job,执行Task处理数据。

ok,Spark Streaming最后也会转换成Task进行数据的处理,也就是Task运行速度也会影响它处理数据的速度。

Spark Streaming中Task的数量是由用来存储接收到数据的Block数来决定的。

那么只要控制Block的数量就可以控制Task的数量。

如下代码所示,Block是由一个定时器定时生成的。

// 块生成间隔时间
private val blockIntervalMs = conf.getTimeAsMs("spark.streaming.blockInterval", "200ms")
// 一个定时器,按块生成间隔时间定时根据接收到的数据生成块。
private val blockIntervalTimer = new RecurringTimer(clock, blockIntervalMs, updateCurrentBuffer, "BlockGenerator")

所以Block的数量 = 批处理间隔时间 / 块生成间隔时间

块生成间隔时间是由配置spark.streaming.blockInterval决定的,默认是200ms,最小是50ms。

所以当Spark Streaming的Task数量成为性能的瓶颈时,可以通过调整参数来调整Task的数量。

总结

1、Task是Spark的最小执行单位,Executor每个核同时只能执行一个Task。

2、RDD计算时,Task数量与分区数对应;Spark Streaming中,Task数量由Block数决定。

3、根据分配的资源以及作业的运行情况,适当调整Task数量。

4、移动计算而不是移动数据。

end. 个人理解,如果偏差欢迎指正。




个人公众号:码农峰,定时推送行业资讯,持续发布原创技术文章,欢迎大家关注。

Spark中Task数量的分析的更多相关文章

  1. Spark中Task,Partition,RDD、节点数、Executor数、core数目(线程池)、mem数

    Spark中Task,Partition,RDD.节点数.Executor数.core数目的关系和Application,Driver,Job,Task,Stage理解 from:https://bl ...

  2. 【原】 Spark中Task的提交源码解读

    版权声明:本文为原创文章,未经允许不得转载. 复习内容: Spark中Stage的提交 http://www.cnblogs.com/yourarebest/p/5356769.html Spark中 ...

  3. 【原】Spark中Client源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Client源码分析(一)http://www.cnblogs.com/yourarebest/p/5313006.html DriverClient中的 ...

  4. 【原】Spark中Master源码分析(二)

    继续上一篇的内容.上一篇的内容为: Spark中Master源码分析(一) http://www.cnblogs.com/yourarebest/p/5312965.html 4.receive方法, ...

  5. 【原】 Spark中Worker源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Worker源码分析(一)http://www.cnblogs.com/yourarebest/p/5300202.html 4.receive方法, r ...

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

    梳理一下Spark中关于并发度涉及的几个概念File,Block,Split,Task,Partition,RDD以及节点数.Executor数.core数目的关系. 输入可能以多个文件的形式存储在H ...

  7. 【原】Spark中Master源码分析(一)

    Master作为集群的Manager,对于集群的健壮运行发挥着十分重要的作用.下面,我们一起了解一下Master是听从Client(Leader)的号召,如何管理好Worker的吧. 1.家当(静态属 ...

  8. Spark中决策树源码分析

    1.Example 使用Spark MLlib中决策树分类器API,训练出一个决策树模型,使用Python开发. """ Decision Tree Classifica ...

  9. 【原】Spark中Client源码分析(一)

    在Spark Standalone中我们所谓的Client,它的任务其实是由AppClient和DriverClient共同完成的.AppClient是一个允许app(Client)和Spark集群通 ...

随机推荐

  1. TPO5-1 Minerals and plants

    Only recently have investigators considered using these plants to clean up soil and waste sites that ...

  2. Linux平台下_tomcat的安装与优化

    一.Tomcat介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选.对于一 ...

  3. space sniffer

    space sniffer 一款检测本地磁盘文件占用情况的工具,高效,快速.

  4. O - Snacks(DFS序)

    百度科技园内有nn个零食机,零食机之间通过n−1n−1条路相互连通.每个零食机都有一个值vv,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充,零食机的价值vv会时常发生变化.小度熊只能从编号 ...

  5. day22- hashlib模块-摘要算法(哈希算法)

    # python的hashlib提供了常见的摘要算法,如md5(md5算法),sha1等等.摘要:digest # 摘要算法又称哈希算法.散列算法. # 它通过一个函数,把任意长度的数据(明文)转换为 ...

  6. 扩增|feather evolution

    Wool vs feather 扩增方法:1.Gene Duplication2.Genome Duplication3.Cluster 哺乳动物毛发和鸟类的羽毛,都来自于角蛋白. 羽毛进化图 DNA ...

  7. nginx相关地址

    http://www.nginx.cn/doc/      中文文档 http://nginx.org/en/docs/      英文文档 https://pan.baidu.com/s/1qWAZ ...

  8. Java && Python 算法面试常用类以及方法总结

    数据结构 逻辑结构上: 包括集合,线性结构,非线性结构. 存储结构: 顺序存储,链式存储,索引存储,散列存储. Java 常见数据结构 大专栏  Java && Python 算法面试 ...

  9. EmguCV C# 安装入门教程

    EmguCv3的安装. EmguCv3下载网址 http://sourceforge.net/projects/emgucv/files/emgucv/3.0.0/ 推荐下载第一个: 点击direct ...

  10. spring boot 配置文件properties和YAML详解

    spring boot 配置文件properties和YAML详解 properties中配置信息并获取值. 1:在application.properties配置文件中添加: 根据提示创建直接创建. ...