4

私のマップ関数は、入力ごとにファイルを読み取る必要があります。そのファイルはまったく変更されません。読み取り専用です。分散キャッシュは私が思うに大いに役立つかもしれませんが、それを使用する方法を見つけることができません。オーバーライドする必要のあるpublicvoidconfigure(JobConf conf)関数は、非推奨だと思います。JobConfは確かに非推奨です。すべてのDistributedCacheチュートリアルは、非推奨の方法を使用しています。私に何ができる?オーバーライドできる別の構成関数はありますか?

これらは私のマップ関数の最初の行です:

     Configuration conf = new Configuration();          //load the MFile
     FileSystem fs = FileSystem.get(conf);
     Path inFile = new Path("planet/MFile");       
     FSDataInputStream in = fs.open(inFile);
     DecisionTree dtree=new DecisionTree().loadTree(in);

そのMFileをキャッシュして、マップ関数が何度も何度もそれを調べる必要がないようにしたい

4

2 に答える 2

5

よくやったと思います。私はRaviBhattのヒントに従い、これを書きました:

  @Override
  protected void setup(Context context) throws IOException, InterruptedException
  {      
      FileSystem fs = FileSystem.get(context.getConfiguration());
      URI files[]=DistributedCache.getCacheFiles(context.getConfiguration());
      Path path = new Path(files[0].toString());
      in = fs.open(path);
      dtree=new DecisionTree().loadTree(in);                 
  } 

私のメインメソッド内でこれを行い、キャッシュに追加します。

  DistributedCache.addCacheFile(new URI(args[0]+"/"+"MFile"), conf);
  Job job = new Job(conf, "MR phase one");

この方法で必要なファイルを取得できますが、100%機能するかどうかはまだわかりません。それをテストする方法はありますか?ありがとう。

于 2012-02-15T23:45:45.643 に答える
1

Jobconf0.20.xでは非推奨になりましたが、1.0.0そうではありません!:-)(これを書いている時点で)

あなたの質問に対して、Javaでマップリデュースジョブを実行する方法は2つあります。1つはパッケージ内の()クラスを使用する方法、もう1つはパッケージ内のクラスによるextending方法(またはその逆)です。org.apache.hadoop.mapreduceimplementingorg.apache.hadoop.mapred

どちらを使用しているかわからない場合、オーバーライドするメソッドがない場合はconfigure、オーバーライドするメソッドを取得setupします。

@Override
protected void setup(Context context) throws IOException, InterruptedException

これはconfigureに似ており、役立つはずです。

パッケージに入れるときのsetupメソッドを取得します。overrideextend Mapper classorg.apache.hadoop.mapreduce

于 2012-02-14T09:20:25.270 に答える