当前位置: 首页 > news >正文

Spark--算子执行原理

一、sortByKey

  SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。

内部执行流程

1、创建RangePartitioner part,用于构建分区规则。

  Part可以根据指定的分区数量和排序方式,确定每个下游分区的上界,并为每个key分配正确的分区编号。数据在shuffle到本地磁盘的过程中,会记录目标分区的信息,确保下游分区能够正确拉取对应分区的数据。

2、根据part创建ShuffleRDD,对原始RDD按key重新分区。

3、shuffle到本地磁盘的临时文件(包含数据文件和索引文件)。

4、下游分区拉取对应分区的数据。

RangePatitioner工作原理

(1)确定下游每个分区的上界。

  对每个上游分区采样,确定数据的大致范围,再根据传入的分区数或者默认分区数确定分区边界。

(2)将rdd中的每个key调用getPartition函数,从而获取其应归属的分区。

①若目标分区数较小(128),采用线性查找;
②若超过128,采用二分查找:
  如果键小于范围的最小界限,它将分配到第一个分区。
  如果键大于所有范围界限,它将分配到最后一个分区。
  对于在某个范围中间的键,getPartition 使用二分查找方法找到合适的分区。这里根据范围边界数组 (rangeBounds) 和键值(k)进行比较,返回对应的分区索引。

二、join

内部执行流程

1、接收其他RDD作为参数

  默认使用当前有效的最大分区器,如果没有,新建一个HashPartitioner作为分区器。

2、将具有相同key的value进行联结(cogroup)

  (返回一个二元组(K, (Iterable[V1], Iterable[V2]))),若某个rdd没有该key对应的value,Iterable为空。

3、将每个key对应的两个Iterator中的元素进行笛卡尔积,每一对结果作为新的value,与key组成新的二元组返回。

三、map & mapPartitions & mapPartitionsWithIndex & flatMap

1、map

内部执行流程

(1)将函数作为参数传入;
(2)对f删除不必要的引用,检查是否能够被序列化,是否存在闭包问题;
(3)创建一个MapPartitionsRDD,将每个迭代器执行 f 的逻辑后返回。

特点

(1)每处理一条数据,就调用一次f,每一条数据都是一个迭代器。
(2)无法直接得知分区编号,但是可以通过如下方式获取:

val index = TaskContext.getPartitionId()

(3)返回迭代器。

2、mapPartitions

特点

(1)以分区为单位对数据调用f,一个分区就是一个迭代器。
(2)返回迭代器和partitioner。

3、mapPartitionsWithIndex

特点

(1)以分区为单位对数据调用f,一个分区就是一个迭代器。
(2)返回分区编号和迭代器

4、flatMap

  通过TraversableOnce特征,逐个处理rdd中的每个元素,然后将处理过的元素组成新的rdd返回。

四、groupByKey & groupBy

1、groupByKey (k, CompactBuffer(v,v,v,v) )

内部执行流程

1、调用 combineByKeyWithClassTag将所有相同的key合并到CompactBuffer中,并根据指定的partitioner进行分组;
2、返回一个新的rdd,每个key 对应的value被聚合成一个CompactBuffer;
3、将合并后的rdd转换为RDD[(K, Iterable[V])]]。

partitioner为HashPartitioner

  可以看到,HashPartitioner为key分配新分区号的方式是key的hashCode值 % 下游分区数,这意味着相同key的数据一定会被分配到同一台机器的同一个partition的同一个组里面。

2、groupBy ( k, CompactBuffer( (k,v),(k,v),(k,v),(k,v) ) )

内部执行流程

1、将f函数作为参数传入;
2、对f删除不必要的引用,检查是否能够被序列化,是否存在闭包问题;
3、将rdd的每个元素调用f后的值作为key,元素本身作为value,得到的二元组调用groupByKey进行分组。

  源rdd在Driver端被创建和调用,对rdd进行操作,本质上是对rdd的每个partition进行操作,而每个partition对应一个task,task就会对这个partition对应的Iterator进行相应的操作。
  算子被调用,真正执行时会调用compute方法。真正执行具体是指task被分配到executor的线程池中时,compute方法被iterator调用。

3、groupBy VS groupByKey

  groupBy更灵活,但在shuffle时传输的数据更多(groupBy返回 ( k, CompactBuffer( (k,v),(k,v),(k,v),(k,v) ) );而groupByKey返回 (k, CompactBuffer(v,v,v,v) ) )。

五、reduceByKey & combinByKey

1、reduceByKey

内部执行流程

