2

Hadoop (古い API) に K-Means アルゴリズムを実装していますが、さらに先に進む方法がわからなくなってしまいました。

今までの私の論理は次のとおりです。

2 つのファイル重心とデータを維持します。

  • ステップ 1 : 重心ファイルを読み取り、このデータをいくつかの .xml ファイルに保存しますlist(ArrayList)
  • ステップ 2 : 次に、マッパーを介してデータ ファイルを読み取ります。これは、行ごとにスキャンし、この値をリストに既に保存されている重心と比較します。
  • ステップ 3 : 対応するセントロイドとデータをレデューサーに出力します。
  • ステップ 4 : Reducer は新しい重心を処理し、データと共に出力します。

私の質問

  1. 私の流れは正しいですか?
  2. 重心ファイルを最初にコレクションに保存してから先に進むのは正しい方法ですか?
  3. アプローチ(2)を使用する場合、マップ関数はファイルを1行ずつスキャンするため、このセントロイドファイルをコレクションに保存する方法が問題になるため、データファイルでマッパーを実行する前にこのセントロイドファイルを最初にスキャンする方法は?
  4. この重心ファイルの機能を処理するためのより良い方法は何ですか?
4

2 に答える 2

2
  1. あなたの流れは私にはほとんど問題ないように見えます。データファイルを「読み取る」べきではなく、hadoop プログラムへの入力として指定する必要があります。それに加えて、常に理想的であるとは限りませんが、MapReduce/Hadoop システムは反復アルゴリズムを問題なく実行できます。レデューサーの出力をマッパーの入力にリンクしていることを確認してください。

  2. はい、正解です。分散キャッシュを使用するか、ファイルを hdfs パスに保存するだけです。マッパー開始時の重心ファイルの読み込みは、「setup」メソッド内で行うことができます。

    public class MyMapper extends Mapper{
        @オーバーライド
        保護されたボイドセットアップ(コンテキストコンテキスト){
            //セットアップコード。重心ファイルを読み込む
        }
    }
    
  3. 上記の私のコードを見て、「セットアップ」メソッドを使用してください。

  4. 重心ファイルは問題ないと思います。そのファイルは、サイズが非常に小さいため、簡単に渡すことができます(数百万のクラスターを作成しようとしている場合を除きます...)

于 2013-04-29T04:50:40.027 に答える