前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >spark——spark中常说RDD,究竟RDD是什么?

spark——spark中常说RDD,究竟RDD是什么?

作者头像
TechFlow-承志
发布于 2020-04-14 09:07:22
发布于 2020-04-14 09:07:22
70700
代码可运行
举报
文章被收录于专栏:TechFlowTechFlow
运行总次数:0
代码可运行

今天是spark专题第二篇文章,我们来看spark非常重要的一个概念——RDD。

在上一讲当中我们在本地安装好了spark,虽然我们只有local一个集群,但是仍然不妨碍我们进行实验。spark最大的特点就是无论集群的资源如何,进行计算的代码都是一样的,spark会自动为我们做分布式调度工作

RDD概念

介绍spark离不开RDD,RDD是其中很重要的一个部分。但是很多初学者往往都不清楚RDD究竟是什么,我自己也是一样,我在系统学习spark之前代码写了一堆,但是对于RDD等概念仍然云里雾里。

RDD的英文全名是Resilient Distributed Dataset,我把英文写出来就清楚了很多。即使第一个单词不认识,至少也可以知道它是一个分布式的数据集。第一个单词是弹性的意思,所以直译就是弹性分布式数据集。虽然我们还是不够清楚,但是已经比只知道RDD这个概念清楚多了,

RDD是一个不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。

很多资料里只有这么一句粗浅的解释,看起来说了很多,但是我们都get不到。细想有很多疑问,最后我在大神的博客里找到了详细的解释,这位大神翻了spark的源码,找到了其中RDD的定义,一个RDD当中包含以下内容:

  • A list of partitions
  • A function for computing each split
  • A list of dependencies on other RDDs
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
  • Optionally, a list of preferred locations to compute each split on (e.g. block locations for an HDFS file)

我们一条一条来看:

  1. 它是一组分区,分区是spark中数据集的最小单位。也就是说spark当中数据是以分区为单位存储的,不同的分区被存储在不同的节点上。这也是分布式计算的基础。
  2. 一个应用在各个分区上的计算任务。在spark当中数据和执行的操作是分开的,并且spark基于懒计算的机制,也就是在真正触发计算的行动操作出现之前,spark会存储起来对哪些数据执行哪些计算。数据和计算之间的映射关系就存储在RDD中。
  3. RDD之间的依赖关系,RDD之间存在转化关系,一个RDD可以通过转化操作转化成其他RDD,这些转化操作都会被记录下来。当部分数据丢失的时候,spark可以通过记录的依赖关系重新计算丢失部分的数据,而不是重新计算所有数据。
  4. 一个分区的方法,也就是计算分区的函数。spark当中支持基于hash的hash分区方法和基于范围的range分区方法。
  5. 一个列表,存储的是存储每个分区的优先存储的位置。

通过以上五点,我们可以看出spark一个重要的理念。即移动数据不如移动计算,也就是说在spark运行调度的时候,会倾向于将计算分发到节点,而不是将节点的数据搜集起来计算。RDD正是基于这一理念而生的,它做的也正是这样的事情。

创建RDD

spark中提供了两种方式来创建RDD,一种是读取外部的数据集,另一种是将一个已经存储在内存当中的集合进行并行化

我们一个一个来看,最简单的方式当然是并行化,因为这不需要外部的数据集,可以很轻易地做到。

在此之前,我们先来看一下SparkContext的概念,SparkContext是整个spark的入口,相当于程序的main函数。在我们启动spark的时候,spark已经为我们创建好了一个SparkContext的实例,命名为sc,我们可以直接访问到。

我们要创建RDD也需要基于sc进行,比如下面我要创建一个有字符串构成的RDD:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
texts = sc.parallelize(['now test', 'spark rdd'])

返回的texts就是一个RDD:

除了parallelize之外呢,我们还可以从外部数据生成RDD,比如我想从一个文件读入,可以使用sc当中的textFile方法获取:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
text = sc.textFile('/path/path/data.txt')

一般来说,除了本地调试我们很少会用parallelize进行创建RDD,因为这需要我们先把数据读取在内存。由于内存的限制,使得我们很难将spark的能力发挥出来。

转化操作和行动操作

刚才我们在介绍RDD的时候其实提到过,RDD支持两种操作,一种叫做转化操作(transformation)一种叫做行动操作(action)。

顾名思义,执行转化操作的时候,spark会将一个RDD转化成另一个RDD。RDD中会将我们这次转化的内容记录下来,但是不会进行运算。所以我们得到的仍然是一个RDD而不是执行的结果。

