> 文章列表 > spark并行度(parallelism)和分区(partition)未生效的问题

spark并行度(parallelism)和分区(partition)未生效的问题

spark并行度(parallelism)和分区(partition)未生效的问题

spark的并行度对spark的性能是又很大的影响的,spark任务能快速计算主要就是因为内存计算和并行计算。
对于并行计算,我们就要涉及到并行度的问题,那并行度跟什么有关系呢?

  1. 源数据
  • hdfs文件
    读取hdfs文件的时候是跟block块相关的,有几个 block就有几个分区去执行任务。
  • 数据库
    数据库是可以设置分区读取数据的(见文章:spark分区读取数据库)
    在此设置几个分区读取数据库,就会产生几个分区执行后续的任务。
  1. spark.default.parallelism
    设置rdd默认的并行度,这个参数要是不设置的话默认是200。
    正常设置的大小为spark任务申请的总core的2到3倍,即num-excutor*excuor_cores*(2 or 3)
    但是这个参数不会在rdd计算的时候就会生效,比如rdd.map(x => x.mkString(,))
    只有遇到shuffle的时候才会生效,比如rdd.reduceByKey(_+_)
  2. spark.sql.shuffle.partitions,这个时候就不会生效。
    设置sparksql默认的并行度,可以一定程度解决数据倾斜的问题。
    但是跟parallelism类似,也是要遇到shuffle的时候才会生效,比如join、group…
    如果只是遇到未shuffl的sql语句,是不会生效的。