在深入了解Apache Spark的RDD(弹性分布式数据集)之前,强烈建议阅读这篇文章,以获得Apache Spark工作原理的概览。
RDD(Resilient Distributed Dataset)是Apache Spark中的核心数据结构,自其诞生以来就构成了其基础。它代表了一种不可变的、容错的元素集合,可以在集群的多台机器上并行处理。RDD作为Spark中的基础构建块,新的数据结构如数据集和数据框架都是基于RDD构建的。
RDD为分布式计算而设计,将数据集划分为逻辑分区。这种逻辑分区使得通过在集群的不同节点上分布不同的数据段来实现高效和可扩展的处理。RDD可以从各种数据源创建,例如Hadoop分布式文件系统(HDFS)或本地文件系统,也可以通过转换从现有的RDD派生。
作为Spark中的核心抽象,RDD包含广泛的操作,包括转换(如map、filter和reduce)和动作(如count和collect)。这些操作允许用户在RDD上执行复杂的数据操作和计算。RDD通过跟踪重建丢失分区所需的血统信息来提供容错性。
Spark RDD具有以下特性:
RDD的一个重要事实是,它是不可变的。不能更改RDD的状态。如果想更改RDD的状态,需要创建现有RDD的副本并执行所需的操作。因此,任何时候都可以检索所需的RDD。
存储在磁盘上的数据需要花费很多时间来加载和处理。Spark支持内存计算,将数据存储在RAM而不是磁盘上。因此,大大提高了Spark的计算能力。
RDD中的转换使用延迟操作实现。在延迟评估中,结果不会立即计算。只有在触发动作时才会生成结果。因此,提高了程序的性能。
如前所述,一旦在现有RDD上执行任何操作,就会创建该RDD的新副本,并在新创建的RDD上执行操作。因此,任何丢失的数据都可以轻松恢复和重新创建。这一特性使Spark RDD具有容错性。
RDD中的数据项通常很大。这些数据被分区并发送到不同的节点进行分布式计算。
RDD生成的中间结果被存储,以使计算变得容易。它使过程优化。
Spark RDD提供两种细粒度操作,即粗粒度和细粒度。粗粒度操作允许转换整个数据集,而细粒度操作允许转换数据集中的单个元素。
在Apache Spark中,可以通过以下三种方式创建RDD:
在RDD中可以应用两种操作。一种是转换,另一种是动作。
转换是对RDD执行的过程,以获得结果,结果也是一个RDD。例如,应用filter()、union()、map()、flatMap()、distinct()、reduceByKey()、mapPartitions()、sortBy()等函数,将创建另一个结果RDD。在创建RDD时应用延迟评估。
动作将结果返回给驱动程序或写入存储,并启动计算。一些例子包括count()、first()、collect()、take()、countByKey()、collectAsMap()和reduce()。转换总是返回RDD,而动作返回其他数据类型。
让实际看一下一些RDD操作。要实践Apache Spark,需要安装Cloudera虚拟环境。可以在这里找到安装Cloudera VM的详细指南。
val rdd1 = sc.parallelize(List(23, 45, 67, 86, 78, 27, 82, 45, 67, 86))
这里,sc表示SparkContext,每个元素都被复制以形成RDD。
rdd1.collect
使用collect操作可以读取RDD生成的结果。
rdd1.count
count动作用于获取特定RDD中存在的元素总数。
rdd1.distinct.collect
distinct是一种转换,用于获取RDD中的唯一元素。
rdd1.filter(x => x < 50).collect
filter转换通过根据给定条件选择元素来创建新数据集。
rdd1.sortBy(x => x, true).collect
rdd1.sortBy(x => x, false).collect
sortBy操作用于在条件为真时按升序排列元素,在条件为假时按降序排列元素。
rdd1.reduce((x, y) => x + y)
reduce动作用于根据给定公式汇总RDD。
rdd1.map(x => x + 1).collect
map转换根据给定条件处理RDD中的每个元素,并创建一个新的RDD。
val rdd2 = sc.parallelize(List(25,73, 97, 78, 27, 82))
联合操作结合了给定两个RDD的所有元素。交集操作通过取给定RDDs中的公共元素来形成一个新的RDD。笛卡尔操作用于创建所需RDDs的笛卡尔积。
rdd1.union(rdd2).collect
rdd1.intersection(rdd2).collect
rdd1.cartesian(rdd2).collect
rdd1.first()
first是一种动作,总是返回RDD的第一个元素。
rdd1.take(5)
take动作返回RDD中的前n个元素。
现在,可能已经注意到,在进行任何转换时,只创建了现有RDD的副本,最初创建的RDD没有改变。这是因为RDD是不可变的。这一特性使RDD具有容错性,丢失的数据也可以轻松恢复。
当想要应用低级转换和动作时,首选RDD。它为提供了更大的数据控制权。当数据高度非结构化,如媒体或文本流时,可以使用RDD。当想要添加函数式编程构造而不是领域特定表达式时,可以使用RDD。在不应用模式的情况下,可以使用RDD。
A. RDD(Resilient Distributed Dataset)在Apache Spark中的目的是提供一种容错和并行化的数据结构,用于分布式计算。RDD允许通过将数据集划分为逻辑分区,并在这些分区上并行执行转换和动作,实现大规模数据的高效处理,实现高性能和可扩展的数据处理。