比如我们创建了texts的RDD之后,我们想要对其中的内容进行过滤,只保留长度超过8的,我们可以用filter进行转化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
textAfterFilter = texts.filter(lambda x: len(x) > 8)

我们调用之后得到的也是一个RDD,就像我们刚才说的一样,由于filter是一个转化操作,所以spark只会记录下它的内容,并不会真正执行。

转化操作可以操作任意数量的RDD,比如如果我执行如下操作,会一共得到4个RDD:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
inputRDD = sc.textFile('path/path/log.txt')
lengthRDD = inputRDD.filter(lambda x: len(x) > 10)
errorRDD = inputRDD.filter(lambda x: 'error' in x)
unionRDD = errorRDD.union(lengthRDD)

最后的union会将两个RDD的结果组合在一起,如果我们执行完上述代码之后,spark会记录下这些RDD的依赖信息,我们把这个依赖信息画出来,就成了一张依赖图:

无论我们执行多少次转化操作,spark都不会真正执行其中的操作,只有当我们执行行动操作时,记录下来的转化操作才会真正投入运算。像是first(),take(),count()等都是行动操作,这时候spark就会给我们返回计算结果了。

其中first的用处是返回第一个结果,take需要传入一个参数,指定返回的结果条数,count则是计算结果的数量。和我们预期的一样,当我们执行了这些操作之后,spark为我们返回了结果。

本文着重讲的是RDD的概念,我们下篇文章还会着重对转化操作和行动操作进行深入解读。感兴趣的同学不妨期待一下吧~

