e call(Integer x) {
return (double) x * x;
}
});
System.out.println(result.mean());
}
}
运行结果
[root@server1 spark-2.4.4-bin-hadoop2.7]# bin/spark-submit --class DoubleRDD ~/Spark_RDD_DoubleRDD.jar
...
19/09/18 16:09:38 INFO DAGScheduler: Job 0 finished: mean at DoubleRDD.java:20, took 0.500705 s
7.5
...
持久化
为了避免多次计算同一个 RDD,我们常常对数据进行持久化处理。具体操作可以参见上一节例程。
Tips:
- 在Scala 和Java 中,默认情况下 persist() 会把数据以序列化的形式缓存在JVM 的堆空间中
- 在Python 中,我们会始终序列化要持久化存储的数据,所以持久化级别默认值就是以序列化后的对象存储在JVM 堆空间中
- 当我们把数据写到磁盘或者堆外存储上时,也总是使用序列化后的数据
- 缓存的数据太多,内存中放不下,Spark 会自动利用最近最少使用(LRU)的缓存策略把最老的分区从内存中移除
- unpersist() 可以手动把持久化的RDD 从缓存中移除
持久化级别
MEMORY_ONLY |
高 |
低 |
是 |
否 |
|
MEMORY_ONLY_SER |
低 |
高 |
是 |
否 |
|
MEMORY_AND_DISK |
高 |
中等 |
部分 |
部分 |
如果数据在内存中放不下,则溢写到磁盘上 |
MEMORY_AND_DISK_SER |
低 |
高 |
部分 |
部分 |
如果数据在内存中放不下,则溢写到磁盘上。在内存中存放序列化后的数据 |
DISK_ONLY |
低 |
高 |
否 |
是 |
|
P.s.
可以通过在存储级别的末尾加上“_2”来把持久化数据存为两份