spark 为什么总是起200个task

默认参数, 如果你输入的数据大于200个partition或者在数据数据的时候加入partition参数就可以改变了

park中有partition的概念,每个partition都会对应一个task,task越多,在处理大规模数据的时候,就会越有效率。不过task并不是越多越好,如果平时测试,或者数据量没有那么大,则没有必要task数量太多。

partition分区概念

分区概念spark的分区是RDD里的一个概念,RDD为分布式弹性工作集,因为数据量很大,所以RDD分布在各个节点分区里,我们操作RDD,实际上就是操作分区的数据

对应关系

spark parition和HDFS block的初始数量关系基本认为一对一
spark partition和kafka parition的初始数量关系也是一对一
没有shuffle过程,partition是不变的 ,经过shuffle,可以通过算子改变或者通过colease()和repaitition()改变

input split和block的关系

block是hdfs的概念 inputsplit是mr或者spark的概念
默认是一对一

partition的数目

对于数据读入阶段,例如sc.textFile,输入文件被划分为多少InputSplit就会需要多少初始Task。
在Map阶段partition数目保持不变。
在Reduce阶段,RDD的聚合会触发shuffle操作,聚合后的RDD的partition数目跟具体操作有关,例如repartition操作会聚合成指定分区数,还有一些算子是可配置的

我的第一个query程序,有200个task,我改成了50个,节约了1s左右。

全局修改

参数可以通过spark_home/conf/spark-default.conf配置文件设置:

spark.sql.shuffle.partitions 50
spark.default.parallelism 10

上边两个参数,第一个是针对spark sql的task数量,我的程序逻辑是将rdd首先转换成dataframe,然后进行query,所以对应第一个参数。而如果程序是非sql则第二个参数生效。

SparkContext中默认有defaultMinPartitions指定最小的分区数;

def defaultMinPartitions: Int = math.min(defaultParallelism, 2)

SparkContext中生成RDD的接口中往往指定的是minPartitions最小分区数目。

task级别修改

.set("spark.sql.shuffle.partitions","30")
.set("spark.default.parallelism","30");

原文:https://blog.csdn.net/mask1188/article/details/52013828

你可能感兴趣的:(大数据-spark)