今天的文章就是这些,如果觉得有所收获,请顺手点个在看或者转发吧,你们的举手之劳对我来说很重要。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nodejs写bash脚本终极方案!
最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:
IT大咖说
2021/07/19
4K0
nodejs 写 bash 脚本终极方案!
最近在学习bash脚本语法,但是如果对bash语法不是熟手的话,感觉非常容易出错,比如说:显示未定义的变量shell中变量没有定义,仍然是可以使用的,但是它的结果可能不是你所预期的。举个例子:
ConardLi
2021/09/08
2.6K0
nodejs 写 bash 脚本终极方案!
工具库 zx - 使用 JavaScript 更便捷地编写 shell 脚本
在编写一些复杂脚本做处理的时候,比起传统 shell 脚本,由于对 JS 更加熟悉,我更倾向于使用 JS 来编写。但一旦涉及到文件相关操作,几条 shell 指令肯定是更加方便的,但 Node 本身的 child_process 又差了那么点意思,手感并不是很好。
Shiroka
2022/04/28
9310
工具库 zx - 使用 JavaScript 更便捷地编写 shell 脚本
使用 JavaScript 编写 Shell 脚本
作为程序员,在平时的开发中肯定少不了一些命令行操作了。当然,简单的命令大家都是可以拿捏的,但是涉及到一些逻辑的时候还是比较头疼的。
ConardLi
2023/01/09
1.2K0
yyds,这可能是你第一个自定义的脚手架
哈喽大咖好,我是Johnny,这次给大家重新缕一缕如何用typescript配合周边插件做一个易用的脚手架管理工具。
南山种子外卖跑手
2022/09/09
8740
yyds,这可能是你第一个自定义的脚手架
靓仔快来!!用typescript带你搭建一个自己的脚手架
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
南山种子外卖跑手
2022/06/12
1.7K0
靓仔快来!!用typescript带你搭建一个自己的脚手架
(满满干货)从零实现命令行脚手架工具——自动初始化项目工程以及发布到NPM
这篇文章将带你从零实现一款命令行脚手架工具用于初始化项目以及如何发布到NPM。首先,我们所熟知的VueCLI就是采用命令行工具快速生成项目工程目录的,这样,我们每次开发项目前只需要在命令行中输入命令,然后就可以快速生成项目工程,非常方便。那么,这么方便的命令行工具是怎么实现的呢?下面我们就开始进入实战环节。
Vam的金豆之路
2021/12/01
6110
从0开始搭建优雅的前端脚手架工具
在日常开发中,我们经常会使用到各种脚手架工具(cli): vue-create-app,ng 包括 npm。它们极大简化了开发人员对于项目结构和文件创建的工作,让我们可以把精力专心在业务实现上。 对于某些项目而言 cli还可以封装一些脚本,用来处理项目中的一些特殊场景。
用户8738532
2022/12/05
6430
VueUse scripts,他们都模仿过的脚本
今天我们就“单纯”地从 VueUse scripts 入手,从中探索我们后续也许会用上的第三方包库。
码农小余
2022/06/16
1.2K0
VueUse scripts,他们都模仿过的脚本
开发前端 CLI 脚手架思路解析
在实际的开发过程中,我们经常用别人开发的脚手架,以节约搭建项目的时间。但是,当 npm 没有自己中意的脚手架时,我们不得不自己动手,此时学会开发前端 CLI 脚手架的技能就显得非常重要。搭建一个符合大众化的脚手架能使自己在项目经验上加个分哦!
winty
2021/12/17
8020
开发前端 CLI 脚手架思路解析
Node.js 初入门?持续记录
教程:https://www.runoob.com/nodejs/nodejs-tutorial.html
房东的狗丶
2023/02/17
1.2K0
从零开始构建 vue3
2019年10月5日凌晨,Vue 的作者尤雨溪公布了 Vue3 的源代码。当然,它暂时还不是完整的 Vue3,而是 pre-alpha 版,只完成了一些核心功能。github 命名为 vue-next ,寓意下一代 vue 。在笔者发文前,已经有很多大佬陆续发布了一些解读 Vue3 源码的文章。但是,本文并不打算再增加一篇解读源码的文章,而是以项目参与者的视角,通过动手实践,一步步理解和搭建自己的 Vue3 项目。因此,为了达到最佳效果,建议读者,一边阅读本文,一边打开终端跟着一步步动手实践。你将掌握所有构建 Vue3 所必须的知识。
我是一条小青蛇
2019/10/23
1.6K0
从零开始构建 vue3
从零撸一个CLI命令行脚手架工具
我想大部分同学肯定都是这样回答的:现在社区都有开箱即用的脚手架,像vue-cli、create-react-app这种,我们直接用脚手架来创建项目就可以了啊。
前端森林
2021/02/03
1.1K0
从零撸一个CLI命令行脚手架工具
如何开发一个极简的前端脚手架
功能上,要满足登录,权限管理,菜单配置,用户管理,字典管理,角色管理等后台管理系统的常规功能,
虎妞先生
2023/10/16
3920
如何开发一个极简的前端脚手架
尤大是如何发布vuejs的,学完可以应用到项目
1.源码地址:https://github1s.com/vuejs/vue-next/blob/HEAD/scripts/release.js
童欧巴
2021/08/20
5970
尤大是如何发布vuejs的,学完可以应用到项目
能用js实现的最终用js实现,Shell脚本也不例外
今天来讨论一个牛逼的项目 ——zx ,1个月增长15000 star, 成为了2021年度明星项目排行榜第一。
秋风的笔记
2022/01/18
3.4K0
能用js实现的最终用js实现,Shell脚本也不例外
前端CLI脚手架思路解析并从0到1搭建
在实际的开发过程中,我们经常用别人开发的脚手架,以节约搭建项目的时间。但是,当npm没有自己中意的脚手架时,我们不得不自己动手,此时学会开发前端CLI脚手架的技能就显得非常重要。搭建一个符合大众化的脚手架能使自己在项目经验上加个分哦!
IT大咖说
2020/10/19
1.6K0
前端CLI脚手架思路解析并从0到1搭建
带你了解并实践monorepo和pnpm,绝对干货!熬夜总结!
简单来说就是,将多个项目或包文件放到一个git仓库来管理。 目前比较广泛应用的是yarn+lerna的方式实现monorepo的管理。 一个简单的monorepo的目录结构类似这样:
winty
2023/08/23
7.5K0
带你了解并实践monorepo和pnpm,绝对干货!熬夜总结!
node命令行工具之实现项目工程自动初始化的标准流程
可以看出,传统的初始化步骤,花费的时间并不少。而且,人工操作的情况下,总有改漏的情况出现。这个缺点有时很致命。 甚至有马大哈,没有更新项目仓库地址,导致提交代码到旧仓库,这就很尴尬了。。。 基于这些情况,编写命令行工具(CLI)的目的就很明确:
我是leon
2019/08/28
8000
node命令行工具之实现项目工程自动初始化的标准流程
Axios 功能扩展之 axios-retry 源码阅读笔记
通过对 axios-retry 这一周下载量 100w+ 的三方库来学习下其功能设计,工具库项目的发包策略,并借此抛砖引玉,以提升我们的编码设计能力!
小东同学
2022/07/29
1.5K0
Axios 功能扩展之 axios-retry 源码阅读笔记
推荐阅读
相关推荐
nodejs写bash脚本终极方案!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验