spark RDD中的并行度、分区器默认策略

spark.default.parallelism和 场景分区数来源读取数据(无shuffle)数据源文件块数或数据源分片数窄依赖算子(map/filter等)继承上游分区数显式分区操作(coalesce等)由算子参数决定宽依赖算子(join/groupBy等)触发shuffle,分区数由控制。 阅读详情

源头RDD

  • 源头RDD有自己的分区计算逻辑,一般没有分区器,并行度是根据分区算法自动计算的,RDD的compute函数中记录了数据如何而来,如何分区的

  • hadoopRDD,根据XxxinputFormat.getInputSplits()来决定,比如默认的TextInputFormat将文件按照0-128M进行切割,剩余部分是否小于128M的1.1倍

  • JdbcRDD,需要指定一个数字类型的字段,而且指定上界,下届,然后指定并行度进行分割

  • 大部分源头RDD都有传入并行度的参数

  • 有些源头rdd按照backend.defaultParallelism()获取默认并行度,比如sc.paralleize("a","b")

  • 本地模式:getInt("spark.default.parallelism", totalCores),根据spark.default.parallelism参数,如果没配置就是机器的总逻辑核数,setMaster(local[*]) *代表全部逻辑核

  • 集群模式:getInt("spark.default.parallelism", math.max(totalCoreCount.get(), 2)),根据spark.default.parallelism参数,如果没配置就是yarn的executor的总逻辑核数,最小也得两个并行度

窄依赖RDD

  • 窄依赖RDD,没有自己的分区器(也可以设置为沿用父rdd的分区器),默认集成它的父RDD的并行度

  • 有个特殊的窄依赖算子,coalesce(2,true),他需要指定并行度

宽依赖 RDD

  • 宽依赖 RDD(ShuffledRDD),这种RDD是通过进行shuffle的算子得到的,shuffle算子必须要一个分区器,要么传,要么走默认分区器

指定并行度

  • shuffle算子指定并行度,groupBy(f(),4) //分区器为:hashpartitioner,并行度为4

  • 有些特殊的shuffle算子,默认分区器不是hashpartitioner。比如sortBy(),他是RangePartitiner,但是sortBy其实用的是sortByKey然后取value 最终.values把分区器搞丢了

指定分区器

  • shuffle算子指定分区器,groupBy(f(),RangePartitioner(4)) //分区器为:RangePartitioner,并行度为4

默认分区器策略

  • 按照 Partitioner.defaultPartitioner( )获取分区器

最大并行度:父RDD中并行度的最大值

默认并行度:spark.default.parallelism值,如果没设置这个参数,则取最大并行度

最大分区器:父RDD中并行度最大的分区器

  • 有最大分区器,而且以下两个条件满足一个即可,此时沿用最大分区器

  • 父 RDD 中的最大并行度/最大分区器所在RDD的并行度<10

或

  • 默认并行度小于等于最大分区器所在rdd的并行度

  • 没有最大分区器,默认以hashPatitioner作为分区器,并行度为默认并行度

例1

如果:rdd1:并行度500,分区器NONE,rdd2: 并行度100,分区器HashPartitioner

var rdd3 = rdd1.join(rdd2)

问:此时rdd3的分区器和并行度有多大?

  • 最大并行度:父RDD中并行度的最大值=>500

  • 默认并行度:取spark.default.parallelism值,如果没有则最大并行度=>500

  • 最大分区器:父RDD中并行度最大的分区器=>HashPartitioner

  • 判断能否沿用父RDD最大分区器

  • 存在最大分区器(满足)

  • 以下两个条件满足一个

  • 最大并行度(500)/最大分区器所在RDD的并行度(100)<10 (满足)

或

  • 默认并行度(500)小于等于 最大分区器所在rdd的并行度(100)(不满足)

因此可以沿用父RDD最大分区器,所以rdd3的分区器:Hashpartitioner,并行度100

例2

如果:rdd1:并行度2000,分区器None,rdd2: 并行度100,分区器HashPartitioner

var rdd3 = rdd1.join(rdd2)

