3

我正在尝试从 Spark RDD 创建 MapFile,但找不到足够的信息。到目前为止,这是我的步骤:

我开始时,

rdd.saveAsNewAPIHadoopFile(....MapFileOutputFormat.class)

这引发了一个异常,因为MapFiles必须对其进行排序。所以我修改为:

rdd.sortByKey().saveAsNewAPIHadoopFile(....MapFileOutputFormat.class)

效果很好,并且创建了我的 MapFile。所以下一步是访问文件。使用parts创建的目录名称失败,说它找不到data文件。回到谷歌,我发现为了访问MapFile我需要使用的部分:

Object ret = new Object();//My actual WritableComparable impl
Reader[] readers = MapFileOutputFormat.getReaders(new Path(file), new Configuration());
Partitioner<K,V> p = new HashPartitioner<>();
Writable e = MapFileOutputFormat.getEntry(readers, p key, ret);

天真地,我忽略了这HashPartioner一点,并期望这会找到我的条目,但没有运气。所以我的下一步是遍历读者并做一个get(..). 该解决方案确实有效,但速度极慢,因为文件由 128 个任务创建,导致 128 个part文件。

所以我调查了它的重要性,HashPartitioner发现它在内部使用它来识别要使用哪个阅读器,但似乎 Spark 没有使用相同的分区逻辑。所以我修改为:

rdd.partitionBy(new org.apache.spark.HashPartitioner(128)).sortByKey().saveAsNewAPIHadoopFile(....MapFileOutputFormat.class)

但同样 2HashPartioner不匹配。所以问题部分...

  • 有没有办法MapFiles有效地组合(因为这会忽略分区逻辑)?
  • MapFileOutputFormat.getReaders(new Path(file), new Configuration());很慢。我可以更有效地识别读者吗?
  • 我使用 MapR-FS 作为底层 DFS。这将使用相同的HashParitioner实现吗?
  • 有没有办法避免重新分区,或者应该对整个文件进行排序?(与在分区内排序相反)
  • 我也遇到了一个例外_SUCCESS/data does not exist。我需要手动删除这个文件吗?

任何有关此的链接将不胜感激。

PS。如果条目已排序,那么如何使用 HashPartitioner来定位正确的Reader?这意味着数据partsHash Partitioned然后按键排序的。所以我也尝试rdd.repartiotionAndSortWithinPartitions(new HashPartitioner(280))了,但再次没有任何运气。

4

1 回答 1

3

深入研究这个问题,我发现 Spark HashPartitioner 和 Hadoop HashPartitioner 有不同的逻辑。

因此,我尝试并有效的“蛮力”解决方案如下。

使用保存 MapFilerdd.repartitionAndSortWithinPArtitions(new org.apache.aprk.HashPartitioner(num_of_parititions)).saveAsNewAPIHadoopFile(....MapFileOutputFormat.class);

查找使用:

  • Reader[] reader = MapFileOutputFormat.getReaders(new Path(file),new Configuration());
  • org.apache.aprk.HashPartitioner p = new org.apache.aprk.HashPartitioner(readers.length);
  • 读者[p.getPartition(key)].get(key,val);

这是“脏”的,因为 MapFile 访问现在绑定到 Spark 分区器而不是直观的 Hadoop HashPartitioner。我可以实现一个使用 HadoopHashPartitioner进行改进的 Spark 分区器。

这也没有解决访问相对大量reducer速度慢的问题。我可以通过从分区器生成文件部件号来使它变得更“脏”,但我正在寻找一个干净的解决方案,所以如果有更好的方法来解决这个问题,请发布。

于 2015-04-18T10:41:27.303 回答