RDD简介与基础编程

1. 什么是RDD?

RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据处理模型。在代码中,RDD是一个抽象类,他代表着一个弹性的、不可变的、可分区的、里面的元素可并行计算的集合。注意,RDD只是封装了计算逻辑,并不保存数据。RDD是一个抽象类,需要子类去实现。不可变指的是计算逻辑不可变,如果想要改变,则要产生新的RDD。

2. 五大核心属性

源码中五大属性介绍如下

1)分区列表

分区的主要目的是实现并行计算/分布式计算

2)分区计算函数

以分区为单位,进行计算,每个分区的计算函数都是一样的

3)RDD之间的依赖关系

一个RDD能够转换成另一个RDD,形成一种包装的依赖关系

4)分区器

负责如何划分分区,分区器是Option属性,可能有,可能没有

5)计算每个分区的首选位置

数据存储的节点和数据计算节点可能不一样,判断计算发给哪个节点更好,移动数据不如移动计算

3. 执行原理

Spark框架在执行计算时,先申请资源,然后将数据处理逻辑分解成一个个计算任务,然后将计算任务发送到已经分配资源的计算节点上,按照指定的计算模型进行计算。以Yarn集群环境为例:

其中,Yarn只是负责资源调度的,而NodeManager中的Driver才是负责任务调度的,而NodeManager中的Executor是负责任务执行的。

4. 从集合中创建RDD

通过parallelize和makeRDD方法

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")

val sc = new SparkContext(sparkConf)

val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq)

rdd.collect().foreach(println)

sc.stop()

其中local[*]表示使用当前本机的核数,如果不写[*]就用单核。parallelize和makeRDD方法本质是一样的,makeRDD方法内部调用了parallelize方法。

makeRDD可以加上第二个参数,表示分区数量,如果不传,会使用默认值scheduler.conf.getInt("spark.default.parallelism", totalCores),即会从sparkConf中获取配置参数,如果没配置,则使用totalCores,即当前环境最大核数。当然,这是针对本地模式的源码分析。

另外使用saveAsTextFile保存每个分区的文件。

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")

val sc = new SparkContext(sparkConf)

val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq, 2)

rdd.saveAsTextFile("output")

rdd.collect().foreach(println)

sc.stop()

结果如下(2个分区):

可以设置sparkConf中的分区数量配置参数为5

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")
sparkConf.set("spark.default.parallelism", "5")

val sc = new SparkContext(sparkConf)

val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[Int] = sc.makeRDD(seq)

rdd.saveAsTextFile("output")

rdd.collect().foreach(println)

sc.stop()

结果如下

 

分区数据的划分可以参考

036 RDD-集合数据源-分区数据的分配

5. 从文件中创建RDD

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")

val sc = new SparkContext(sparkConf)

val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[String] = sc.textFile("path")

rdd.collect().foreach(println)

sc.stop()

path可以是文件夹,也可以是文件 ,还可以加上通配符*。另外,path可以是分布式文件系统的路径。这里的textFile是以行为单位进行读取数据,不考虑数据来自于哪个文件。如果需要考虑数据来源于哪个文件,则需要用到wholeTextFiles方法。

val sparkConf = new SparkConf.setMaster("local[*]").setAppName("RDD")

val sc = new SparkContext(sparkConf)

val seq = Seq[Int](1, 2, 3, 4)
// val rdd : RDD[Int] = sc.parallelize(seq)
val rdd : RDD[String] = sc.wholeTextFiles("path")

rdd.collect().foreach(println)

sc.stop()

读取结果形式类似如下:

可以看出,是以文件为单位进行读取,文件全路径名称和文件内容以逗号隔开。

textFile也可以通过第二个参数指定分区数量,如果不传,默认为min(scheduler.conf.getInt("spark.default.parallelism", totalCores), 2),但是第二个参数并不完全是最终分区的数量,这里只是表示最小分区数,实际分区数量可能比这个值要大。实际分区数量怎么计算可以考037 RDD-文件数据源-分区的设定。分区数据的划分可参考038 RDD-文件数据源-分区数据的分配和039 RDD-文件数据源-分区数据的分配-案例分析​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418275.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

附加Numpy数组

