Spark RDD から MapFile を作成しようとしていますが、十分な情報が見つかりません。これまでの私の手順は次のとおりです。
私は、
rdd.saveAsNewAPIHadoopFile(....MapFileOutputFormat.class)
MapFiles
ソートする必要があるため、例外がスローされました。だから私は次のように変更しました:
rdd.sortByKey().saveAsNewAPIHadoopFile(....MapFileOutputFormat.class)
これは正常に機能し、MapFile が作成されました。したがって、次のステップはファイルにアクセスすることでした。作成されたディレクトリ名を使用すると、ファイルparts
が見つからないと言って失敗しました。Google に戻ると、使用する必要のあるパーツに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());
非常に遅いです。読者をより効率的に識別できますか?- 基盤となる DFS として MapR-FS を使用しています。これは同じ
HashParitioner
実装を使用しますか? - 再分割を回避する方法はありますか、それともデータをファイル全体でソートする必要がありますか? (パーティション内でソートされるのとは対照的)
- 例外も発生しています
_SUCCESS/data does not exist
。このファイルを手動で削除する必要がありますか?
これに関するリンクは大歓迎です。
PS。HashPartitioner
エントリがソートされている場合、を使用して正しい を見つけるにはどうすればよい Reader
ですか? parts
これは、データがHash Partitioned
キーでソートされていることを意味します。だから私も試してみrdd.repartiotionAndSortWithinPartitions(new HashPartitioner(280))
ましたが、やはり運がありませんでした。