1、调用 combineByKeyWithClassTag,将分区内相同key的value应用传入的函数,再将分区间相同key的value应用同一个传入的函数;
2、返回一个新的rdd。

2、combineByKey


  combineByKey的内部执行流程与reduceByKey是一样的,唯一不同的是combineByKey分区间应用的函数与分区内应用的函数不同。

3、性能分析

ReduceByKey VS CombineByKey

  combineByKey更灵活,因为其支持分别指定分区内和分区间的聚合逻辑,而reduceByKey分区内和分区间使用一样的聚合逻辑。

reduceByKey VS groupByKey

  reduceByKey的效率更高,因为reduceByKey在map端会进行局部聚合,因此在shuffle时传输的数据更少。

六、foldByKey & aggregateByKey

1、foldByKey

内部执行流程

(1)调用 combineByKeyWithClassTag,先将初始值应用函数,再将分区内相同key的value应用传入的函数,最后将分区间相同key的value应用同一个传入的函数;
(2)返回一个新的rdd。

2、aggregateByKey


  foldByKey 的内部执行流程与 aggregateByKey 是一样的,唯一不同的是 aggregateByKey 分区间应用的函数与分区内应用的函数不同。

3、foldByKey 与 aggregateByKey的区别

  foldByKey局部和全局使用相同的聚合逻辑;aggregateByKey局部和全局使用不同的聚合逻辑。

相关文章:

Spark--算子执行原理

一、sortByKey SortByKey是一个transformation算子,但是会触发action,因为在sortByKey方法内部,会对每个分区进行采样,构建分区规则(RangePartitioner)。 内部执行流程 1、创建RangePartitioner part&…...

事件驱动架构(EDA)

事件驱动架构(Event-Driven Architecture, EDA)是一种软件架构模式,其中系统的行为由事件的产生和处理驱动。在这种架构中,系统的组件通过事件进行交互,而不是通过直接的调用或者请求响应方式。 关键概念 事件&#x…...

C++ 入门速通-第5章【黑马】

内容来源于:黑马 集成开发环境:CLion 先前学习完了C第1章的内容: C 入门速通-第1章【黑马】-CSDN博客 C 入门速通-第2章【黑马】-CSDN博客 C 入门速通-第3章【黑马】-CSDN博客 C 入门速通-第4章【黑马】-CSDN博客 下面继续学习第5章&…...

2025春招,深度思考MyBatis面试题

大家好,我是V哥,2025年的春招马上就是到来,正在准备求职的朋友过完年,也该收收心,好好思考一下自己哪些技术点还需要补一补了,今天 V 哥要跟大家聊的是MyBatis框架的问题,站在一个高级程序员的角…...

排序算法--冒泡排序

冒泡排序虽然简单&#xff0c;但在实际应用中效率较低&#xff0c;适合小规模数据或教学演示。 // 冒泡排序函数 void bubbleSort(int arr[], int n) {for (int i 0; i < n - 1; i) { // 外层循环控制排序轮数for (int j 0; j < n - i - 1; j) { // 内层循环控制每轮比…...

简易C语言矩阵运算库

参考网址&#xff1a; 异想家纯C语言矩阵运算库 - Sandeepin - 博客园 这次比opencv快⑥倍&#xff01;&#xff01;&#xff01; 参考上述网址&#xff0c;整理了一下代码&#xff1a; //main.c#include <stdio.h> #include <stdlib.h> #include <string.h…...

通过C/C++编程语言实现“数据结构”课程中的链表

引言 链表(Linked List)是数据结构中最基础且最重要的线性存储结构之一。与数组的连续内存分配不同,链表通过指针将分散的内存块串联起来,具有动态扩展和高效插入/删除的特性。本文将以C/C++语言为例,从底层原理到代码实现,手把手教你构建完整的链表结构,并深入探讨其应…...

【分布式架构理论3】分布式调用(2):API 网关分析

文章目录 一、API 网关的作用1. 业务层面&#xff1a;简化调用复杂性2. 系统层面&#xff1a;屏蔽客户端调用差异3. 其他方面&#xff1a; 二、API 网关的技术原理1. 协议转换2. 链式处理3. 异步请求机制1. Zuul1&#xff1a;同步阻塞处理2. Zuul2&#xff1a;异步非阻塞处理 三…...

基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构

每个服务使用一台独立的服务器的可行部署方案&#xff0c;尤其是在高并发、高可用性要求较高的场景中。这种方案通常被称为分布式部署或微服务架构。以下是针对您的VoIP管理系统&#xff08;基于Kamailio、MySQL、Redis、Gin、Vue.js&#xff09;的详细分析和建议。 1. 分布式部…...