问:此时rdd3的分区器和并行度有多大?

  • 最大并行度:父RDD中并行度的最大值=>2000

  • 默认并行度:取spark.default.parallelism值,如果没有则最大并行度=>2000

  • 最大分区器:父RDD中并行度最大的分区器=>HashPartitioner

  • 判断能否沿用父RDD最大分区器

  • 存在最大分区器(满足)

  • 以下两个条件满足一个

  • 最大并行度(2000)/最大分区器所在RDD的并行度(100)<10 (不满足)

或

  • 默认并行度(2000)小于等于 最大分区器所在rdd的并行度(2000)(不满足)

因此不可以沿用父RDD最大分区器,所以rdd3的分区器:采用默认的分区器、采用默认并行度HashPartitioner(2000)

例3

如果:rdd1:并行度2000,分区器None,rdd2: 并行度100,分区器HashPartitioner ,conf.set("spark.default.parallelism",100)

var rdd3 = rdd1.join(rdd2)

问:此时rdd3的分区器和并行度有多大?

  • 最大并行度:父RDD中并行度的最大值=>2000

  • 默认并行度:取spark.default.parallelism值,如果没有则最大并行度=>100

  • 最大分区器:父RDD中并行度最大的分区器=>HashPartitioner

  • 判断能否沿用父RDD最大分区器

  • 存在最大分区器(满足)

  • 以下两个条件满足一个

  • 最大并行度(2000)/最大分区器所在RDD的并行度(100)<10 (不满足)

或

  • 默认并行度(100)小于等于 最大分区器所在rdd的并行度(100)(满足)

因此可以沿用父RDD最大分区器,所以rdd3的分区器:Hashpartitioner,并行度100

关于是否Shuffle问题延申1

例1中rdd1.join(rdd2).reduceByKey()

问:此时reduceByKey操作会发生shuffle吗?

答案是不会,虽然reduceByKey产生的Dependency是ShuffleDependency,但是它的分区器和它父RDD的分区器是同一个分区器(沿用父RDD的分区器),所以不会有shuffle产生

关于是否Shuffle问题延申2

例1中rdd1.join(rdd2).repartition(100).reduceByKey()

问:此时reduceByKey操作会发生shuffle吗?

答案是会,按道理来说repartition(100)会产生一个Hashpartitioner(100),reduceByKey(),会沿用repartition产生的rdd的分区器,导致reduceByKey()不会产生shuffle,那为何还会有呢?

这个就是上边说的repartition算子中.values把分区器搞丢了

repartition其实是调用的coalesce(100,true)

new CoalescedRDD(new ShuffledRDD).values

也就是说,一次repartition,产生了3个rdd

  • CoalescedRDD

  • ShuffledRDD

  • MapPartitionsRDD ----.value产生的相当于map取value,这是一个窄依赖,会把RDD[T]的分区器擦除掉,因此再进行reduceByKey的时候看似父节点有分区器,其实被repartition内部的RDD转换隐形擦除了,导致shuffle产生(上述sortBy也有这个问题)

关于是否Shuffle问题延申3

问:rdd1.join(rdd2)什么情况下不发生shuffle?

当rdd1和rdd2以及join产生的新rdd采用相同的分区器,那么就不会产生shuffle

val rdd1:RDD[(String,Int)]rdda.partitionBy(new HashPartitioner(partitions 2))
val rdd2:RDD[(String,Int)]rddb.partitionBy(new HashPartitioner(partitions=2))
rdd1.join(rdd2,new HashPartitioner(partitions 2))

问:如果rdd1.join(rdd2) ,join算子不传入分区器会有shuffle吗?

不会shuffle,因为会沿用父节点的最大分区器。最终结果还是默认产生了一个Hashpartitioner(2)

总结

如果父RDD最大分区器的并行度能够承载其它父RDD的并行度(10倍以内),那就沿用父RDD的最大分区器

如果父RDD没有最大分区器或者承载不了那就new HashPartitioner(defaultParalleize)

通常父RDD只有一个,那就没这么麻烦,父RDD有分区器的直接沿用父RDD的分区器,没有就

new HashPartitioner(defaultParalleize)

但是!!!!!!!!!!

有的看似父RDD有分区器,依然没有被沿用,请注意算子内部的RDD转换导致分区器被隐形擦除了

