为什么我的执行程序内存使用率为0?

时间:2015-05-13 23:38:14

标签: apache-spark accumulo

我有一个非常简单的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()的确切位置,或者根本不需要调用它们。但是我担心我的执行者似乎没有使用我分配给他们的大部分内存:

Screenshot showing zero memory used

应用程序UI中的“存储”页面为空。

我做错了什么,或者Spark决定通过存储我的RDD无法让这项工作变得更快?

1 个答案:

答案 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);