2011-07-21 5 views
0

ユーザからの入力を取得し、作成したマッパークラスに渡そうとしていますが、ユーザが入力した実際の値を使用する代わりに常に値がゼロに初期化されます。Mapperクラスへの変数の送信

変数を取得するたびに常に同じ値を保持するようにするにはどうすればよいですか。私はjob1.setMapperClass(Parallel_for.class)に気付きました。クラスのインスタンスを作成し、変数を強制的に元の値に再初期化します。以下は2つのクラスへのリンクです。 RunnerToolクラスから時間の価値を得ようとしています。

Link to Java TestFor class

Link to RunnerTool class

マッパー

@Override 
public void setup(Context context) { 
    int defaultValue = 1; 
    times = context.getConfiguration().getInt("parallel_for_iteration", defaultValue); 
    LOG.info(context.getConfiguration().get("parallel_for_iteration") + " Actually name from the commandline"); 
    LOG.info(times + " Actually number of iteration from the commandline"); 
} 

// RunnerToolsクラスの//設定方法

conf.setInt(反復回数)。

答えて

0

Mapper getはリフレクションによって初期化されるため、ユーザーはマッパークラスと対話できません。

代わりにConfigurationオブジェクトがあります。これは、ジョブを設定する場合に指定する必要があります。ここでは、conf.set("YOUR KEY", "YOUR VALUE")を使用して設定できます。 Mapperクラスでは、setup(Context context)というメソッドをオーバーライドできます。context.getConfiguration().get("YOUR KEY")を使用して値を取得できます。そして、マッパーのローカル変数に保存することもできます。

+0

設定を使用しようとしましたが、プロパティのnullが返されていて、デフォルト値が返されます。私が間違っていることは何ですか? – asembereng

+0

あなたのコードでは、キーを設定に入れることはありません。どうすればいいですか? –

+0

私はconf.setInt(ITERATION、times)を使用しました。反復はprotected final static Stringと定義されています。ITERATION = \t "parallel_for_iteration"; – asembereng

1

マッパークラスは多くのクラスターノードで再作成されるので、ジョブ実行時にマッパークラスのインスタンスに対して行われた初期化は他のノードに影響しないので注意してください。技術的に関連性のあるjarファイルはノード間で配布され、そこでマッパーが作成されます。 上記の答えで指摘されているように、マッパーに情報を渡す唯一の方法は、Configurationクラスを使用することです。

+0

設定を使用しようとしましたが、プロパティのnullが返されていて、デフォルト値が返されます。私が間違っていることは何ですか? – asembereng

+0

設定値を設定する際にコードスニペットを入力してください。 –

+0

//ランナーツールクラス final static String ITERATION = "parallel_for_iteration"; conf.setInt(ITERATION、times); – asembereng