spark.default.parallelism:(默认的并发数)= 2
当配置文件spark-default.conf中没有显示的配置,则按照如下规则取值:
1、本地模式(不会启动executor,由SparkSubmit进程生成指定数量的线程数来并发):
spark.default.parallelism = 1
spark.default.parallelism = N (使用N个核)
spark.default.parallelism = 1
2、伪集群模式(x为本机上启动的executor数,y为每个executor使用的core数,z为每个 executor使用的内存)
3、其他模式(这里主要指yarn模式,当然standalone也是如此)
经过上面的规则,就能确定了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.defaultMinPartitions = min(spark.default.parallelism,2)
当sc.defaultParallelism和sc.defaultMinPartitions最终确认后,就可以推算rdd的分区数了。
产生rdd的几种方式:
1、通过scala 集合方式parallelize生成rdd
2、通过textFile方式生成的rdd
rdd的分区数 = max(本地file的分片数, sc.defaultMinPartitions)
rdd的分区数 = max(hdfs文件的block数目, sc.defaultMinPartitions)
3、从HBase的数据表转换为RDD,则该RDD的分区数为该Table的region数。
- "pic_test2"
- class,ImmutableBytesWritable.class,Result.class
- 10,则hBaseRDD的分区数也为10
- "examples/src/main/resources/people.json"
- people.json大小为300M,在HDFS中占用了22
在Receiver的方式中,Spark中的partition和kafka中的partition并不是相关的,所以如果我们加大每个topic的partition数量,
仅仅是增加线程来处理由单一Receiver消费的主题。但是这并没有增加Spark在处理数据上的并行度。
Spark会创建跟Kafka partition一样多的RDD partition,并且会并行从Kafka中读取数据。
所以在Kafka partition和RDD partition之间,有一个一对一的映射关系。
原文链接:https://blog.csdn.net/jiangsanfeng1111/article/details/78191891