spark中各种数量的确定和查询(持续更新中)

 

数量 决定/设置方式 函数查询方式 备注
partition数量
sqlContext.setConf("spark.sql.shuffle.partitions", "300")

rdd1.getNumPartitions

或者

rdd1.partitions.size

 

 configures the number of partitions that are used when shuffling data for joins or aggregations.
partition数量
sqlContext.setConf("spark.default.parallelism", "300")

rdd1.getNumPartitions

或者

rdd1.partitions.size

default number of partitions in RDDs returned by transformations like joinreduceByKey, and parallelize
task数量 number-of-tasks = number-of-partitions或者"one task per stage per partition”[1] 不存在查命令/函数行询方式  
executor数量 --num-executors 不需要查询,直接命令行或者配置文件中设定即可  
job数量 每次spark-submit/spark-shell提交任务就是一个job 不存在查命令/函数行询方式  
stage数量 根据DAG依赖图来确定(其实还是根据代码来确定的) 不存在查命令/函数行询方式  

 

根据[1]可知,task数量就是partition的数量。

stage只是一个时间单位,

stage0执行完了执行stage1,然后执行stage2

 

注意不要搞混“并行度”(parallelism)和"并发数"(concurrency)两个概念

 

[3]spark.default.parallelism   默认是没有值的,如果设置了值比如说10,是在shuffle的过程才会起作用(val rdd2 = rdd1.reduceByKey(_+_) //rdd2的分区数就是10,rdd1的分区数不受这个参数的影响)

new SparkConf().set(“spark.default.parallelism”,”“500)

spark.sql.shuffle.partitions //spark sql中shuffle过程中partitions的数量

 

[4]

如果是读取hdfs的文件,一般来说,partition的数量等于文件的数量。

如果单个文件的大小大于hdfs的分块大小,partition的数量就等于 “文件大小/分块大小”。

同时,也可以使用rdd的repartition方法重新划分partition。

另外,在使用聚合函数比如 reducebykey, groupbykey,可以通过指定partitioner来指定partition的数量。

例如:

 val rdd2 = rdd1.reduceByKey(_+_,10)

这里的10可以覆盖前面的spark.default.parallelism

 

val rdd3 = rdd1.join(rdd2) rdd3里面partiiton的数量是由父RDD(这里指的是rdd1和rdd2)中最多的partition数量来决定,因此使用join算子的时候,增加父RDD中partition的数量。

 

num-executors * executor-cores的2~3倍即为task(partition)数量,此时可以比较充分地利用集群资源[5]

 

Reference:

[1]http://How are stages split into tasks in Spark?

[2]What is the difference between spark.sql.shuffle.partitions and spark.default.parallelism?

[3]Spark性能调优之合理设置并行度

[4]Spark作业中Partition数目的划分是由什么决定的?

[5]spark 体验点滴- executor 数量 和task 并行数

你可能感兴趣的:(Scala与Spark,持续更新中)