Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客
Spark 的Standalone集群环境安装与测试-CSDN博客
PySpark 本地开发环境搭建与实践-CSDN博客
Spark 程序开发与提交:本地与集群模式全解析-CSDN博客
Spark on YARN:Spark集群模式之Yarn模式的原理、搭建与实践-CSDN博客
Spark 中 RDD 的诞生:原理、操作与分区规则-CSDN博客
目录
一、RDD 分区的设定规则
(一)parallelize 获取 rdd 时的分区设定
(二)通过外部读取数据 - textFile 时的分区设定
(三)子 RDD 分区数
(四)RDD分区的设定规则
二、高阶函数及 Lambda 表达式
(一)复习 Python 函数语法
(二)需求示例与高阶函数概念引入
一个简单的需求场景
高阶函数的定义
(三)Lambda 表达式与高阶函数的结合使用
使用 Lambda 表达式优化代码
更复杂的需求示例
在集合操作中的应用
三、总结
在大数据处理领域,Apache Spark 是一个强大的开源分布式计算框架。它提供了丰富的功能和灵活的编程接口,其中弹性分布式数据集(RDD)是其核心概念之一。RDD 的分区设定规则对于数据处理的性能和资源利用至关重要,同时,高阶函数和 Lambda 表达式的运用能让我们在 Spark 编程中更加简洁高效地处理数据。本文将深入探讨 RDD 分区的设定规则以及高阶函数和 Lambda 表达式的相关知识。
一、RDD 分区的设定规则
(一)parallelize 获取 rdd 时的分区设定
方式一:并行化集合:parallelize
没有指定:spark.default.parallelism参数值决定
指定分区:指定几个,就是几个分区
list_rdd = sc.parallelize(data,numSlices=2)总结:假如指定了分区数,分区数就是这个,假如没有指定spark.default.parallelism。
(二)通过外部读取数据 - textFile 时的分区设定
没有指定:spark.default.parallelism和2取最小值,具体计算并行度的公式:
min(spark.default.parallelism,2)
指定分区:最小分区数,最少有这么多分区,具体的分区数可以根据HDFS分片规则来
hdfs的一片是128M或者128*1.1 = 140.8M
file_rdd =sc.textFile("../datas/function_data/filter.txt", minPartitions=2)# 假如你这个data.txt = 500M ,此时的分区数是:4 因为 500 = 128+ 128+ 128+ 116
rdd3 = sc.textFile("hdfs://bigdata01:9820/datas/wordcount/data.txt", minPartitions=2)
rdd3.foreach(lambda x: print(x))
spark.default.parallelism 参数
这个参数在 RDD 分区设定中起着关键作用,它用于指定没有父 RDD 的 RDD 的分区数。在不同的运行模式下,其取值规则有所不同。
Local mode(本地模式)
在本地模式下,分区数取决于本地机器的 CPU 核数。这是因为在本地环境中,资源主要受限于本地计算机的硬件配置。例如,如果本地机器是 4 核,那么分区数可能就是 4(具体可能还会受到其他相关设置的微调)。这种基于本地 CPU 核数的分区设定,能够充分利用本地计算资源,实现一定程度的并行计算。
Mesos fine grained mode(Mesos 细粒度模式)
在 Mesos 细粒度模式下,分区数的默认值是 8。Mesos 是一种集群资源管理框架,在这种特定的模式下,Spark 有其默认的分区设定策略。这个默认值 8 是经过实践和设计考虑的,旨在在 Mesos 细粒度管理环境下平衡数据处理的效率和资源利用。
其他模式(Others)
在其他模式下,分区数是集群中所有参与运算的设备的所有核数与 2 相比较,取较大值。这种设定方式考虑了集群的整体计算能力。例如,如果集群中有 10 个节点,每个节点有 2 核,那么总核数是 20,大于 2,所以分区数就是 20。这种策略保证了在不同规模的集群中都能有合适的并行度,避免了因核数过少而导致的处理效率低下问题,同时也防止了因核数过多而可能引起的资源过度分配问题。
(三)子 RDD 分区数
子 RDD 的分区数与父 RDD 以及所使用的转换操作有关。在一些转换操作中,分区数可能保持不变,而在另一些操作中,分区数可能会根据数据的重新分布规则而改变。比如,在某些聚合操作后,分区数可能会减少,而在数据拆分操作后,分区数可能会增加。了解子 RDD 分区数的变化规律对于优化 Spark 作业的性能和资源利用有着重要意义。
(四)RDD分区的设定规则
(1)local模式
默认并行度取决于本地机器的核数,即
local: 没有指定CPU核数,则所有计算都运行在一个线程当中,没有任何并行计算
local[K]:指定使用K个Core来运行计算,比如local[2]就是运行2个Core来执行
local[*]: 自动帮你按照CPU的核数来设置线程数。比如CPU有4核,Spark帮你自动设置4个线程计算
(2)集群模式
集群模式包含Stanalone、Yarn模式,Mesos的默认并行度为8
默认并行度取决于所有executor上的总核数与2的最大值,比如集群模式的设置如下:
--num-executors 5
--executor-cores 2
上面配置Executor的数量为5,每个Executor的CPU Core数量为2,
executor上的总核数10,则默认并行度为Max(10,2)=10。
注意,上面只是默认并行度(defaultParallelism)的取值,并不一定是RDD最终的分区数。具体来说,对于从集合中创建的RDD,其最终分区数等于defaultParallelism,但是从外部存储系统的数据集创建创建的RDD,其最终的分区数:需要文件的总大小计算得到。
二、高阶函数及 Lambda 表达式
(一)复习 Python 函数语法
在深入探讨高阶函数和 Lambda 表达式之前,我们先来复习一下 Python 函数的语法。函数是一段可重复使用的代码块,用于完成特定的任务。在 Python 中,我们使用def
关键字来定义函数,例如:
创建
def 函数名(参数):代码逻辑返回值:return
调用
返回值 = 函数名(参数)def function_name(parameters):# 函数体return resultdef add(a,b)return a + bx = add(1,2)
print(x) # x = 3
函数可以接受参数,在函数体中进行计算,并返回一个结果。参数可以有默认值,函数也可以没有返回值(此时return
语句可以省略)。
(二)需求示例与高阶函数概念引入
一个简单的需求场景
假设我们有一个列表list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
,我们想要对这个列表中的每个元素进行平方和次方运算。我们可以定义一个函数,然后使用map
函数来将函数应用到list1
的每个元素上:
import mathlist1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(*list1)def pingFang(x):return x * xdef liFang(x):return math.pow(x, 3)def getNum(_list, flag):if flag == 2:return map(pingFang, _list)if flag == 3:return map(liFang, _list)# 此时的map是python的一个方法,不是spark里面一个算子RDD
# map(函数,后面是一个迭代器): 循环将一个迭代器中的元素拿过来,传递个前面的函数,计算得到一个map对象
# lambda 其实是一个匿名函数,主要用于一个方法中需要传递一个函数,这个函数只用一次,并且函数中的代码只有一行。
def getNum2(_list, flag):if flag == 2:return map(lambda x: x * x, _list)if flag == 3:return map(lambda x: math.pow(x, 3), _list)for e in getNum2(list1, 2):print(e)print("--" * 20)
for e in getNum2(list1, 3):print(e)
高阶函数的定义
高阶函数是一种特殊的函数,它的某个参数是一个函数。就像我们上面提到的map
函数,它接受一个函数(这里是comp
)和一个可迭代对象(这里是list1
)作为参数。一般来说,作为参数的函数(这里的comp
)被称为参数函数。
函数和算子在概念上有一些区别,函数通常是指一般的方法,它们在单机环境下执行,不能并行执行。而算子在分布式计算环境中,如 Spark 中,数据是分布式存储的,计算也是分布式进行的。
(三)Lambda 表达式与高阶函数的结合使用
使用 Lambda 表达式优化代码
对于前面的平方运算示例,我们可以使用 Lambda 表达式来简化代码。Lambda 表达式是一种匿名函数,它的语法形式为lambda parameters: expression
。使用 Lambda 表达式来实现列表元素平方运算的代码如下:
# 举例说明:
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def comp(x):return x*x
rs = map(comp, list1)
print(*rs)# 使用lambda 优化一下:
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
rs = map(lambda x: x*x, list1)
print(*rs)
这里的lambda x: x * x
就是一个匿名函数,它替代了我们之前定义的comp
函数。
更复杂的需求示例
我们来看一个更复杂一点的需求。给定一个值,我们可以求这个值的 2 次方或者 3 次方。首先是正常的写法:
# 正常思路
import mathdef getPingFang(num):return num ** 2def getLiFang(num):return math.pow(num, 3)def getNum(num, flat):if flat == 2:return getPingFang(num)if flat == 3:return getLiFang(num)print(getNum(10, 2))
print(getNum(10, 3))
这种写法相对比较繁琐,尤其是当函数体比较简单的时候。我们可以使用高阶函数和 Lambda 表达式来优化。我们定义一个高阶函数getNum2
:
def getNum2(fun, num):return fun(num)
然后我们可以这样使用它:
print(getNum2(getPingFang, 10))
print(getNum2(getLiFang, 10))
我们还可以使用 Lambda 表达式:
print(getNum2(lambda x: x ** 2, 10))
print(getNum2(lambda x: math.pow(x, 3), 10))
在集合操作中的应用
假设我们有一个列表list = [1, 3, 4, 45, 56, 8]
,我们想要求这个列表中每个数的平方和立方。我们可以使用map
这个高阶函数结合 Lambda 表达式来实现:
a = map(lambda x: math.pow(x, 2), list)
b = map(lambda x: math.pow(x, 3), list)
print(*a)
print(*b)
这里map
函数将 Lambda 表达式所定义的函数应用到列表的每个元素上,分别得到平方和立方的结果集。
三、总结
在 Spark 编程中,理解 RDD 分区的设定规则对于优化数据处理性能至关重要。不同的获取 RDD 方式和运行模式下,分区数的设定都有其特定的规则。同时,高阶函数和 Lambda 表达式是提高代码简洁性和效率的有力工具。通过合理运用高阶函数和 Lambda 表达式,我们可以在处理数据集合时更加灵活和高效。无论是简单的数学运算还是复杂的数据分析场景,这些知识都能帮助我们更好地利用 Spark 的强大功能。在实际的大数据处理项目中,深入掌握这些概念并灵活运用,可以使我们的 Spark 作业更加高效地运行,提高数据处理的速度和质量,为企业和组织从海量数据中获取有价值的信息提供有力支持。希望本文能帮助读者更好地理解和应用这些重要的 Spark 编程知识点。
相关文章:

