2

mapreduce プログラムでグローバル変数を使用して、次のコードでグローバル変数を設定し、レデューサーでグローバル変数を使用する必要があります。

public class tfidf
{
  public static tfidfMap..............
  {
  }
  public static tfidfReduce.............
  {
  }
  public static void main(String args[])
  {
       Configuration conf=new Configuration();
       conf.set("","");
  } 

}

4

3 に答える 3

6

テンプレート コードは次のようになります (Reducer は示されていませんが、同じプリンシパルです)。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class ToolExample extends Configured implements Tool {

    @Override
    public int run(String[] args) throws Exception {
        Job job = new Job(getConf());
        Configuration conf = job.getConfiguration();

        conf.set("strProp", "value");
        conf.setInt("intProp", 123);
        conf.setBoolean("boolProp", true);

        // rest of your config here
        // ..

        return job.waitForCompletion(true) ? 0 : 1;
    }

    public static class MyMapper extends
            Mapper<LongWritable, Text, LongWritable, Text> {
        private String strProp;
        private int intProp;
        private boolean boolProp;

        @Override
        protected void setup(Context context) throws IOException,
                InterruptedException {
            Configuration conf = context.getConfiguration();

            strProp = conf.get("strProp");
            intProp = conf.getInt("intProp", -1);
            boolProp = conf.getBoolean("boolProp", false);
        }
    }

    public static void main(String args[]) throws Exception {
        System.exit(ToolRunner.run(new ToolExample(), args));
    }
}
于 2013-04-25T23:01:51.413 に答える
4

クラスター (ローカル以外) 環境では、map/reduce プログラムが Java で記述されている場合 (他の言語では別のプロセス)、MapReduce プログラムは独自の JVM で実行されます。これにより、クラスで静的変数と値を宣言し、途中で MapReduce フローを変更して、別の JVM で値を期待することはできません。共有オブジェクトは、mapper/reduce のいずれかが値を設定および取得できるようにするために必要なものです。

これを達成する方法はいくつかあります。

  1. Chris が述べたように、構成の set()/get() メソッドを使用して値をマッパーやレデューサーに渡します。この場合、ジョブを作成する前に構成オブジェクトに値を設定する必要があります。

  2. HDFS ファイルを使用してデータを書き込み、マッパー/リデューサーから読み取ります。上記で作成した HDFS ファイルをクリーンアップすることを忘れないでください。

于 2013-04-26T01:20:54.790 に答える
2

Hadoop カウンター (ユーザー定義) は、別の種類のグローバル変数です。これらの値は、ジョブの終了後に表示できます。例: 入力 (さまざまなマッパー/リデューサーによって処理される) 全体でエラーのある/適切なレコードの数をカウントしたい場合は、カウンターを使用できます。@Mo: 必要に応じてカウンターを使用できます

于 2014-12-29T13:01:19.057 に答える