Apache spark Spark:持久化和重新分区顺序

Apache spark Spark:持久化和重新分区顺序,apache-spark,rdd,partition,persist,Apache Spark,Rdd,Partition,Persist,我有以下代码: val data = input.map{... }.persist(StorageLevel.MEMORY_ONLY_SER).repartition(2000) 我想知道如果我先进行重新分区会有什么不同,比如: val data = input.map{... }.repartition(2000).persist(StorageLevel.MEMORY_ONLY_SER) 要求赔偿和坚持的顺序有区别吗?谢谢 是的,有区别 在第一种情况下,您将在映射阶段之后获得持久RDD

我有以下代码:

val data = input.map{... }.persist(StorageLevel.MEMORY_ONLY_SER).repartition(2000)
我想知道如果我先进行重新分区会有什么不同,比如:

val data = input.map{... }.repartition(2000).persist(StorageLevel.MEMORY_ONLY_SER)

要求赔偿和坚持的顺序有区别吗?谢谢

是的,有区别

在第一种情况下,您将在映射阶段之后获得持久RDD。这意味着每次访问
数据
,都会触发
重新分区

在第二种情况下,在重新分区后缓存。当
数据被访问并且以前已具体化时,就没有其他工作要做了

为了证明这一点,让我们做一个实验:

import org.apache.spark.storage.StorageLevel
val data1=sc.parallelize(1到10,8)
.地图(身份)
.persist(仅限存储级别的内存)
.重新分配(2000年)
data1.count()
val data2=sc.parallelize(1到10,8)
.地图(身份)
.重新分配(2000年)
.persist(仅限存储级别的内存)
data2.count()
并查看存储信息:

sc.getRDDStorageInfo
//Array[org.apache.spark.storage.RDDInfo]=数组(
//RDD“MapPartitionsRDD”(17)存储级别:
//存储级别(假、真、假、假、1);
//CachedPartitions:2000;TotalPartitions:2000;MemorySize:8.6KB;
//ExternalBlockStoreSize:0.0 B;DiskSize:0.0 B,
//RDD“MapPartitionsRDD”(7)存储级别:
//存储级别(假、真、假、假、1);
//CachedPartitions:8;TotalPartitions:8;MemorySize:668.0B;
//ExternalBlockStoreSize:0.0 B;DiskSize:0.0 B)

如您所见,有两个持久化RDD,一个有2000个分区,另一个有8个分区。

我迟了两年才发表评论。但是data1.getNumPartitions和data2.getNumPartitions都返回2000@hadooper应该这样。中间对象是不同的,而不是最终的。你能解释更多关于中间对象的内容吗?@hadooper重点是在一个场景中Spark将RDD保存在8个分区中,在另一个场景中,首先进行洗牌,然后将RDD保存在2000个分区中。如果在第二种方法之后需要2000个分区,则更好,因为洗牌只执行一次(在持久化之前)。@hadooper持久化的分区数(8比2000)