Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >分布式弹性数据集(上)

分布式弹性数据集(上)

作者头像
kk大数据
发布于 2019-08-14 07:34:39
发布于 2019-08-14 07:34:39
64200
代码可运行
举报
文章被收录于专栏:kk大数据kk大数据
运行总次数:0
代码可运行

这是kk第003篇文章

本文共1428字,阅读约9分钟

一秒钟看完全文:RDD表示已被分区、不可变的,并能够被并行操作的数据集合。

背景

传统的 MapReduce 框架之所以运行速度缓慢,很重要的原因就是有向无环图的中间计算结果需要写入硬盘这样的稳定介质中来防止运行结果丢失。

而每次调用中间计算结果都需要进行一次硬盘的读取,反复对硬盘进行读写操作以及潜在的数据复制和序列号操作大大提高了计算的延迟。

因此,很多研究人员试图提出一个新的分布式存储方案,不仅保持之前系统的稳定、错误恢复和扩展性,还要尽可能减少磁盘 I/O 操作。

一个可行的设想就是在分布式内存中,存储中间计算结果,因为对内存的读写操作速度远快于硬盘。

而 RDD 就是一个基于分布式内存的数据抽象,它不仅仅支持基于工作集的应用,同时具有数据流模型的特点。

RDD 具有以下特性:分区、不可变和并行操作

分区

顾名思义,分区代表同一个 RDD 包含的数据被存储在系统的不同节点中,这也是它可以被并行处理的前提。

逻辑上,我们可以认为 RDD 是一个大的数组。数组中的每个元素代表一个分区 ( Partition)。

在物理存储中,每个分区指向一个存放在内存或者硬盘中的数据块(Block),而这些数据块是独立的,它们可以被存放在系统中的不同节点。

所以,RDD 只是抽象意义的数据集合,分区内部并不会存储具体的数据。下图就很好的展示了 RDD 的分区逻辑结构。

RDD 中的每个分区存有它在该 RDD 中的 index 。通过 RDD 的 ID 和分区的 index 可以唯一确定对应数据块的编号,从而通过底层存储层的接口中提取到数据进行处理。

在集群中,各个节点上的数据块会尽可能地存放在内存中,只有当内存没有空间时才会存入硬盘。这样可以最大化地减少硬盘读写的开销。

虽然 RDD 内部存储的数据是只读的,但是,我们可以去修改(例如通过repartition 转换操作),并行计算单元的划分结构,也就是分区的数量。

不可变性

不可变性代表每一个 RDD 都是只读的,它所包含的分区信息不可以被改变。既然已有的 RDD 不可以被改变,我们只可以对现有的 RDD 进行转换操作,得到新的 RDD 作为中间计算的结果。

从某种程度上来讲,RDD 与函数式编程的 Collection 很相似。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
val conf = new SparkConf().setMaster("local[2]").setAppName("TextTest")
val sc = new SparkContext(conf)
val lines =  sc.textFile("d://1.txt")
val lineLengths = lines.map(m => m.length)
val length = lineLengths.reduce(_+_)
print(length)

在上述的简单例子中,首先读入文本文件 data.txt,创建了第一个 RDD lines,它的每一个元素时一行文本。然后调用 map 函数去映射产生第二个 RDD lineLengths,每个元素代表每一行简单文本的字数。最后调用 reduce 函数去得到第三个 RDD totalLength,它只有一个元素,代表整个文本的总字数。

那么这样会带来什么好处呢?

显然,对于代表中间结果的 RDD,我们需要记录它是通过哪个 RDD 进行转换操作得来,即依赖关系,而不用立刻去具体存储计算出的数据本身。

这样作有助于提升 spark 的计算效率,并且使错误恢复更加容易。

试想,在 一个有N步的计算模型中,如果记载第 N 步输出 RDD 的节点发生故障,数据丢失,我们可以从第 N-1 步的 RDD 出发,再次计算,从无需重复整个 N 步的计算过程。这样的容错特性也是 RDD 为什么是一个 “弹性” 的数据集的原因之一。

并行操作

由于单个 RDD 的分区特性,使得它天然支持并行操作,即不同节点上的数据可以被分别处理,然后产生一个新的 RDD。

环境不会改变,解决之道在于改变自己。

与你共勉

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

