粗浅理解,不完全准确:
申请资源、计算节点数、虚拟cpu核数、并行度、并发度关系,分区、task数量: * 一个nodemanager 上可能有多个executor * spark-shell --num-executors 3 \ * --driver-memory 5g --executor-cores 2 \ //每个executor的虚拟核数 * --executor-memory 2g * 这种情况下最大并发度是是6=计算节点数*虚拟CPU核数 * 如果实际资源满足,就是并行度,否则并发度 * 一般task设置为最大并发度的2-3倍,避免资源浪费 * 创建RDD的时候,填入分区数量;一般的转换算子并不会改变分区数量; * coalesce根据数据量缩减分区,用于大数据集过滤后,提高小数据集的执行效率 * 当 spark 程序中,存在过多的小任务的时候,可以通过 coalesce 方法,收缩合并分区,减少分区的个数,减小任务调度成本 * repartition一般用来扩大分区 * partitionBy将数据按照指定Partitioner 重新进行分区。Spark 默认的分区器是HashPartitioner
RDD 任务划分
RDD 任务切分中间分为:Application、Job、Stage 和 Task
-
- Application:初始化一个 SparkContext 即生成一个Application;
- Job:一个Action 算子就会生成一个Job;
- Stage:Stage 等于宽依赖(ShuffleDependency)的个数加 1;
- Task:一个 Stage 阶段中,最后一个RDD 的分区个数就是Task 的个数。注意:Application->Job->Stage->Task 每一层都是 1 对 n 的关系。