6S模型的编译问题解决

使用python处理遥感光谱数据&#xff0c;免不了进行大气校正&#xff0c;基本上免费的就是使用Py6s&#xff0c;而py6s库只是一个接口&#xff0c;还需要自己配置6S模型&#xff0c;可以查到很多资料&#xff0c;6S模型是古老的fortran语言写的&#xff0c;基本配置流程就是安装…...

C++11详解(二) -- 引用折叠和完美转发

文章目录 2. 右值引用和移动语义2.6 类型分类&#xff08;实践中没什么用&#xff09;2.7 引用折叠2.8 完美转发2.9 引用折叠和完美转发的实例 2. 右值引用和移动语义 2.6 类型分类&#xff08;实践中没什么用&#xff09; C11以后&#xff0c;进一步对类型进行了划分&#x…...

实验十四 EL和JSTL

实验十四 EL和JSTL 一、实验目的 1、掌握EL表达式的使用 2、掌握JSTL的使用 二、实验过程 1、在数据库Book中建立表Tbook&#xff0c;包含图书ID&#xff0c;图书名称&#xff0c;图书价格。实现在bookQuery.jsp页面中模糊查询图书&#xff0c;如果图书的价格在50元以上&#…...

为什么在springboot中使用autowired的时候它黄色警告说不建议使用字段注入

byType找到多种实现类导致报错 Autowired: 通过byType 方式进行装配, 找不到或是找到多个&#xff0c;都会抛出异常 我们在单元测试中无法进行字段注入 字段注入通常是 private 修饰的&#xff0c;Spring 容器通过反射为这些字段注入依赖。然而&#xff0c;在单元测试中&…...

DeepSeek大模型介绍、本地化部署与使用!【AI大模型】

一、DeepSeek 是什么&#xff1f; 1.技术定位 专注大模型与AGI研究&#xff0c;开发高性能基座模型&#xff08;如 DeepSeek LLM 系列&#xff09;&#xff0c;支持长文本、多模态、代码生成等复杂任务。 提供开源模型&#xff08;如 DeepSeek-MoE、DeepSeek-V2&#xff09;…...

备考蓝桥杯嵌入式4:使用LCD显示我们捕捉的PWM波

上一篇博客我们提到了定时器产生PWM波&#xff0c;现在&#xff0c;我们尝试的想要捕获我们的PWM波&#xff0c;测量它的频率&#xff0c;我们应该怎么做呢&#xff1f;答案还是回到我们的定时器上。 我们知道&#xff0c;定时器是一个高级的秒表&#xff08;参考笔者的比喻&a…...

智能化转型2.0:从“工具应用”到“价值重构”

过去几年&#xff0c;“智能化”从一个模糊的概念逐渐成为企业发展的核心议题。2024年&#xff0c;随着生成式AI、大模型、智能体等技术的爆发式落地&#xff0c;中国企业正式迈入智能化转型的2.0时代。这一阶段的核心特征是从单一场景的“工具应用”转向全链条的“价值重构”&…...

机器学习之数学基础:线性代数、微积分、概率论 | PyTorch 深度学习实战

前一篇文章&#xff0c;使用线性回归模型逼近目标模型 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课&#xff1a;引领人工智能新时代【梗直哥瞿炜】 线性代数、微积分、概率论 …...

9.PPT:儿童孤独症介绍【22】

目录 NO12345​ NO6789 NO12345 1-3张素材.txt中的大纲→素材文档PPT.pptx设计→主题→积分字体&#xff1a;幻灯片母版在幻灯片母版右上角的相同位置插入任一剪贴画&#xff0c;改变该剪贴画的图片样式、为其重新着色&#xff0c;并使其不遮挡其他文本或对象 开始→版式动画…...

离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码

大规模旅行商问题&#xff08;Large-Scale Traveling Salesman Problem&#xff0c;LTSP&#xff09;是经典旅行商问题&#xff08;TSP&#xff09;在规模上的扩展&#xff0c;是一个具有重要理论和实际意义的组合优化问题&#xff1a; 一、问题定义 给定一组城市和它们之间的…...

Java 引入和使用jcharset,支持UTF-7字符集

一、背景说明 Java标准库不直接支持UTF-7字符集&#xff0c;但通过我们可以使用第三方库jcharset方便地处理UTF-7编码的数据。 二、引入说明 JDK8及以下版本&#xff0c;我们将jcharset.jar并将其放到${JAVA_HOME}/jre/lib/ext/下即可完成引入。 JDK17及以后版本&#xff0c;对…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...