partition是spark rdd计算的最小单元。为什么是最小单元?先从分布式说起,分布式计算的特点就是批处理,将大量的数据分成若干批次,使得利用廉价机器搭建的集群也可以完成海量数据的计算。大量的数据分散在集群中的若干节点上,每个节点上的那部分数据,在执行计算的时候,又可以切分成若干份,每一份就是一个批次,也就是一个partition。
spark计算的性能与partition的数量有很大的关系。每个task处理一个partition。如果partition的数量小于集群可用的CPU核数,就不能充分利用并行计算的性能,还可能引发数据倾斜的问题。但是partition的数量远大于集群可用CPU核数的时候,又可能导致资源分配的时间超过任务实际执行的时间。那么partition的数量又是由什么决定的呢?
备注: 这里提到的相关API及代码都是基于PySpark
一、数据源
rdd如果是从某些数据源创建的,则partition的数量与这些数据源有直接关系。下文的sc
指SparkContext实例, spark
指的是SparkSession实例。
从内存中创建
sc.parallelize(...)
这种方式创建的partition数量等于SparkContext的defaultParallelism的值,或者等于传给parallelize的numSlices参数。
读取HDFS文件创建
包括使用sc.textFile(...)
或spark.sql(...)
查询Hive表得到的结果的part