私の質問はばかげているように聞こえるかもしれませんが、Hadoop map reduce は初めてです。だから、私が理解するのは難しいです。
Map Reduce で K 手段のクラスタリングを実装し、Cloudera CDH4 (4.1.1) を使用しています。
データは、x 座標と y 座標を持つ点で構成されます。したがって、すべての重心の変化が 0.1 未満になるまで、各ステップで重心を更新します。
最初の反復では、サンプルのセントロイド ファイルを分散キャッシュに配置します。
if (iteration == 0) {
Path hdfsPath = new Path(input + "/centroid.txt");
DistributedCache.addCacheFile(hdfsPath.toUri(), conf);
} else {
Path hdfsPath = new Path(again_input + "/part-00000");
DistributedCache.addCacheFile(hdfsPath.toUri(), conf);
次の反復では、最初の反復の出力と同じ again_input ディレクトリを取得しています。このディレクトリには、新しく計算された重心が格納されています。
ただし、マッパーは、最初の反復でフェッチしたセントロイド ファイルを再度フェッチしています。
以下は、マッパー クラスでセントロイド ファイルを取得するコードです。
Path[] cacheFiles = DistributedCache.getLocalCacheFiles(job);
BufferedReader cacheReader = new BufferedReader(new FileReader(cacheFiles[0].toString()));
疑問 1: ジョブが完了すると、分散キャッシュはすべてのファイルを消去しますか、それとも保持しますか? たとえば、centroid.txt は反復 1 の後にクリアされます。
疑問 2: 正しいファイルにアクセスしていますか?