赞
踩
上节我们完成了如下的内容:
RDD是Spark的基石,是实现Spark数据处理的核心现象。
RDD是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
RDD(Resilient Distributed Dataset)是Spark中的核心概念,它是一个容错、可以并行执行的分布式数据集。
它有如下的5个特征:
RDD一旦创建,就不能被修改。每次对RDD进行操作(例如过滤、映射等)都会产生一个新的RDD。这种不可变性简化了并行处理,因为无需担心多个计算节点间的数据竞争。
RDD的数据分布在多个节点上,这使得Spark能够处理大规模的数据集。RDD的每个分区都可以在不同的节点上独立处理。
RDD通过“血统”(Lineage)记录其生成方式。如果RDD的某些分区在计算过程中丢失,可以根据这些血统信息重新计算丢失的数据。通过这种方式,RDD能够在节点故障时自动恢复。
RDD的操作被分为两类:转换操作(Transformations) 和 行动操作(Actions)。转换操作是惰性求值的,即不会立即执行,而是等到遇到行动操作时才触发计算。这样做的好处是可以通过合并多个转换操作来优化计算过程,减少不必要的中间计算。
在Scala语言中,RDD是类型安全的,意味着你可以在编译时捕获类型错误,这对开发者来说非常有帮助。
RDD的每个分区可以独立进行处理,允许多线程或多节点并行执行,充分利用集群的计算资源。
可以将RDD缓存或持久化到内存或磁盘中,以便在多次使用时避免重复计算,从而提高性能。
RDD提供了丰富的API支持各种操作,包括map、filter、reduceByKey、groupBy、join等,能够满足大部分分布式数据处理的需求。
RDD逻辑上是分区的,每个分区的数据是抽象存在的,计算的时候通过一个compute函数得到每个分区的数据。如果RDD是通过己有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。
RDD是只读的,要想改变RDD中的数据,只能在现有的RDD基础上创建新的RDD。
一个RDD转换为另一个RDD,通过丰富的算子(map filter union join reduceByKey等等)实现,不再像MR那样写Map和Reduce了。
RDD的操作算子包括两类:
RDDs通过操作算子进行转换,转换得到的新RDD包含了从其他RDDs衍生出所必须得信息,RDDs之间维护着这种学院关系(lineage),也称为依赖。
可以控制存储级别(内存、磁盘等)来进行缓存
如果在应用程序中多次使用同一个RDD,可以将RDD缓存起来,该RDD只有在第一次计算的时候会根据血缘关系得到分区的数据,在后续其他地方用到该RDD的时候,会直接从缓存取而不用再根据血缘计算,加速后期的重用。
虽然RDD的血缘关系天然的可以实现容错,当RDD的某个分区失败或者丢失,可以通过血缘关系来进行重建。
但是对于长时间迭代型的应用来说,随着迭代的进行,RDDs之间的血缘关系会越来越长,一旦在后续迭代的过程中出错,则需要 通过非常长的血缘关系去重建,影响性能。
RDD支持CheckPoint将数据保存到持久化的存储中,这样就可以切断之前的血缘关系,因为CheckPoint后的RDD不需要知道它的父RDDs了,可以直接从CheckPoint拿到数据。
如果要使用Spark,就需要编写Driver程序,它被提交到集群运行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。