Spark分区数详解

spark.default.parallelism:(默认的并发数)= 2

当配置文件spark-default.conf中没有显示的配置,则按照如下规则取值:

1、本地模式(不会启动executor,由SparkSubmit进程生成指定数量的线程数来并发):

spark-shell       spark.default.parallelism = 1

spark-shell --master local[N] spark.default.parallelism = N (使用N个核)

spark-shell --master local       spark.default.parallelism = 1

2、伪集群模式(x为本机上启动的executor数,y为每个executor使用的core数,z为每个 executor使用的内存)

spark-shell --master local-cluster[x,y,z] spark.default.parallelism = x * y

3、其他模式(这里主要指yarn模式,当然standalone也是如此)

Others: total number of cores on all executor nodes or 2, whichever is larger

spark.default.parallelism =  max(所有executor使用的core总数, 2)

经过上面的规则,就能确定了spark.default.parallelism的默认值(前提是配置文件spark-default.conf中没有显示的配置,如果配置了,则spark.default.parallelism = 配置的值)

还有一个配置比较重要,spark.files.maxPartitionBytes = 128 M(默认)
The maximum number of bytes to pack into a single partition when reading files.
代表着rdd的一个分区能存放数据的最大字节数,如果一个400m的文件,只分了两个区,则在action时会发生错误。

当一个spark应用程序执行时,生成spark.context,同时会生成两个参数,由上面得到的spark.default.parallelism推导出这两个参数的值

sc.defaultParallelism = spark.default.parallelism

sc.defaultMinPartitions = min(spark.default.parallelism,2)

当sc.defaultParallelism和sc.defaultMinPartitions最终确认后,就可以推算rdd的分区数了。

产生rdd的几种方式:

1、通过scala 集合方式parallelize生成rdd

  如, val rdd = sc.parallelize(1 to 10)

 这种方式下,如果在parallelize操作时没有指定分区数,则

 rdd的分区数 = sc.defaultParallelism

2、通过textFile方式生成的rdd

 如, val rdd = sc.textFile(“path/file”)

 有两种情况:

 a、从本地文件file:///生成的rdd,操作时如果没有指定分区数,则默认分区数规则为:

rdd的分区数 = max(本地file的分片数, sc.defaultMinPartitions)

  b、从hdfs分布式文件系统hdfs://生成的rdd,操作时如果没有指定分区数,则默认分区数规则为:

rdd的分区数 = max(hdfs文件的block数目, sc.defaultMinPartitions)

3、从HBase的数据表转换为RDD,则该RDD的分区数为该Table的region数。

[java] 
String tableName ="pic_test2";  
conf.set(TableInputFormat.INPUT_TABLE,tableName);  
conf.set(TableInputFormat.SCAN,convertScanToString(scan));  
JavaPairRDD hBaseRDD = sc.newAPIHadoopRDD(conf,TableInputFormat.class,ImmutableBytesWritable.class,Result.class);  
Hbase Table:pic_test2的region为10,则hBaseRDD的分区数也为10。  

4、通过获取json(或者parquet等等)文件转换为DataFrame,则该DataFrame的分区数和该文件在文件系统中存放的Block数量对应。

[java] 
Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");  
people.json大小为300M,在HDFS中占用了2个blocks,则该DataFrame df分区数为2。 

5、Spark Streaming获取Kafka消息对应的分区数
a、基于Receiver接收数据

在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,

仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。

 b、基于direct直连方式读取kafka数据

Spark会创建跟Kafka partition一样多的RDD partition,并且会并行从Kafka中读取数据。

所以在Kafka partition和RDD partition之间,有一个一对一的映射关系。

原文链接:https://blog.csdn.net/jiangsanfeng1111/article/details/78191891

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值