From 2100eba25505db6f7defaa1f580a10302bb225db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Tue, 4 Jun 2019 14:09:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=B9=E6=80=A7=E5=BC=8F=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86RDDs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Spark_RDD.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/notes/Spark_RDD.md b/notes/Spark_RDD.md index 2ecc748..7c7c55e 100644 --- a/notes/Spark_RDD.md +++ b/notes/Spark_RDD.md @@ -58,13 +58,13 @@ RDD有两种创建方式,分别介绍如下: ### 2.1 由现有集合创建 -这里使用`spark-shell`的本地模式作为测试,指定使用4个CPU 核心,启动命令如下: +这里使用`spark-shell`进行测试,启动命令如下: ```shell spark-shell --master local[4] ``` -启动`spark-shell`后,程序会自动创建应用上下文,相当于程序自动执行了下面的语句: +启动`spark-shell`后,程序会自动创建应用上下文,相当于执行了下面的Scala语句: ```scala val conf = new SparkConf().setAppName("Spark shell").setMaster("local[4]") @@ -121,7 +121,7 @@ def wholeTextFiles(path: String,minPartitions: Int = defaultMinPartitions): RDD[ ## 三、操作RDD -RDD支持两种类型的操作:*transformations*(转换,从现有数据集创建新数据集)和 *actions*(在数据集上运行计算后将值返回到驱动程序)。RDD中的所有转换操作都是惰性的,它们只是记住这些转换操作,但不会立即执行,只有遇到 *action*操作后才会真正的进行计算,这类似于函数式编程中的惰性求值。 +RDD支持两种类型的操作:*transformations*(转换,从现有数据集创建新数据集)和 *actions*(在数据集上运行计算后将值返回到驱动程序)。RDD中的所有转换操作都是惰性的,它们只是记住这些转换操作,但不会立即执行,只有遇到 *action* 操作后才会真正的进行计算,这类似于函数式编程中的惰性求值。 ```scala val list = List(1, 2, 3) @@ -138,17 +138,17 @@ sc.parallelize(list).map(_ * 10).foreach(println) Spark速度非常快的一个原因是RDD支持缓存。成功缓存后,如果之后的操作使用到了该数据集,则直接从缓存中获取。虽然缓存也有丢失的风险,但是由于RDD之间的依赖关系,如果某个分区的缓存数据丢失,只需要重新计算该分区即可。 -Spark支持多种缓存级别,见下表: +Spark支持多种缓存级别 : -| Storage Level
(存储级别) | Meaning(含义) | -| ------------------------------------------------- | ------------------------------------------------------------ | -| `MEMORY_ONLY` | 默认的缓存级别,将 RDD以反序列化的Java对象的形式存储在 JVM 中。如果内存空间不够,则部分分区数据将不再缓存。 | -| `MEMORY_AND_DISK` | 将 RDD 以反序列化的Java对象的形式存储JVM中。如果内存空间不够,将未缓存的分区数据存储到磁盘,在需要使用这些分区时从磁盘读取。 | -| `MEMORY_ONLY_SER`
(仅支持 Java and Scala) | 将 RDD 以序列化的Java对象的形式进行存储(每个分区为一个 byte 数组)。这种方式比反序列化对象节省存储空间,但在读取时会增加CPU的计算负担。 | -| `MEMORY_AND_DISK_SER`
(仅支持 Java and Scala) | 类似于`MEMORY_ONLY_SER`,但是溢出的分区数据会存储到磁盘,而不是在用到它们时重新计算。 | -| `DISK_ONLY` | 只在磁盘上缓存RDD | -| `MEMORY_ONLY_2`,
`MEMORY_AND_DISK_2`, etc | 与上面的对应级别功能相同,但是会为每个分区在集群中的两个节点上建立副本。 | -| `OFF_HEAP` | 与`MEMORY_ONLY_SER`类似,但将数据存储在堆外内存中。这需要启用堆外内存。 | +| Storage Level
(存储级别) | Meaning(含义) | +| ---------------------------------------------- | ------------------------------------------------------------ | +| `MEMORY_ONLY` | 默认的缓存级别,将 RDD以反序列化的Java对象的形式存储在 JVM 中。如果内存空间不够,则部分分区数据将不再缓存。 | +| `MEMORY_AND_DISK` | 将 RDD 以反序列化的Java对象的形式存储JVM中。如果内存空间不够,将未缓存的分区数据存储到磁盘,在需要使用这些分区时从磁盘读取。 | +| `MEMORY_ONLY_SER`
(仅支持Java和Scala) | 将 RDD 以序列化的Java对象的形式进行存储(每个分区为一个 byte 数组)。这种方式比反序列化对象节省存储空间,但在读取时会增加CPU的计算负担。 | +| `MEMORY_AND_DISK_SER`
(仅支持Java和Scala) | 类似于`MEMORY_ONLY_SER`,但是溢出的分区数据会存储到磁盘,而不是在用到它们时重新计算。 | +| `DISK_ONLY` | 只在磁盘上缓存RDD | +| `MEMORY_ONLY_2`,
`MEMORY_AND_DISK_2`, etc | 与上面的对应级别功能相同,但是会为每个分区在集群中的两个节点上建立副本。 | +| `OFF_HEAP` | 与`MEMORY_ONLY_SER`类似,但将数据存储在堆外内存中。这需要启用堆外内存。 | > 启动堆外内存需要配置两个参数: > @@ -157,7 +157,7 @@ Spark支持多种缓存级别,见下表: ### 4.2 使用缓存 -缓存数据的方法有两个:`persist`和`cache` 。`cache`内部调用的也是`persist`,其等价于`persist(StorageLevel.MEMORY_ONLY)`。 +缓存数据的方法有两个:`persist`和`cache` 。`cache`内部调用的也是`persist`,其等价于`persist(StorageLevel.MEMORY_ONLY)`。示例如下: ```scala // 所有存储级别均定义在StorageLevel对象中 @@ -183,7 +183,7 @@ Spark会自动监视每个节点上的缓存使用情况,并按照最近最少 ### 5.2 Shuffle的影响 -Shuffle是一项昂贵的操作,因为它通常会跨节点操作数据,这会涉及磁盘I/O,网络I/O,和数据序列化。某些Shuffle操作还会消耗大量的堆内存,因为它们使用内存来临时存储需要网络传输的数据。Shuffle还会在磁盘上生成大量中间文件,从Spark 1.3开始,这些文件将被保留,直到相应的RDD不再使用并进行垃圾回收,这样做是为了避免在计算时重复创建Shuffle文件。如果应用程序长期保留对这些RDD的引用,则垃圾回收可能在很长一段时间后才会发生,这意味着长时间运行的Spark作业可能会占用大量磁盘空间,通常可以使用`spark.local.dir`参数指定这些临时文件的存储目录。 +Shuffle是一项昂贵的操作,因为它通常会跨节点操作数据,这会涉及磁盘I/O,网络I/O,和数据序列化。某些Shuffle操作还会消耗大量的堆内存,因为它们使用堆内存来临时存储需要网络传输的数据。Shuffle还会在磁盘上生成大量中间文件,从Spark 1.3开始,这些文件将被保留,直到相应的RDD不再使用并进行垃圾回收,这样做是为了避免在计算时重复创建Shuffle文件。如果应用程序长期保留对这些RDD的引用,则垃圾回收可能在很长一段时间后才会发生,这意味着长时间运行的Spark作业可能会占用大量磁盘空间,通常可以使用`spark.local.dir`参数来指定这些临时文件的存储目录。 ### 5.3 导致Shuffle的操作