参考:Append Numpy Array 引言 在数据科学和机器学习领域,处理大规模数据集是一项重要且常见的任务。为了高效地处理数据,numpy是一个非常强大的Python库。本文将详细介绍numpy中的一个重要操作,即如何附加(append&a…

常用字符函数和字符串函数的了解和模拟实现

前言 字符函数和字符串函数都是在编程中用来处理字符和字符串的函数。 字符函数是用来处理单个字符的函数,比如查找、替换、转换大小写、比较等操作。常用的字符函数包括: isalpha():判断一个字符是否为字母;isdigit()&#xf…

图像分割 - 查找图像的轮廓(cv2.findContours函数)

1、前言 轮廓,是指图像中或者物体的外边缘线条。在简单的几何图形中,图形的轮廓是由平滑的线条构成,容易被识别。但不规则的图形或者生活中常见的物体轮廓复杂,识别起来比较困难 2、findContours函数 这里先介绍函数的参数,具体的含义会在下面实验中阐述 opencv 提供的轮…

源码框架-​1.Spring底层核心原理解析

目录 Spring中核心知识点: Bean的创建过程 推断构造方法 AOP大致流程 Spring事务 Spring中核心知识点: Bean的生命周期底层原理依赖注入底层原理初始化底层原理推断构造方法底层原理AOP底层原理Spring事务底层原理 ps:这篇文章中都只是大致流程,后续会针对每…

猜测了一个sora模型结构

如果是上述的这种结构,可以确定的是patch 的size (一个图像的小片)是固定大小的 那么调节一个视觉分辨率大小通过patchs的大小决定。 如图所示可以证明输入的时候图片没有本物理人为的分割为小片,是通过一个模型进行分割为 小片。…

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

供应链|NUS覃含章MS论文解读:数据驱动下联合定价和库存控制的近似方法 (二)

编者按 本次解读的文章发表于 Management Science,原文信息:Hanzhang Qin, David Simchi-Levi, Li Wang (2022) Data-Driven Approximation Schemes for Joint Pricing and Inventory Control Models. https://doi.org/10.1287/mnsc.2021.4212 文章在数…

助力智能化农田作物除草,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统

在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于YOLOv7系列的模型来开发…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

如何通过代理IP安全使用Linkedln领英?

LinkedIn是跨境外贸必备的拓客工具,世界各地的许多专业人士都使用领英来作为发布和共享内容的主要工具,这使得它成为跨境出海必备的渠道工具。 但是不少做外贸的朋友都知道,领英账号很容易遭遇限制封禁,但如果善用工具&#xff0…

中小型水库安全监测运营解决方案,筑牢水库安全防线

我国水库大坝具有“六多”的特点。第一,总量多。我国现有水库9.8万座,是世界上水库大坝最多的国家。第二,小水库多。我国现有水库中95%的水库是小型水库。第三,病险水库多。 目前,在我国水库管理中,部分地方…

第3届图像处理与媒体计算国际会议(ICIPMC 2024)即将召开!

2024年第3届图像处理与媒体计算国际会议(ICIPMC2024)将于2024年5月17-19日在中国合肥举行。本次大会由安徽大学、西北工业大学,西北大学和IEEE联合主办。ICIPMC 2024旨在汇集该领域领先的学术科学家、研究人员和学者,并进行交流和…

Linux学习-C语言-运算符

目录 算术运算符: - * /:不能除0 %:不能对浮点数操作 :自增与运算符 i:先用再加 i:先加再用 --:自减运算符 常量,表达式不可以,--,变量可以 赋值运算符 三目运算符 逗号表达式 size…

Opencv基本操作 (上)

目录 图像基本操作 阈值与平滑处理 图像阈值 图像平滑处理 图像形态学操作 图像梯度计算 Sobel 算子 Canny 边缘检测 图像金字塔与轮廓检测 图像轮廓 接口定义 轮廓绘制 轮廓特征与相似 模板匹配 傅里叶变换 傅里叶变换的作用 滤波 图像基本操作 读取图像&…

关键字:private关键字作用,解析及用法

private关键字在 Java 中用于定义类的成员(如变量、方法)的访问权限。它表示该成员只能在类的内部被访问和修改,而在类的外部是不可见的。 以下是private关键字的主要作用和解析: 作用: 封装性:通过将类的…

低代码中的可视化表单:效率与灵活兼备的设计工具

近年来,随着数字化转型的加速推进,企业对于高效率、灵活性和可定制性的软件开发需求不断增长。传统的软件开发过程通常需要耗费大量的时间和资源,而低代码开发平台的出现为企业提供了一种更加快速和灵活的解决方案。在低代码开发平台中&#…

【QT+QGIS跨平台编译】之五十九:【QGIS_CORE跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件四、宽字节与多字节问题五、字符转换处理一、字符串错误 常量中有换行符错误: 也有const char * 到 LPCWSTR 转换的错误 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src…

Vue3+springboot实现简单登录demo

Vue3从0搭建脚手架步骤【默认已安装node.js】 前置条件:默认已安装node.js、yarn 第一步:创建项目 选择任意一个空白文件夹如下: cmd进入该文件夹下的命令窗口模式,然后输入指令创建vue项目:vue create my-project …

vue3中实现elementPlus表格选中行的上移下移

先看效果&#xff1a; 实现步骤&#xff1a; 1、给el-table添加current-change事件、高亮属性及ref属性 2、给上移下移按钮添加事件 // 定义当前选中的行参数 const currentRow ref<any>(null); // 定义表格的ref const singleTableRef ref(); // 行选中事件 const ha…

【机器学习:Recommendation System】推荐系统

推荐系统&#xff08;或推荐系统&#xff09;是一类机器学习&#xff0c;它使用数据来帮助预测、缩小范围并在呈指数级增长的选项中找到人们正在寻找的内容。 【机器学习&#xff1a;Recommendation System】推荐系统 什么是推荐系统&#xff1f;用例和应用电子商务与零售&…