Spark:坚持并重新分配订单

Eda*_*ame 10 persist partition apache-spark rdd

我有以下代码:

val data = input.map{... }.persist(StorageLevel.MEMORY_ONLY_SER).repartition(2000)
Run Code Online (Sandbox Code Playgroud)

我想知道如果我首先进行重新分配会有什么不同:

val data = input.map{... }.repartition(2000).persist(StorageLevel.MEMORY_ONLY_SER)
Run Code Online (Sandbox Code Playgroud)

呼叫赔偿的顺序是否存在差异并持续存在?谢谢!

zer*_*323 14

是,有一点不同.

在第一种情况下,您会在映射阶段后获得持久RDD.这意味着每次data访问它都会触发repartition.

在第二种情况下,您在重新分区后进行缓存.当data访问时,并且之前已实现,没有其他工作要做.

为了证明我们做一个实验:

import  org.apache.spark.storage.StorageLevel

val data1 = sc.parallelize(1 to 10, 8)
  .map(identity)
  .persist(StorageLevel.MEMORY_ONLY_SER)
  .repartition(2000)
data1.count()

val data2 = sc.parallelize(1 to 10, 8)
  .map(identity)
  .repartition(2000)
  .persist(StorageLevel.MEMORY_ONLY_SER)
data2.count()
Run Code Online (Sandbox Code Playgroud)

并查看存储信息:

sc.getRDDStorageInfo

// Array[org.apache.spark.storage.RDDInfo] = Array(
//   RDD "MapPartitionsRDD" (17) StorageLevel:
//       StorageLevel(false, true, false, false, 1);
//     CachedPartitions: 2000; TotalPartitions: 2000; MemorySize: 8.6 KB; 
//     ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B,
//   RDD "MapPartitionsRDD" (7) StorageLevel:
//      StorageLevel(false, true, false, false, 1);
//    CachedPartitions: 8; TotalPartitions: 8; MemorySize: 668.0 B; 
//    ExternalBlockStoreSize: 0.0 B; DiskSize: 0.0 B)
Run Code Online (Sandbox Code Playgroud)

如您所见,有两个持久的RDD,一个具有2000个分区,另一个具有8个分区.

  • @hadooper 它应该。中间对象不同,而不是最终对象。 (2认同)