弹性式数据集RDDs

This commit is contained in:
罗祥 2019-06-04 14:09:30 +08:00
parent b4399d8ab7
commit 2100eba255

View File

@ -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]")
@ -138,14 +138,14 @@ sc.parallelize(list).map(_ * 10).foreach(println)
Spark速度非常快的一个原因是RDD支持缓存。成功缓存后如果之后的操作使用到了该数据集则直接从缓存中获取。虽然缓存也有丢失的风险但是由于RDD之间的依赖关系如果某个分区的缓存数据丢失只需要重新计算该分区即可。
Spark支持多种缓存级别,见下表
Spark支持多种缓存级别
| Storage Level<br/>(存储级别) | Meaning含义 |
| ------------------------------------------------- | ------------------------------------------------------------ |
| ---------------------------------------------- | ------------------------------------------------------------ |
| `MEMORY_ONLY` | 默认的缓存级别,将 RDD以反序列化的Java对象的形式存储在 JVM 中。如果内存空间不够,则部分分区数据将不再缓存。 |
| `MEMORY_AND_DISK` | 将 RDD 以反序列化的Java对象的形式存储JVM中。如果内存空间不够将未缓存的分区数据存储到磁盘在需要使用这些分区时从磁盘读取。 |
| `MEMORY_ONLY_SER`<br/>(仅支持 Java and Scala) | 将 RDD 以序列化的Java对象的形式进行存储每个分区为一个 byte 数组。这种方式比反序列化对象节省存储空间但在读取时会增加CPU的计算负担。 |
| `MEMORY_AND_DISK_SER`<br/>(仅支持 Java and Scala) | 类似于`MEMORY_ONLY_SER`,但是溢出的分区数据会存储到磁盘,而不是在用到它们时重新计算。 |
| `MEMORY_ONLY_SER`<br/>(仅支持Java和Scala) | 将 RDD 以序列化的Java对象的形式进行存储每个分区为一个 byte 数组。这种方式比反序列化对象节省存储空间但在读取时会增加CPU的计算负担。 |
| `MEMORY_AND_DISK_SER`<br/>(仅支持Java和Scala) | 类似于`MEMORY_ONLY_SER`,但是溢出的分区数据会存储到磁盘,而不是在用到它们时重新计算。 |
| `DISK_ONLY` | 只在磁盘上缓存RDD |
| `MEMORY_ONLY_2`, <br/>`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的操作