本文分享自 KK架构 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark基础全解析
第一,MapReduce模型的抽象层次低,大量的底层逻辑都需要开发者手工完成。 第二,只提供Map和Reduce两个操作。 举个例子,两个数据集的Join是很基本而且常用的功能,但是在MapReduce的世界中,需要对这两个数据集 做一次Map和Reduce才能得到结果。 第三,在Hadoop中,每一个Job的计算结果都会存储在HDFS文件存储系统中,所以每一步计算都要进行硬 盘的读取和写入,大大增加了系统的延迟。 第四,只支持批数据处理,欠缺对流数据处理的支持。
luozhiyun
2020/03/19
1.4K0
3.2 弹性分布式数据集
3.2 弹性分布式数据集 本节简单介绍RDD,并介绍RDD与分布式共享内存的异同。 3.2.1 RDD简介 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilient distributed dataset,RDD),它是逻辑集中的实体,在集群中的多台机器上进行了数据分区。通过对多台机器上不同RDD分区的控制,就能够减少机器之间的数据重排(data shuffling)。Spark提供了“partitionBy”运算符,能够通过集群中多台机器之间对原始RDD进行数据再分配来创建一个
Albert陈凯
2018/04/08
1.2K0
弹性式数据集RDDs
RDD 全称为 Resilient Distributed Datasets,是 Spark 最基本的数据抽象,它是只读的、分区记录的集合,支持并行操作,可以由外部数据集或其他 RDD 转换而来,它具有以下特性:
每天进步一点点
2022/07/27
5470
弹性式数据集RDDs
RDD操作—— 行动(Action)操作
行动操作是真正触发计算的地方。Spark程序执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。
羊羽shine
2019/08/20
1.6K0
Spark RDD 分布式弹性数据集
rdd是一个粗粒度的数据生成方式和流转迭代计算方式的描述。它可以通过稳定的存储器或者从其他RDD生成,它并不需要急着进行转换,只需要在特定的rdd进行一次性的数据的迭代流转。rdd记录着自己的依赖关系,以防在数据丢失时可以通过“血缘”关系再次生成数据。用户也可以自己选择在经常重用的rdd进行数据落地,放置丢失后重做。
Tim在路上
2022/03/23
4420
Spark RDD 分布式弹性数据集
1.4 弹性分布式数据集
Spark大数据分析实战 1.4 弹性分布式数据集 本节将介绍弹性分布式数据集RDD。Spark是一个分布式计算框架,而RDD是其对分布式内存数据的抽象,可以认为RDD就是Spark分布式算法的数据结构,而RDD之上的操作是Spark分布式算法的核心原语,由数据结构和原语设计上层算法。Spark最终会将算法(RDD上的一连串操作)翻译为DAG形式的工作流进行调度,并进行分布式任务的分发。 1.4.1 RDD简介 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(Resilient Dist
Albert陈凯
2018/04/08
8790
BigData |述说Apache Spark
Spark是一个Apache项目,被标榜为"Lightning-Fast"的大数据处理工具,它的开源社区也是非常活跃,与Hadoop相比,其在内存中运行的速度可以提升100倍。Apache Spark在Java、Scale、Python和R语言中提供了高级API,还支持一组丰富的高级工具,如Spark SQL(结构化数据处理)、MLlib(机器学习)、GraphX(图计算)、SparkR(统计分析)以及Spark Streaming(处理实时数据)。
Sam Gor
2019/08/21
8580
RDD:创建的几种方式(scala和java)[通俗易懂]
每一个spark应用程序都包含一个驱动程序(driver program ),他会运行用户的main函数,并在集群上执行各种并行操作(parallel operations)
全栈程序员站长
2022/06/29
1.1K0
RDD:创建的几种方式(scala和java)[通俗易懂]
Pyspark学习笔记(四)弹性分布式数据集 RDD(上)
RDD(弹性分布式数据集) 是 PySpark 的基本构建块,它是容错、不可变的 分布式对象集合。
TeeyoHuang
2021/06/29
4.5K0
Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN
本文介绍了 Apache Spark 的 RDD 程序设计指南,从 RDD 的基本概念、创建与操作、缓存与存储、性能优化等方面进行了详细阐述,并提供了丰富的实例和代码以帮助读者更好地理解和掌握 RDD 的使用方法。
片刻
2018/01/05
1.9K0
Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN
Spark初识-弹性分布式数据集RDD
RDD 是 Spark 提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。
栗筝i
2022/12/01
4820
Spark初识-弹性分布式数据集RDD
Spark RDD编程指南
在高层次上,每个 Spark 应用程序都包含一个驱动程序,该驱动程序运行用户的主要功能并在集群上执行各种并行操作。 Spark 提供的主要抽象是弹性分布式数据集 (RDD),它是跨集群节点分区的元素集合,可以并行操作。 RDD 是通过从 Hadoop 文件系统(或任何其他 Hadoop 支持的文件系统)中的文件或驱动程序中现有的 Scala 集合开始并对其进行转换来创建的。 用户还可以要求 Spark 将 RDD 持久化到内存中,以便在并行操作中有效地重用它。 最后,RDD 会自动从节点故障中恢复。
从大数据到人工智能
2022/04/17
1.8K0
Spark RDD编程指南
【Spark研究】Spark编程指南(Python版)
Spark编程指南 译者说在前面:最近在学习Spark相关的知识,在网上没有找到比较详细的中文教程,只找到了官网的教程。出于自己学习同时也造福其他初学者的目的,把这篇指南翻译成了中文,笔者水平有限,文章中难免有许多谬误,请高手不吝赐教。 本文翻译自Spark Programming Guide,由于笔者比较喜欢Python,在日常中使用也比较多,所以只翻译了Python部分,不过Java和Scala大同小异。 概述 从高层次上来看,每一个Spark应用都包含一个驱动程序,用于执行用户的main函数以及在集群
陆勤_数据人网
2018/02/27
5.5K0
Spark:一个高效的分布式计算系统
马哥linux运维 | 最专业的linux培训机构 ---- 概述 什么是Spark Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。其架构如下图所示:
小小科
2018/05/02
2.4K0
Spark:一个高效的分布式计算系统
4.3 RDD操作
4.3 RDD操作 RDD提供了一个抽象的分布式数据架构,我们不必担心底层数据的分布式特性,而应用逻辑可以表达为一系列转换处理。 通常应用逻辑是以一系列转换(Transformation)和执行(Action)来表达的,前者在RDD之间指定处理的相互依赖关系,后者指定输出的形式。 其中: □转换:是指该操作从已经存在的数据集上创建一个新的数据集,是数据集的逻辑操作,并没有真正计算。 □执行:是指该方法提交一个与前一个Action之间的所有Transformation组成的Job进行计算,Spark会根据A
Albert陈凯
2018/04/08
1K0
Spark中的RDD是什么?请解释其概念和特点。
Spark中的RDD(弹性分布式数据集)是一种分布式的、可并行操作的数据结构。它是Spark的核心抽象,用于表示分布式计算过程中的数据集合。
GeekLiHua
2025/01/21
1870
PySpark|RDD编程基础
RDD是Spark中最基本的数据抽象,其实就是分布式的元素集合。RDD有三个基本的特性:分区、不可变、并行操作。
数据山谷
2020/11/06
8800
深入理解Spark 2.1 Core (一):RDD的原理与源码分析
该论文来自Berkeley实验室,英文标题为:Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing。下面的翻译,我是基于博文http://shiyanjun.cn/archives/744.html翻译基础上进行优化、修改、补充注释和源码分析。如果翻译措辞或逻辑有误,欢迎批评指正。
小爷毛毛_卓寿杰
2019/02/13
9100
深入理解Spark 2.1 Core (一):RDD的原理与源码分析
分布式执行代码的认知纠正
Spark是一个分布式计算系统/组件/平台,这是都知道的,其用Scala实现Spark任务也是最原生的,但万万不能认为只要是在Spark环境下执行的Scala代码都是分布式执行的,这是大错特错的,一开始一直有错误的认识,但现在想想,如果拿Java和Hadoop的关系来作对比,其就很容易理解了。
ZONGLYN
2019/08/08
6610
Pyspark学习笔记(四)弹性分布式数据集 RDD(下)
本篇主要讲述了如何在执行pyspark任务时候缓存或者共享变量,以达到节约资源、计算量、时间等目的
TeeyoHuang
2021/08/18
2.9K0
Pyspark学习笔记(四)弹性分布式数据集 RDD(下)
相关推荐
Spark基础全解析
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档