Spark—关于RDD的并行度和分区(Local环境下测试) Spark—关于RDD的并行度和分区 本文将会跟大家一起简单探讨Spark 中RDD的并行度和分区 文章目录Spark—关于RDD的并行度和分区前言一、并发、并行和并行度二、分区1. 从集合(内存)中创建 RDD时的分区规则2.spark 读取文件数据的分区规则总结 前言 默认情况下,Spark 可以将一个作业切分多个任务后,发送给 Executor 节点并行计算,而能够并行计算的任务数量我们称之为并行度。这个数量可以在构建 RDD 时指定。切记,这里的并行执行的任务数量(Executor计算节点执行的 阅读详情

相关推荐

Spark源码分析系列之RDD

面试过程中经常会遇到一个问题:谈谈你对Spark RDD的理解,你该如何回答呢?RDD是弹性数据集,是Spark的基础数据结构,然后呢,没了吗?那我觉得可能面试官觉得你应该处于最低级的水平,本文详细的介绍了RDD,面试过程中你如果按照下面的顺序进行描述RDD,面试官应该会对你刮目相看。 概述 RDD是(Resilient Distributed Dataset)弹性分布式数据集,Spark中数据的基本抽象,表示不可变的,分区的可以并行操作的元素集合。RDD有五大部分组成: 分区集合: partitio.

进击的数据小白 513

关于Spark默认并行度spark.default.parallelism的理解

spark.default.parallelism是指RDD任务的默认并行度,Spark中所谓的并行度是指RDD中的分区数,即RDD中的Task数。 当初始RDD没有设置分区数(numPartitions或numSlice)时,则分区数采用spark.default.parallelism的取值。 Spark作业并行度的设置代码如下: val conf = new SparkConf() .set("spark.default.parallelism", "500") 对于reduceByKey和jo

雷恩Layne 1万+

从spark.default.parallelism参数来看Spark并行度、并行计算任务概念

并行度= partition= task总数。但是同一时刻能处理的task数量由并行计算任务决定(CPU cores决定)。(Parallelism)指的是分布式数据集被划分为多少份,从而用于分布式计算。换句话说,并行度的 出发点是数据(),它明确了数据划分的粒度。并行度越高,数据的粒度越细,数据分片越 多,数据越分散。由此可见,像分区数量、分片数量、Partitions 这些概念都是并行度的 同义词。。

石榴姐yyds 7673

spark.default.parallelism 在什么时候起作用,与spark.sql.shuffle.partitions有什么异同点?

异同主要影响 RDD 的初始并行度,而则专门控制 Spark SQL 中的 Shuffle 分区数。前者在非 SQL 的 RDD 操作中起作用,后者则仅对 SQL 或 DataFrame API 中的 Shuffle 操作生效。配置建议如果以 RDD 为主,则可以根据集群大小和任务负载调整。如果以 SQL 和 DataFrame 操作为主,特别是需要进行大量 Shuffle 的场景,可以适当调整来优化性能(如减少分区数以降低小任务开销,或增加分区数以加快数据处理速度)。

z1941563559的博客 1792

[零基础]用docker搭建Hadoop集群

[零基础]用docker搭建Hadoop集群,每一步都有详细的解释!

weixin_56114243的博客 2万+

别再手动折腾了!PICO Unity SDK 一键配置开发环境保姆级教程(含PDC串流调试)

本文详细介绍了PICO Unity SDK的一键配置功能,帮助开发者快速搭建VR开发环境。通过自动化配置流程,大幅减少手动设置时间,提升开发效率。文章还涵盖了PDC串流调试技巧和常见问题解决方案,是PICO VR开发的实用指南。

weixin_30335575的博客 454

Spark RDD分区数和分区器

① Ctrl + B 进入textFiletextFile底层其实就是通过去读文件② Ctrl + B 进入hadoopFile>>可以发现里面New了一个HadoopRDD实例③Ctrl + B 进入HadoopRDD类重点关注里面的方法>> 拆解分析1:最终返回的是一个partition数组>> 拆解分析2:inputSplits是通过getInputFormat(jobConf).getSplits(jobConf, minPartitions)获取,所以需要进入方法。

weixin_37901366的博客 978

闲鱼客户端三重动态签名机制解析:x-sign、x-mini-wua与x-umt

在移动客户端安全通信中,设备级动态签名已成为主流App防范自动化攻击的核心手段。其原理是将设备指纹、运行时行为与可信硬件标识深度融合,生成不可复用、不可跨端、不可静态伪造的请求凭证。这类机制超越传统Token或Session鉴权,具备强上下文绑定性与实时熵值校验能力,广泛应用于电商、社交及开放平台等高风险接口场景。技术价值体现在有效识别模拟器、无头浏览器与集群化爬虫,同时保障多端一致性与合规数据对接。本文聚焦闲鱼客户端实际落地的x-sign(带设备上下文的混合签名)、x-mini-wua(小程序行为水印)与

weixin_35732273的博客 497

Spark RDD深度解析:概念、创建方式与分区机制

RDD(弹性分布式数据集)是Spark中最基本的数据抽象,它代表一个不可变的、可分区的、内部元素可并行计算的集合。fill:#333;important;important;fill:none;root(RDD核心特性)弹性自动内存和磁盘切换容错性(血缘关系)可重算分布式数据分布在集群多节点并行计算数据集只读(不可变)可分区元素类型任意fill:#333;important;important;fill:none;color:#333;color:#333;important;

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 4135

天融信防火墙NGFW4000(TG-4628)安装配置笔记

配置一台全新的天融信防火墙NGFW4000,配置完后,内网用户10.10.1.0/24和10.10.2.0/24可以通过防火墙上网,外网用户可以通过访问防火墙的外网接口地址来访问内网的WEB服务器10.10.1.200,并且内网用户也可以通过WEB服务器的外网地址进行访问。 网络说明: 防火墙外网接口地址:218.90.123.121/30 防火墙内网接口地址:19...

weixin_33671935的博客 4460

量子密钥分发系统设计与实现(一):系统基本架构讨论

本文主要对量子密钥分发系统中的基础架构和基于系统的量子密钥协商过程进行了初步讨论,为后期系列文章进行铺垫。

量子领域相关话题 3898

Spark自定义分区器-基础

2.在main方法中,创建包含球队信息的 RDD,然后调用partitionBy方法并传入自定义分区器MyPartitioner,对 RDD 进行分区,最后将分区后的数据保存到指定路径。在 Spark 中,分区是指将数据集按照一定的规则划分成多个较小的子集,每个子集可以独立地在不同的计算节点上进行处理,这样可以实现数据的并行处理,提高计算效率。在 Spark 中,RDD 是数据的集合,它会被划分成多个分区,这些分区可以分布在不同的计算节点上,就像图书馆的书架分布在不同的房间一样。

2401_87129116的博客 1240

昇腾NPU实战:PaddleSpeech语音模型高效部署与性能优化指南

本文详细介绍了如何在华为昇腾NPU上高效部署PaddleSpeech语音识别模型。通过使用官方Docker镜像、解决依赖冲突、修改源码适配NPU算子,并应用混合精度与批处理等优化技巧,实现模型在昇腾平台上的稳定运行与性能提升,为AI语音应用提供高性价比的国产硬件部署方案。

weixin_29214691的博客 181

RDD-分区和分区器

分区数量过多,则会增加任务调度和管理的开销,同时也可能导致每个分区的数据量过小,无法发挥数据局部性的优势。此外,分区还能减少数据在网络中的传输,例如在进行数据聚合时,如果相同键的数据在同一个分区内,就无需跨节点传输数据,从而提高计算效率。在实际的大数据项目中,需要根据具体的数据特点和业务需求,灵活运用分区和分区器,不断优化 Spark 作业,以充分发挥 Spark 的强大功能。不同的分区器会根据键的特征,将具有相同或相似键的数据分配到同一个分区中,以便后续的聚合、连接等操作能够高效进行。

2401_82368706的博客 543

python实现纵横向拉开档次法 (附完整源码)

python实现纵横向拉开档次法 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 782

工业相机通用SDK封装实战:C#硬件抽象层(HAL)实现多品牌无缝切换

本文介绍了一种解决工业相机SDK碎片化问题的通用解决方案。作者基于多年工业视觉项目经验,提出通过硬件抽象层(HAL)和适配器模式封装不同品牌相机的SDK差异,实现统一的相机操作接口。文章详细分析了传统直接对接SDK方式的四大痛点:接口碎片化、维护成本高、业务耦合度高和稳定性差,并给出了分层架构设计方案。该方案采用三层架构(业务层、抽象层、实现层),遵循最小接口原则和高内聚低耦合等设计理念,定义了包括触发模式、像素格式等通用枚举类型,以及图像数据结构等核心抽象。最终实现的HAL层能够支持多种品牌相机,显著降低

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 578

Spark RDD详解

摘要:RDD(弹性分布式数据集)是Spark的核心抽象,具有不可变、分布式、容错和惰性求值等特性。RDD可通过集合或外部数据创建,支持转换(如map/filter)和行动(如collect/count)两类操作,其容错机制依赖血统信息恢复丢失数据。RDD可分区并行处理,但性能不如高级抽象DataFrame/DataSet。优化建议包括合理设置分区、缓存热点数据、减少shuffle等。RDD适用于复杂ETL、图计算等场景,但结构化处理推荐优先使用DataFrame。

onlymscn的博客 1412

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spark的RDD分区器

RDD 分区器 基本介绍 Spark 目前支持Hash 分区、Range 分区和用户自定义分区。Hash 分区为当前的默认分区。分区器直接决定了RDD 中分区的个数、RDD 中每条数据经过Shuffle 后进入哪个分区,进而决定了Reduce 的个数。 (1)只有Key-Value 类型的RDD 才有分区器,非 Key-Value 类型的RDD 分区的值是 None。 (2)每个RDD 的分区 ID 范围:0 ~ (numPartitions - 1),决定这个值是属于那个分区的。 1. Hash 分区 说

一入大数据深似海?别怕!“数据极客圈”就是你的救生圈,走对圈子跟对人,趣析数据、畅聊趋势,快进圈子! 888

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Spark 核心编程RDD

RDD主要知识点

zhongmingyu 1082

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Spark -- RDD数据分区(分区器)

Spark – RDD数据分区 Spark目前支持Hash分区和Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数 注意: (1)只有Key-Value类型的RDD才有分区器的,非Key-Value类型的RDD分区器的值是None (2)每个RDD的分区ID范围:...

ITgagaga的博客 1061

Spark RDD优化

分区优化、持久化优化、依赖优化、共享变量优化、提交模式与运行模式优化、其他优化

weixin_74292291的博客 1599

Spark中的RDD以及分区

Spark中的RDD以及分区 RDD 在spark中,最重要的概念就是RDD,它本质上是一个数据的引用,可以把它理解为C语言中的指针,即RDD本身是不存储数据的,但是通过操作RDD,我们就可以直接操作保存在分布式系统中的数据。所以RDD是存储在系统中数据的一个代理。         在上面的图片中,我们可以看到...

时间蜗牛的博客 1038

Spark RDD的分区与依赖关系

但是需要注意的是,由于JAVA中数组的hashCode是基于数组对象本身的,不是基于数组内容的,所以如果RDD的key是数组类型,那么可能导致数据内容一致的数据key没法分配到同一个RDD分区中,这个时候最好自定义数据分区器,采用数组内容进行分区或者将数组的内容转换为集合。Spark目前支持Hash分区和Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数、RDD中每条数据经过Shuffle过程属于哪个分区和Reduce的个数。

m0_51388399的博客 1294

分区器和默认分区器

MyPartitioner类继承自Partitioner,实现了numPartitions方法指定分区数量为 3 ,实现getPartition方法,根据球队名称判断分区索引,湖人对应分区 0,火箭对应分区 1,其他球队对应分区 2。假设分区数为 n,键为 key,则分区编号的计算公式为 hash(key) % n。2.在main方法中,创建包含球队信息的 RDD,然后调用partitionBy方法并传入自定义分区器MyPartitioner,对 RDD 进行分区,最后将分区后的数据保存到指定路径。

ws3372452762的博客 372
上一篇: spark如何生成/加载checkpoint的数据
下一篇: Win11升级后Edge打不开解决办法
JNWsong
博客等级 码龄9年 287粉丝 204原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值