我有一个非常简单的Spark工作,如下所示:
JavaPairRDD<Key,Value> rawData = newAccumuloRDD(...);
JavaPairRDD<Key,Value> indexSrc =
rawData.filter(new IndexFilter()).cache();
JavaPairRDD<Key,Value> indexEntries =
indexSrc.mapPartitionsToPair(new IndexBuilder(numPartitions));
JavaPairRDD<Key,Value> reverseIndexEntries =
indexSrc.mapPartitionsToPair(new ReverseIndexBuilder(numPartitions));
JavaPairRDD<Key,Value> dataEntries =
rawData.mapPartitionsToPair(new DataBuilder(numPartitions)).cache();
dataEntries.union(indexEntries)
.union(reverseIndexEntries)
.repartitionAndSortWithinPartitions(new PartitionedIndexRDDPartitioner(NUM_BINS))
.saveAsNewAPIHadoopFile(pidxBulk.toString(), Key.class, Value.class,
AccumuloFileOutputFormat.class, conf);
其中Key和Value是Apache Accumulo的Key和Value类(使用KryoSerializer)。
我不确定将调用放到cache()的确切位置,或者根本不需要调用它们。但是我担心我的执行者似乎没有使用我分配给他们的大部分内存:
应用程序UI中的“存储”页面为空。
我做错了什么,或者Spark决定通过存储我的RDD无法让这项工作变得更快?
答案 0 :(得分:1)
使用的内存意味着用于缓存的内存。
在您的代码中,您只执行一个action,并且indexSrc或dataEntries不会再次使用,因此无法缓存它。
要证明这一点,您可以添加
在声明它们之后 indexSrc.count();
和dataEntries.count();
,然后检查执行程序/存储页面。
JavaPairRDD<Key,Value> rawData = newAccumuloRDD(...);
JavaPairRDD<Key,Value> indexSrc = rawData.filter(new IndexFilter()).cache();
indexSrc.count();
JavaPairRDD<Key,Value> indexEntries = indexSrc.mapPartitionsToPair(new IndexBuilder(numPartitions));
JavaPairRDD<Key,Value> reverseIndexEntries = indexSrc.mapPartitionsToPair(new ReverseIndexBuilder(numPartitions));
JavaPairRDD<Key,Value> dataEntries = rawData.mapPartitionsToPair(new DataBuilder(numPartitions)).cache();
dataEntries.count();
dataEntries.union(indexEntries)
.union(reverseIndexEntries)
.repartitionAndSortWithinPartitions(new PartitionedIndexRDDPartitioner(NUM_BINS))
.saveAsNewAPIHadoopFile(pidxBulk.toString(), Key.class, Value.class,
AccumuloFileOutputFormat.class, conf);