1、spark的shuffle过程
- 父RDD中同一分区中的数据按照算子要求重新进入子RDD的不同分区中;
- 中间结果写入磁盘;
- 由子RDD拉取数据,而不是由父RDD推送;
- 默认情况下,shuffle不会改变分区数量。
2、spark的宽窄依赖
- 窄依赖:一个父RDD的分区被子RDD的一个分区使用。1个子RDD的分区对应于1个父RDD的分区,比如map,filter,union等算子。
- 宽依赖:一个父RDD的分区被子RDD的多个分区使用。宽依赖一般是对RDD进行groupByKey,reduceByKey,sortByKey等操作,就是对partition中的数据进行重分区(shuffle)。
3、spark中reduceByKey与groupByKey的区别
- reduceByKey:按照key进行聚合,在shuffle之前有combine(预聚合)操作,返回结果是RDD[k,v];
- groupByKey:按照key进行分组,直接进行shuffle;在实际开发过程中,reduceByKey比groupByKey性能好,更建议使用。
4、Spark提交作业的参数
- executor-cores —— 每个executor使用的内核数,默认为1,官方建议2-5个;
- num-executors —— 启动executors的数量,默认为2;
- executor-memory —— executor内存大小,默认1G;
- driver-cores —— driver使用内核数,默认为1;
- driver-memory —— driver内存大小,默认512M。