0


Spark任务中Task数量确定和一些总结

本文示例使用的组件:Spark3.x,Hadoop3.x,Spark on Yarn

一些基本的概念

Application: 一个sparkcontext就代表了一个Application
**Job **:一个Application里可以有多个Job,在代码中的体现就是一次Spark的action算子执行就代表了一个Job
Stage
(1)一个Job可划分为多个Stage,Stage代表Job执行的阶段
(2)有关联的Stage之间是串行执行的,也就是上一个阶段执行完毕才能执行下一个Stage
(3)Stage的划分根据是否有Shuffle(RDD宽依赖,也叫Shuffle依赖)划分的,一个Job的Stage数等于Shuffle数+1

Task:一个Stage可以划分多个Task,一个Stage的Task的总数等于这个Stage中最后一个RDD的分区数量

分区数量:在读取HDFS分布式文件系统时,一般来说Spark RDD的分区数量等于HDFS中文件被切割的块数。(简单理解)

如何计算Task总数?

举个简单的例子如何计算Task总数:
前提:HDFS一个块大小为128M
例子:启动一个Spark的Job读取HDFS目录数据(简单的逻辑只读数据),没有shuffle操作所以只有一个Stage,那么这个Stage会划分多少个Task?
假如要读取的目录为hdfs://tmp/Input目录下一共600G的数据,一共有1024个文件,所以一个文件600M,那么一个文件被切割 600 M/128M 约等于5个block, 那么1024个文件一共就是 5 * 1024 = 5120个块,所以分区数为5120个,那么这个Stage将会被划分5120个Task。

:600 M/128M= 4.6875(因为小数点后面0.6875 > 0.2,则被单独分一个块,假如小数点小于等于0.2,则这部分数据合并为上一块,随着上一个块一起被计算)

Task并行度:并行度代表有多少个Task可以并行执行,一般我们将Spark的并行度调整为:Executor个数 * 单个Executor的CPU个数,还是上面的例子假如有5120个任务,如果我有20个Executor,单个Executor的CPU设置为4核,那么并行度我们可以设置为20 * 4 = 80,那么5120个任务可并行执行的任务数就是80,其余任务排队等待,尽量保证一个CPU处理一个Task。

以上例子仅在Spark Job读的第一个Stage阶段计算有多少个Task,如果其它类型的Job后续有Shuffle操作,那么在Shuffle后的第二个Stage的Task数则和具体的RDD算子逻辑有关系,但task总数还是和shuffle后的分区数一致

=========================================================

如有不对的理解欢迎指正!

标签: spark 大数据 hadoop

本文转载自: https://blog.csdn.net/u013189824/article/details/125888505
版权归原作者 -小末 所有, 如有侵权,请联系我们删除。

“Spark任务中Task数量确定和一些总结”的评论:

还没有评论