Spark 中的 RDD 分区的设定规则与高阶函数、Lambda 表达式详解
Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…...

redis十大数据类型
文章目录 一、redis字符串(String)set key value同时获取或设置多个键值获取指定区间范围内的值数字增减获取字符串长度和内容追加分布式锁getset(先get再set) 二、redis列表(List)通过索引获取列表中的元素…...

国内AI工具复现GPTs效果详解
国内AI工具复现GPTs效果详解 引言 近年来,随着人工智能技术的飞速发展,大型语言模型(LLM)逐渐成为研究和应用的热点。GPTs(Generative Pre-trained Transformer)系列模型,特别是GPT-4的推出&a…...

【学习笔记】SAP ABAP——OPEN SQL(一)【INTO语句】
【INTO语句】 结构体插入(插入一条语句时) SELECT...INTO [CORRESPONDING FIELDS OF] <wa> FROM <db> WHERE <condition>.内表插入(插入多条语句时) SELECT...INTO|APPENDING [CORRESPONDING FIELDS OF] TABLE <itab>FROM <db> WHERE <con…...

vscode使用之vscode-server离线安装
最近因为想要使用AI工具开始使用vscode,但是在内网使用vscode通过SSH连接虚拟机的centos远程目录却出现了问题,始终连不上,查看原因是centos没有安装vscode-server,网上找各个教程离线安装vscode-code除了浪费时间没有任何收获&am…...

