大数据-83 Spark 集群 RDD编程简介 RDD特点 Spark编程模型介绍

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(正在更新!)

章节内容

上节我们完成了如下的内容:

  • Hadoop 集群启动
  • Spark 集群启动
  • h121 h122 h123 节点启动
  • 集群启动测试 SparkShell

什么是RDD

RDD是Spark的基石,是实现Spark数据处理的核心现象。

RDD是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。

RDD(Resilient Distributed Dataset)是Spark中的核心概念,它是一个容错、可以并行执行的分布式数据集。

它有如下的5个特征:

  • 一个分区的列表
  • 一个计算函数compute,对每个分区进行计算
  • 对其他RDDs的依赖(宽依赖、窄依赖)列表
  • 对Key-Value RDDs来说,存在一个分区器(Partitioner)【可选】
  • 对每个分区由一个优先位置的列表【可选】

RDD 特点介绍

不可变性(Immutability)

RDD一旦创建,就不能被修改。每次对RDD进行操作(例如过滤、映射等)都会产生一个新的RDD。这种不可变性简化了并行处理,因为无需担心多个计算节点间的数据竞争。

分布式(Distributed)

RDD的数据分布在多个节点上,这使得Spark能够处理大规模的数据集。RDD的每个分区都可以在不同的节点上独立处理。

容错性(Fault Tolerance)

RDD通过"血统"(Lineage)记录其生成方式。如果RDD的某些分区在计算过程中丢失,可以根据这些血统信息重新计算丢失的数据。通过这种方式,RDD能够在节点故障时自动恢复。

惰性求值(Lazy Evaluation)

RDD的操作被分为两类:转换操作(Transformations) 和 行动操作(Actions)。转换操作是惰性求值的,即不会立即执行,而是等到遇到行动操作时才触发计算。这样做的好处是可以通过合并多个转换操作来优化计算过程,减少不必要的中间计算。

类型安全(Type Safety)

在Scala语言中,RDD是类型安全的,意味着你可以在编译时捕获类型错误,这对开发者来说非常有帮助。

并行操作(Parallel Operation)

RDD的每个分区可以独立进行处理,允许多线程或多节点并行执行,充分利用集群的计算资源。

缓存与持久化(Caching and Persistence)

可以将RDD缓存或持久化到内存或磁盘中,以便在多次使用时避免重复计算,从而提高性能。

丰富的API

RDD提供了丰富的API支持各种操作,包括map、filter、reduceByKey、groupBy、join等,能够满足大部分分布式数据处理的需求。

RDD的特点

分区

RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候通过一个compute函数得到每个分区的数据。如果RDD是通过己有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。

只读

RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。

一个RDD转换为另一个RDD,通过丰富的算子(map filter union join reduceByKey等等)实现,不再像MR那样写Map和Reduce了。

RDD的操作算子包括两类:

  • Transformation:用来对RDD进行转化,延迟执行(Lazy)
  • Action:用来出发RDD的计算,得到相关计算结果或者将RDD保存的文件系统中

依赖

RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生出所必须得信息,RDDs之间维护着这种学院关系(lineage),也称为依赖。

  • 窄依赖:RDDs之间的分区是一一对应的(1对1 或者 n对1)
  • 宽依赖:子RDD每个分区与父RDD的每个分区都有关,是多对多的关系

缓存

可以控制存储级别(内存、磁盘等)来进行缓存

如果在应用程序中多次使用同一个RDD,可以将RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存取而不用再根据血缘计算,加速后期的重用。

CheckPoint

虽然RDD的血缘关系天然的可以实现容错,当RDD的某个分区失败或者丢失,可以通过血缘关系来进行重建。

但是对于长时间迭代型的应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代的过程中出错,则需要 通过非常长的血缘关系去重建,影响性能。

RDD支持CheckPoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为CheckPoint后的RDD不需要知道它的父RDDs了,可以直接从CheckPoint拿到数据。

Spark编程模型

  • RDD表示数据对象
  • 通过对象上的方法调用来对RDD进行转换
  • 最终显示结果或者将结果输出到外部数据源
  • RDD转换算子称为Transformation是Lazy的(延迟执行)
  • 只有遇到 Action算子,才会执行RDD的转换操作

如果要使用Spark,就需要编写Driver程序,它被提交到集群运行。

  • Driver中定义了一个或多个RDD,并调用RDD上的各种算子
  • Worker则执行RDD分区计算任务
相关推荐
蓝胖的四次元口袋6 小时前
服务器网络与系统基础-面试题
服务器·网络
A hao6 小时前
高对比度在XR虚拟背景中的作用
大数据·图像处理·人工智能·xr·广告
Cx330❀7 小时前
【MySQL基础】一文吃透“表的约束”:从 Null/Default 到主外键的终极安全法则
linux·服务器·数据库·c++·mysql·安全
Java搬码工7 小时前
CompletableFuture 完整详解 + 全场景使用案例
java
许心月7 小时前
Java学习资料网站汇总
java
Haoxuekeji7 小时前
山东 AI 智能批改校园电子阅卷企业
大数据·人工智能·深度学习·安全·ai
c238567 小时前
第二篇:《测试指挥官:可视化单题自测框架(含 assert 实操)》
java·数据库·c++·算法·安全性测试
aduzhe7 小时前
关于lib文件格式(keil/unix)
服务器·unix
银河麒麟操作系统7 小时前
闸机高效稳跑,通勤提速升级!银河麒麟赋能北京轨交新基建
运维·服务器·安全·交通物流
帅次8 小时前
Kotlin 与 Java 互操作:混合工程里的平台类型与 API 边界
java·开发语言·kotlin·suspend·nullable