本文基于Spark 2.1.0版本

新手首先要明白几个配置:

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

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

本地模式(不会启动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

伪集群模式(x为本机上启动的executor数,y为每个executor使用的core数,

z为每个 executor使用的内存)

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

mesos 细粒度模式

Mesos fine grained mode  spark.default.parallelism = 8

其他模式(这里主要指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,操作时如果没有指定分区数,则默认分区数规则为:

(按照官网的描述,本地file的分片规则,应该按照hdfs的block大小划分,但实测的结果是固定按照32M来分片,可能是bug,不过不影响使用,因为spark能用所有hadoop接口支持的存储系统,所以spark textFile使用hadoop接口访问本地文件时和访问hdfs还是有区别的)

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

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

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

补充:

1,如果使用如下方式,从HBase的数据表转换为RDD,则该RDD的分区数为该Table的region数。

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。

2,如果使用如下方式,通过获取json(或者parquet等等)文件转换为DataFrame,则该DataFrame的分区数和该文件在文件系统中存放的Block数量对应。

Dataset<Row> df = spark.read().json("examples/src/main/resources/people.json");

people.json大小为300M,在HDFS中占用了2个blocks,则该DataFrame df分区数为2。

3,Spark Streaming获取Kafka消息对应的分区数,不在本文讨论。

作者:俺是亮哥
链接:https://www.jianshu.com/p/4b7d07e754fa
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

Spark RDD的默认分区数:(spark 2.1.0)的更多相关文章

  1. Spark RDD概念学习系列之Spark Hash Shuffle内幕彻底解密(二十)

    本博文的主要内容: 1.Hash Shuffle彻底解密 2.Shuffle Pluggable解密 3.Sorted Shuffle解密 4.Shuffle性能优化 一:到底什么是Shuffle? ...

  2. Spark RDD概念学习系列之Spark的数据存储(十二)

    Spark数据存储的核心是弹性分布式数据集(RDD). RDD可以被抽象地理解为一个大的数组(Array),但是这个数组是分布在集群上的. 逻辑上RDD的每个分区叫一个Partition. 在Spar ...

  3. Spark RDD概念学习系列之Spark的算子的分类(十一)

    Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...

  4. Spark RDD概念学习系列之Spark的算子的作用(十四)

    Spark的算子的作用 首先,关于spark算子的分类,详细见 http://www.cnblogs.com/zlslch/p/5723857.html 1.Transformation 变换/转换算 ...

  5. Spark RDD 算子总结

    Spark算子总结 算子分类 Transformation(转换) 转换算子 含义 map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 filter(func) ...

  6. Apache Spark : RDD

    Resilient Distributed Datasets Resilient Distributed Datasets (RDD) is a fundamental data structure ...

  7. spark RDD transformation与action函数整理

    1.创建RDD val lines = sc.parallelize(List("pandas","i like pandas")) 2.加载本地文件到RDD ...

  8. Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)论文 | ApacheCN

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

  9. Apache Spark RDD(Resilient Distributed Datasets)论文

    Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...

随机推荐

  1. python之函数第二篇

    一.名称空间与作用域 名称空间分类: 内置名称空间 import this dir(buil-in) 查看全部内置 全局名称空间 局部名称空间 在函数体内等 查询全局和局部 globals()方法可以 ...

  2. Win server 2012 +IIS8.0下安装SSL证书

    SSL证书的申请: 成功在景安申请证书后,会得到一个有密码的压缩包文件,输入证书密码后解压得到五个文件:for Apache.for IIS.for Ngnix.for Other Server,这个 ...

  3. SuppressLint错误

    解决方法:找到注解包,添加到项目提示重复,去掉后又可以了,很奇怪,不过可以了. 方法2:把eclipse项目关闭重新打开,错误又消失了.

  4. BLEU (Bilingual Evaluation Understudy)

    什么是BLEU? BLEU (Bilingual Evaluation Understudy) is an algorithm for evaluating the quality of text w ...

  5. SOLDI原则之DIP:依赖倒置原则

    本篇介绍软件设计原则之一DIP:依赖倒置原则.很多知识回头来看会有新的理解.看到一句话,一段文字,一个观点有了新的理解,醍醐灌顶的感觉.这种感觉像是一种惊喜.古语说:温故而知新. DIP:依赖倒置原则 ...

  6. 重新认识 Delphi

    一.彩蛋 1.打开 Delphi,选择"Help" –> "About-"菜单,出现 About 对话框. 2.在 About 窗口上按住 Alt 键盘, ...

  7. SSE图像算法优化系列二十九:基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)

    拉普拉斯金字塔融合是多图融合相关算法里最简单和最容易实现的一种,我们在看网络上大部分的文章都是在拿那个苹果和橙子融合在一起,变成一个果橙的效果作为例子说明.在这方面确实融合的比较好.但是本文我们主要讲 ...

  8. [Linux] - CentOS运行DotNet Web程序

    文章说明 在Linux(CentOS)是运行C#的Web应用程序,这里使用及讲解的是Jexus服务器安装及配置.非ASP.net Core 安装步骤 一.下载及安装Mono yum install y ...

  9. 关于4A(统一安全管理平台)系统的理解

    1. 4A系统的需求分析 近年来企业用户的业务系统发展十分迅速,内部的系统数和用户数不断增加,网络规模迅速扩大,在应用扩展的同时,各业务系统的安全管理工作相对滞后,无法满足企业发展的长期要求. 各系统 ...

  10. Android Studio添加原生库并自动构建

    [时间:2017-09] [状态:Open] [关键词:Android,Android Studio,gradle,native,c,c++,cmake,原生开发,ndk-build] 0 引言 最近 ...