点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
- 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分区计算任务