字符编码和字符集
1. 字符编码和字符集 1.1. 字符编码 编码:字符 –>字节解码:字节 –>字符字符编码Character Encoding : 就是一套自然语言的字符与二进制数之间的对应规则。 1.2. 字符集 字符集 Charset:是一个系统支持的所有字符的集合࿰…...

【WRF理论第七期】WPS预处理
【WRF理论第七期】WPS预处理 运行WPS(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extracting meteorological fields from GRIB files with ungrib步骤3:Horizontally interpolating meteorologic…...

Flutter鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面中不可或缺的组件之一。它不仅用于触发事件,还可以作为视觉元素增强用户体验。Flutter提供了多种按钮组件,如ElevatedButton、TextButton、OutlinedButton等,但有时这些预制的按钮样式无法满足…...

代码随想录算法训练营Day57 | 卡玛网 101.孤岛的总面积、卡玛网 102.沉没孤岛、卡玛网 103. 水流问题、卡玛网 104.建造最大岛屿
目录 卡玛网 101.孤岛的总面积 卡玛网 102.沉没孤岛 卡玛网 103. 水流问题 卡玛网 104.建造最大岛屿 卡玛网 101.孤岛的总面积 题目 101. 孤岛的总面积 思路 代码随想录:101.孤岛的总面积 重点: 首先遍历图的四条边,把其中的陆地及…...

美团代付微信小程序系统 read.php 任意文件读取漏洞复现
0x01 产品简介 美团代付微信小程序系统是美团点评旗下的一款基于微信小程序技术开发的应用程序功能之一,它允许用户方便快捷地请求他人为自己支付订单费用。随着移动支付的普及和微信小程序的广泛应用,美团作为中国领先的本地生活服务平台,推出了代付功能,以满足用户多样化…...

Windows安装tensorflow的GPU版本
前言 首先本文讨论的是windows系统,显卡是英伟达(invida)如何安装tensorflow-gpu。一共需要安装tensorflow-gpu、cuDNN、CUDA三个东西。其中CUDA是显卡的驱动库,cuDNN是深度学习加速库。 安装开始前,首先需要安装好c…...

2021-04-22 51单片机玩转点阵
理论就不赘述了,网络上多得很,直接从仿真软件感性上操作认识点阵,首先打开ISIS仿真软件,放置一个点阵和电源与地线就可以开始了;由点阵任何一脚连线到地线,另一边对应的引脚就连接到电源,如图:点击运行看是否点亮?看到蓝色与红色的点表示电源正常但是没有任何亮点,这时对调一下…...

lua入门教程:数字
在Lua中,数字(number)是一种基本数据类型,用于表示数值。以下是对Lua中数字的详细教程: 一、数字类型概述 Lua中的数字遵循IEEE 754双精度浮点标准,可以表示非常大的正数和负数,以及非常小的正…...

[CKS] K8S ServiceAccount Set Up
最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于Rolebinding的题目。 Question 1 The buffy Pod in the sunnydale namespace has a buffy-sa ServiceAccount with permissions the Pod doesn’t need. Modify the attached Role so that it onl…...

QML:Menu详细使用方法
目录 一.性质 二.作用 三.方法 四.使用 1.改变标签 2.打开本地文件 3.退出程序 4.打开Dialog 五.效果 六.代码 在 QML 中,Menu 是一个用于创建下拉菜单或上下文菜单的控件。它通常由多个 MenuItem 组成,每个 MenuItem 可以包含文本、图标和快捷…...

时间复杂度和空间复杂度 part2
一,空间复杂度 空间复杂度是衡量一个算法在执行过程中所需内存空间的量度。它反映了算法随着输入数据规模(通常是 nn)的增加,所消耗的内存量如何变化。空间复杂度是分析算法效率的一个重要方面,尤其是在内存资源有限的…...

【电机控制器】STC8H1K芯片——UART串口通信
【电机控制器】STC8H1K芯片——UART串口通信 文章目录 [TOC](文章目录) 前言一、UART1.串口初始化2.串口中断3.发送一个字节 二、实验1.原理图2.实验现象 三、参考资料总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、UART 1.串口初始化 …...

STM32移植RT-Thread---时钟管理
一RTT时钟节拍概念 RT-Thread的时钟节拍(Tick)是操作系统用于管理时间和任务调度的一个基本单位。它在实时操作系统中尤为关键,用于实现任务的延时、超时管理等功能。以下是关于RT-Thread时钟节拍的简单说明: 1.Tick定义&#x…...

Jasypt 实现 yml 配置加密
文章目录 前言一、集成 Jasypt1. pom 依赖2. yml 依赖 3. 加密工具类3. 使用二、常见问题1. application.yml 失效问题2. 配置热更新失败问题 前言 jasypt 官方地址:https://github.com/ulisesbocchio/jasypt-spring-boot Jasypt可以为Springboot加密的信息很多&a…...

uniapp—android原生插件开发(2原生插件开发)
本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! ***环境问题移步至:uniapp—an…...

NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略
NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略 目录 moonshine的简介 moonshine的安装和使用方法 1、安装 推荐使用uv管理Python环境 安装Moonshine包 Torch后端 TensorFlow后端 JAX后端 ONNX运行时 2、使用方法 0、测试 1…...

albert模型实现微信公众号虚假新闻分类
项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…...

OceanBase 应用实践:如何处理数据空洞,降低存储空间
问题描述 某保险行业客户的核心系统,从Oracle 迁移到OceanBase之后,发现数据存储空间出现膨胀问题,数据空间 datasize9857715.48M,实际存储占用空间17790702.00M。根据 required_mb - data_mb 值判断,数据空洞较为严重…...

计算机的错误计算(一百四十八)
摘要 本节探讨 MATLAB 中 附近数的正割函数与 附近数的余割函数的计算精度问题。 例1. 已知 计算 直接贴图吧: 另外,16位的正确值分别为 0.4105556037464873e9、0.3670813182326778e13、-0.2549029285657875e8 与 -0.1248777628817462e12&am…...

MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。 对于行…...

SLM401A系列42V商业照明线性恒流芯片 线性照明调光在LED模组及灯带智能球泡灯上应用
SLM401A系列型号选型: SLM401A10ED-7G:QFN1010-4 SLM401A15aa-7G:SOT23-3 SLM401A20aa-7G:SOT23-3 SLM401A20ED-7G:QFN1010-4 SLM401A25aa-7G:SOT23-3 SLM401A30aa-7G:SOT23-3 SLM401A40aa-7G:SOT23-3 SLM401A50aa-7G:SOT23-3 SLM401A6…...

京东零售推荐系统可解释能力详解
作者:智能平台 张颖 本文导读 本文将介绍可解释能力在京东零售推荐系统中的应用实践。主要内容包括以下几大部分:推荐系统可解释定义、系统架构、排序可解释、模型可解释、流量可解释。 推荐系统可解释定义 推荐系统可解释的核心包括三部分࿰…...

蓝桥杯 懒洋洋字符串--字符串读入
题目 代码 #include <iostream>using namespace std;int main(){int n;cin>>n;char s[210][4];int ans0;for(int i0;i<n;i){scanf("%s",s[i]);}for(int i0;i<n;i){char as[i][0];char bs[i][1];char cs[i][2];// cout<<a<< <<b…...

SDL打开YUV视频
文章目录 问题1:如何控制帧率?问题2:如何触发退出事件?问题3:如何实时调整视频窗口的大小问题4:YUV如何一次读取一帧的数据? 问题1:如何控制帧率? 单独用一个子线程给主线…...

微服务架构面试内容整理-Archaius
Archaius 是由 Netflix 开发的一个配置管理库,主要用于处理动态配置和环境配置。在微服务架构中,Archaius 允许开发者以灵活的方式管理配置,从而更好地应对变化的需求。以下是 Archaius 的主要特点、工作原理和使用场景: 主要特点 1. 动态配置: Archaius 支持动态更新配置…...