简述Spark的宽窄依赖,以及Spark如何划分stage,每个stage又根据什么决定task个数?
-
宽依赖:父RDD的分区数据会分发到子RDD的多个分区
-
窄依赖:父RDD的分区数据会分发到子RDD的一个分区
-
spark的DAGScheduler根据宽窄依赖将DAG划分为多个stage,spark以stage作为task的模板,生成一个或多个task,并将其调度到TaskExecutor执行。
-
task的数量本质上是由RDD的分区数决定的,一个分区对应一个task。
-
分区数的确定和改动有以下几种情况:
- 由带partitioner的数据源确定,比如数据来自hdfs,则根据hdfs的数据分片方式确定分区数;如果数据来自kafka,则有topic的分区数确定
- 不带partitioner的数据源,其分区数由参数"spark.default.parallelism"确定
- 通常map阶段的task数由数据源确定,如果有shffle,shuffle的reduce的并行度由"spark.sql.shuffle.partitions"确定,默认是200
- 也可以通过代码对分区数进行干预,一是读取数据时可以设定最小分区数,二是可以通过repartition进行数据重分区