随着时间的推移,大数据分析已达到一个新的程度,反过来又改变了其运作模式和期望。今天的大数据分析不仅处理大量数据,而且还具有快速周转时间的既定目标。虽然Hadoop是大数据分析背后无与伦比的技术,但它在快速处理方面存在一些不足。但是,随着Spark的出现,数据处理速度便有了更大的期望。
当我们谈到Spark时,我们想到的第一个术语是弹性分布式数据集(RDD)或Spark RDD,它使数据处理更快。此外,这也是Spark的关键特性,它支持在计算期间对数据集进行逻辑分区。
在此文中,我们将讨论Spark RDD的技术方面,进一步了解Spark RDD的底层技术细节。除此之外,还将概述RDD在Spark中的使用。
Spark RDD及其特性
RDD定义为Resilient Distributed Dataset(弹性分布式数据集),其中每个术语都表示其特性。
- Resilient: 通过使用RDD谱系图(DAG)实现容错。因此,当节点发生故障时,可以进行重新计算。
- Distributed: Spark RDD的数据集驻留在多个节点中。
- Dataset: 您将使用的数据记录。
在Hadoop设计中,RDD是一个挑战。然而,使用Spark RDD解决方案似乎非常高效,这取决于它的惰性计算。Spark中的RDDs按需工作。因此,它节省了大量的数据处理时间和整个过程的效率。
Hadoop Map-reduce通过其特性克服了Spark RDD的许多缺点,这是Spark RDD流行的主要原因。
Spark RDD的核心特性
- 内存计算
- 惰性计算
- 容错
- 不可变性
- 分区
- 持久性
- 粗粒度操作
- 位置粘性
我们将在下一节中逐步讨论这些问题。
Spark RDD是一种表示分布在多个节点上的数据集的技术,可以并行操作。换句话说,Spark RDD是Apache Spark的主要容错抽象,也是Apache Spark的基本数据结构。
Spark中的RDD是一个不可变的分布式对象集合,它支持以下两种方法
- cache()
- persist()
Spark RDD的内存缓存技术对Spark RDD中的数据集进行逻辑分区。内存缓存的好处在于,如果数据不合适,它会将多余的数据发送到磁盘进行重新计算。这就是为什么它被称为弹性。因此,您可以在需要时在Spark中提取RDD。因此,它使整个数据处理更快。
Spark在数据处理方面比Hadoop快100倍。下面是使Apache Spark更快的因素!
Spark RDD支持的操作
Spark中的RDD支持两种类型的操作:
- Transformations
- Actions
Transformation
在transformation的情况下,Spark RDD从现有数据集创建一个新的数据集。要引用一个Spark RDD转换示例,我们可以说map是一个转换,它通过一个函数传递每个dataset元素。作为返回值,它发送表示结果的新RDD。
Scala:
val l = sc.textFile(“example.txt”)
val lLengths = l.map(s => s.length)
val totalLength = lLengths.reduce((a, b) => a + b)
如果以后想使用llength,可以使用persist()函数,如下所示:
lLengths. persist()
您可以从https://spark.apache.org/参考API文档以获得Spark RDD支持的转换的详细列表。
Spark RDD支持两种类型的转换:
- Narrow transformation
- Wide transformation
在Narrow transformation的情况下,输出RDD的父RDD与一个数据分区相关联。而在广泛的转换中,输出RDD是许多父RDD分区的结果。换句话说,这就是所谓的shuffle transformation。
所有Spark RDD转换都是惰性的,因为它们不会立即计算结果。相反,它们记住对一些基本数据集应用的转换,这些数据集引用了一些文件,如示例所示。当任何操作需要一个结果时,只有转换在Spark RDD中计算。这进而导致更快和更有效的数据处理。
每次对每个转换后的RDD运行操作时,都会在Spark RDD中进行重新计算。但是,使用persist方法Spark可以将元素保存在集群中,以便下次查询时更快地访问它。还支持在磁盘上持久存储Spark RDDs或跨多个节点进行复制。
Actions
在操作期间,RDD在对数据集执行计算之后,将一个值返回给驱动程序。例如,reduce是一个使用某个函数聚合所有RDD元素并将最终结果返回给主程序的操作
创建Spark RDD有以下三个过程。
- 使用并行集合
- 从外部数据集(即。其他外部存储系统,如共享文件系统、HBase或HDFS)
- 来自现有Apache Spark RDDs
接下来,我们将讨论这些方法中的每一种,以了解如何使用它们来创建Spark RDDs。
弹性分布式数据集(RDD)是Apache Spark的重要特性,这使得它非常重要。让我们了解Apache Spark在大数据行业中的重要性。
并行集合
您可以通过在Java、Scala或Python中现有的驱动程序集合上调用SparkContext接口的parallelize方法来创建并行集合。在本例中,复制的集合元素构成一个分布式数据集,可以并行操作。
Scala中并行化集合的Spark RDD例子:
将数字2到6保存为并行集合:
val collection = Array(2, 3, 4, 5,6)
val prData = spark.sparkContext.parallelize(collection)
在这里,创建的分布式数据集prData能够并行操作。因此,您可以调用prData。reduce()将数组中的元素相加。
并行化集合的一个关键参数是决定要将数据集分割成哪些分区号。在本例中,Spark为集群的各个分区运行单个任务。通常,对于集群中的单个CPU, 2-4个分区是理想的。不过Spark会根据集群自动设置分区的数量。但是,用户也可以通过将其作为并行化的第二个参数传递来手动设置它。
外部数据库
Apache Spark可以从任何Hadoop支持的文件存储创建分布式数据集,其中可能包括:
- Local file system
- HDFS
- Cassandra
- HBase
- Amazon S3
Spark支持类似的文件格式:
- Text files
- Sequence Files
- CSV
- JSON
- Any Hadoop Input Format
例如,可以使用SparkContext接口的textFile方法创建文本文件Spark RDDs。这个方法接受文件的URL,不管它是系统上的本地路径,还是hdfs://,等等)。最后,它将文件作为行集合读取。
这里的重要因素是,如果使用本地文件系统上的路径,则必须在从节点上的相同路径上访问该文件。因此,要么必须将数据文件复制到所有从节点,要么需要使用网络挂载的共享文件系统。
您可以使用数据帧读取器接口来加载外部数据集,然后使用. RDD方法将数据集<Row>转换为RDD <Row>。
下面的文本文件转换示例稍后将返回字符串数据集。
val exDataRDD = spark.read.textFile(“path/of/text/file”).rdd
来自现有RDDS
RDDS是不变的;因此你可以改变它。但是,使用transformation,您可以从现有的RDD创建一个新的RDD。由于没有因为突变而发生变化,所以它在集群中保持一致性。为此目的使用的操作很少是
- map
- filter
- count
- distinct
- flatmap
例如:
val seasons =spark.sparkContext.parallelize(Seq(“summer”, “monsoon”, “spring”, “winter”))
val seasons1= seasons.map(s => (s.charAt(0), s))
来源:oschina
链接:https://my.oschina.net/u/4280449/blog/3597460