本文基于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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/harvey888/p/10182717.html

Spark RDD的默认分区数:(spark 2.1.0)相关推荐

  1. Spark学习之Spark RDD算子

    个人主页zicesun.com 这里,从源码的角度总结一下Spark RDD算子的用法. 单值型Transformation算子 map /*** Return a new RDD by applyi ...

  2. Spark基础学习笔记22:Spark RDD案例分析

    文章目录 零.本讲学习目标 一.案例分析:Spark RDD实现单词计数 (一)案例概述 (二)实现步骤 1.新建Maven管理的Spark项目 2.添加Scala和Spark依赖 3.创建WordC ...

  3. 使用Alluxio高效存储Spark RDD

    更多精彩内容参见云栖社区大数据频道https://yq.aliyun.com/big-data:此外,通过Maxcompute及其配套产品,低廉的大数据分析仅需几步,详情访问https://www.a ...

  4. spark学习13(spark RDD)

    RDD及其特点 1)RDD(Resillient Distributed Dataset)弹性分布式数据集,是spark提供的核心抽象.它代表一个不可变.可分区.里面的元素可并行计算的集合 2)RDD ...

  5. spark RDD官网RDD编程指南

    http://spark.apache.org/docs/latest/rdd-programming-guide.html#using-the-shell Overview(概述) 在较高的层次上, ...

  6. Spark rdd 介绍,和案例介绍

    1.2.创建RDD 1)由一个已经存在的Scala集合创建. val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8)) 2)由外部存储系统的数据集创建,包括本 ...

  7. 第二章 Spark RDD以及编程接口

    第二章 Spark RDD以及编程接口 目录 Spark程序"Hello World" Spark RDD 创建操作 转换操作 控制操作 行动操作 注:学习<Spark大数据 ...

  8. spark RDD创建方式:parallelize,makeRDD,textFile

    parallelize 调用SparkContext 的 parallelize(),将一个存在的集合,变成一个RDD,这种方式试用于学习spark和做一些spark的测试 scala版本 ? 1 d ...

  9. [Spark]-RDD详解之变量操作

    RDD的操作 1.1 概述    RDD整体包含两大类操作 transformation 从现有中创建一个新的数据集 action 在对数据集做一定程度的计算后将结果返回 对于所有的transform ...

最新文章

  1. linux下安装QQ
  2. Windows进程间通信的各种方法
  3. 人生百味,浓缩到最后就是一个淡字
  4. angular 图片引入_推荐一个 angular 图像加载插件
  5. WebDriver自动化测试框架详解
  6. 工厂模式-CaffeNet训练
  7. 疑似华为Mate X 5G版入网 将支持两种组网方式
  8. MAC安装apache tomcat配置方法图文教程
  9. 在springcacheinvokecontext中没找到field_CNN中的感受野
  10. 用Everspin MR2xH40xDF SPI-MRAM替换赛普拉斯CY15B104QN SPI-FRAM
  11. 推荐一款2.5v 基准 电压源 芯片
  12. 做善良公社项目的经历和感受——善良公社
  13. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)
  14. TSN之linuxptp交叉编译
  15. ManjaroArch 自动挂载NTFS分区
  16. 运动控制器多工位位置比较输出在转盘式视觉筛选设备中的应用
  17. Mock.js 使用
  18. axf文件、hex文件、bin文件区别
  19. bilinear interpolation是什么
  20. 蟋蟀蝙蝠的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告

热门文章

  1. redis-sentinel主从复制高可用
  2. 【笔试题】简单的两道笔试题(1、打印杨辉三角;2、三个数排序)
  3. PHP PDO 预处理语句与存储过程
  4. Javascript 笔记与总结(1-4)this
  5. 利用JS调用aspx页面(转载)
  6. Android编译笔记一
  7. 2.1 CPU 上下文切换(上)
  8. 1720: 交换瓶子
  9. 技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新
  10. 万物智联时代的终端智能「管家」重磅升级:混合云IoT一体机