spark(二)创建RDD时默认分区数

一、概述

Spark的分区数对于Spark性能调优很重要,如果分区数少,那么并行执行的task就少,比如分区数为1,即使你分配的Executor很多,而实际执行的Executor只有1个,如果数据量很大的话,那么任务执行的就很慢,因此熟悉各种情况下默认的分区数对于Spark调优就很有必要了,特别是执行完算子返回的结果分区数为1的情况,更需要特别注意。

二、默认最小分区数:defaultMinPartitions

一般生产环境指定的分区数都会大于2,而且此参数只是指定最小分区数
sc.defaultMinPartitions=min(sc.defaultParallelism,2)
也就是sc.defaultMinPartitions只有两个值1和2,当sc.defaultParallelism>1时值为2,当sc.defaultParallelism=1时,值为1。
上面的公式是在源码里定义的(均在类SparkContext里):

  /**
   * Default min number of partitions for Hadoop RDDs when not given by user
   * Notice that we use math.min so the "defaultMinPartitions" cannot be higher than 2.
   * The reasons for this are discussed in https://github.com/mesos/spark/pull/718
   */
  def defaultMinPartitions: Int = math.min(defaultParallelism, 2)

三、默认并行度设置:defaultParallelism

  • 在文件spark-defaults.conf中可以设置:spark.default.parallelism=20
  • SparkConf对象设置config(“spark.default.parallelism”, 20)
  • 提交命令设置:spark-submit --conf spark.default.parallelism=20

默认并行度优先级与Flink类似也是,任务代码>提交命令>配置文件。如果不设置默认并行度,shell和local模式下默认为cpu核心数,local[n]默认为n,local[*]为核心数

yarn模式下为分配的所有的Executor的cpu核数的总和或者2,两者取最大值,yarn模式时使用的cpu核数为虚拟的cpu核数,和实际cpu的核数有偏差

  • spark-submit --conf spark.default.parallelism=2 --num-executors $1 --executor-cores 1 --executor-memory 640M --master yarn --class com.heroking.spark.WordCount spark-word-count.jar

四、textFile读取hdfs文件默认分区数

这个地方看有好多人说是默认block数有多少就有多少个分区,其实不太对(或者可能以前老版本的是这样的,新版本的不是这样的)我也没有去深究老版本。

  • 1.如果textFile指定分区数量为0或者1的话,defaultMinPartitions值为1,则有多少个文件,就会有多少个分区。

  • 2.如果不指定默认分区数量,则默认分区数量为2,则会根据所有文件字节大小totalSize除以分区数量partitons的值goalSize,然后比较goalSize和hdfs指定分块大小(这里是32M)作比较,以较小的最为goalSize作为切分大小,对每个文件进行切分,若文件大于大于goalSize,则会生成该文件大小/goalSize + 1个分区。

  • 3.如果指定分区数量大于等于2,则默认分区数量为指定值,生成分区数量规则同2中的规则。

  • 读取hdfs上的其它文件和spark sql读取的df默认分区数基本和上述规则一致
    sc.parallelize()创建RDD
    默认分区数等于sc.defaultParallelism,指定参数时分区数值等于参数值。

五、分区数为1的情况

上面已经讲过几个分区数为1(当默认的并行度大于1时)的情况:
1、spark.read.csv()读取本地文件
2、读取关系型数据库表
上面是从外部数据源加载进来就为1的情况,还有就是对df或rdd进行转换操作之后的分区数为1的情况:
1、df.limit(n)

六、合理的设置分区数

根据自己集群的情况和数据大小等合理设置分区的数目,对于Spark性能调优很有必要,根据前面讲的可知,可通过配置spark.default.parallelism、传参设置分区数,遇到那些分区数为1的特殊算子可以利用repartition()进行重新分区即可。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值