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-文件数据源-分区数据的分配-案例分析​​​​​​​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android TextView 实现富文本显示

android TextView 实现富文本显示,实现抖音直播间公屏消息案例 使用: val tvContent: TextView helper.getView(R.id.tvContent)//自己根据UI业务要求,可以控制 图标显示 大小val levelLabel MyImgLabel( bitmap 自己业务上的bitmap )va…

第零章_计算机导论

0.1 计算机:辅助人脑的好工具 所谓的计算机就是一种计算器,而计算器其实是:『接受用户输入指令与数据,经由中央处理器的数学与逻辑单元运算处理后,以产生或储存成有用的信息』。因此,只要有输入设备(不管是键盘还是触摸…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度,第一个值设置宽度,第二个值设置高度,如果只给出一个值,第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…

CSS技巧:实现两个div在同一行显示的方法

css如何让两个div在同一行显示 - web开发 - 亿速云 在Web开发中,经常遇到需要将多个元素水平排列在同一行的情况。其中一个常见的需求是将两个div元素放置在同一行上,使它们并排显示。在本文中,我们将介绍几种实现这一效果的CSS方法。 1. 使…

day06_菜单管理(查询菜单,添加菜单,添加子菜单,修改菜单,删除菜单,角色分配菜单,查询菜单,保存菜单,动态菜单)

文章目录 1 菜单管理1.1 表结构介绍1.2 查询菜单1.2.1 需求说明1.2.2 页面制作1.2.3 后端接口SysMenuSysMenuControllerSysMenuServiceMenuHelperSysMenuMapperSysMenuMapper.xml 1.2.4 前端对接sysMenu.jssysMenu.vue 1.3 添加菜单1.3.1 需求说明1.3.3 页面制作1.3.3 后端接口…

腾讯云安装MYSQL远程连接不上解决方案

推荐安装步骤博客,写的很详细,如果不会安装的话,可以根据安装步骤一直走。 Windows10下超详细Mysql安装_win10安装mysql-CSDN博客 修改 my.cnf或者my.ini 找到里面bind-address将bind-address 127.0.0.1设置成bind-address 0.0.0.0&#x…

AI英语学习助手-帮助建立词库和句子-极简安装(python基于Django和 OpenAI GPT API的网站程序)

AI英语学习助手-帮助建立词库和句子-极简安装(python基于Django和 OpenAI GPT API的网站程序) 学了很久的英语,但是发现还是被单词困住了,天天查句子查单词太麻烦,现在有了Chat GPT,能够很好得帮助学习英语…

CSP-202109-2-非零段划分

CSP-202109-2-非零段划分 【70分思路-暴力枚举】 这段代码的目的是在给定一个由自然数(非负整数)组成的数组后,通过选择一个适当的正整数 p,将数组中所有小于 p 的数变为 0,从而使得数组中非零段的数量达到最大。这里…

使用 gma 绘制隋唐洛阳城

背景 最近河南文旅大伙,给家乡带了一波热度,想想又是王子又是公主,着实羡慕。出门在外,还是对加很有感觉得,不过很遗憾,本人不能为家乡做出贡献,只能使用这种小伎俩,稍稍展示&#…

【网络编程】理解客户端和服务器并使用Java提供的api实现回显服务器

目录 一、网络编程 二、客户端和服务器 三、客户端和服务器的交互模式 四、TCP 和 UDP UDP socket api 的使用 1、DatagramSoket 2、DatagramPacket TCP socket api 的使用 1、ServerSocket 2、Socket 一、网络编程 本质上就是学习传输层给应用层提供的 api&#x…

ARM简介

ARM:ARM是Advanced RISC Machine的缩写,意为高级精简指令集计算机。 英国ARM公司,2016年被软银创始人孙正义斥资320亿美元收购了。现在是软银旗下的芯片设计公司,总部位于英国剑桥,专注于设计芯片,卖芯片生…

揭秘:头部房企如何借助数据分析实现稳健发展?

房地产行业是我国国民经济中的重要支柱产业之一,在房地产市场供求关系发生重大变化的当下,房企面临多重挑战。Kyligence 服务的这家头部房企把发展的重点聚焦于内生,关注内生的转化率、接管的效率以及内生毛利率的提升,引入 Kylig…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展,现在人们获取最新资讯的主要途径来源于网上新闻,当下的网上信息宣传门户网站的发展十分的迅速。而保险产品,作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

面试笔记系列七之多线程+分布式系统基础知识点整理及常见面试题

目录 多线程 介绍一下线程的生命周期及状态? 线程的sleep、wait、join、yield如何使用? sleep与yield方法的区别在于, 进程调度算法 创建线程有哪些方式? 什么是守护线程? ThreadLocal的原理是什么,…

当大语言模型遇到AI绘画-google gemma与stable diffusion webui融合方法-矿卡40hx的AI一体机

你有想过建一台主机,又能AI聊天又能AI绘画,还可以直接把聊天内容直接画出来的机器吗? 当Google最新的大语言模型Gemma碰到stable diffusion webui会怎么样? 首先我们安装stable diffusion webui(automatic1111开源项目&#xff…

微信小程序构建npm失败解决方式

安装完所需要的依赖后,在微信开发者工具菜单栏中选择:“工具” -> “构建 npm”,但是失败。 解决方法:修改 project.config.json 开发者工具创建的项目,miniprogramRoot 默认为 miniprogram,package.js…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本(这里没有通过客户端管理工具去创建达梦数据库的模式,当然也可以通过图形化界…

WordPress通过宝塔面板的入门安装教程【保姆级】

WordPress安装教程【保姆级】【宝塔面板】 前言一:安装环境二:提前准备三:域名解析四:开始安装五:安装成功 前言 此教程适合新手,即使不懂代码,也可轻松安装wordpress 一:安装环…

视频在线转换,四种方法任你选!(建议收藏)

在当今的数字时代,视频已经成为人们日常生活中不可或缺的一部分。我们通过视频分享知识、表达创造力、观看娱乐节目,甚至参与远程学习和工作。然而,随着视频格式的多样化和设备的激增,我们经常会遇到一个常见的问题:视…

Linux(CentOS)学习

一、认识Linux 1、如何修改Linux时区 2、配置固定IP 3、重启网络服务 3、小技巧快捷键 4、环境变量设置 5、Linux文件的上传和下载 6、压缩和解压 二、基础命令 1、目录命令 (1、)查看目录内容(ls) 1、ls //查看当前目录内容 2、- a //显示隐藏内容 3…