其他更多java基础文章:
java基础学习(目录)
这部分能力有限,所以推荐一些大神文章阅读学习:
-
Spark 创建RDD、DataFrame各种情况的默认分区数:这篇通过实例非常全的测试了各种情况下的默认分区数
-
Spark RDD之Partition:这篇通过代码讲解了分区的逻辑、决定partition数量的因素、Partition数量影响及调整。
-
spark中repartition和partitionBy的区别、spark中reparation和coalesce的用法和区别:通过源码讲解repartition,partitionBy,coalesce
总结
我在以我的理解简单的概括下,如有不对,希望大家及时斧正:
- Task和Partition是一一对应的
- 通过
spark.default.parallelism
设置sc.defaultParallelism
的值 sc.defaultMinPartitions=min(sc.defaultParallelism,2)
。也就是sc.defaultMinPartitions
只有两个值1和2,当sc.defaultParallelism>1时值为2,当sc.defaultParallelism=1时,值为1- sc.parallelize(…)的默认Partition值是
sc.defaultParallelism
的值 - sc.textFile(…)如果不传Partition值,绝大多数则为HDFS中Block的数量。原因是
partition = max(hdfs文件的block数目, sc.defaultMinPartitions)
,由于sc.defaultMinPartitions只能是1或2。- 如果hdfs文件block数量大于1时,Partition数目就是block数目。
- 如果hdfs文件block数量等于1时,默认分区数为sc.defaultMinPartitions,只可能是1或2。当用参数指定分区数时,rdd的分区数大于等于参数值,本次测试为等于参数值或参数值+1
本地文件
也会像hdfs一样进行类似于block的划分,固定按32M来分片。分区数 = max(本地文件的block数目, 参数值)- 从
关系型数据库表
读取的df的分区数为1 - 读取
hive表
创建的DataFrame的分区数,block数为hive表对应的hdfs文件的block的数目,当sc.defaultParallelism大于block时,df的分区是等于sc.defaultParallelism,当小于block时,df的分区数介于sc.defaultParallelism和block之间