3

私は大学の課題に Hadoop を使用していますが、コードは動作していますが、小さな問題が発生しています。

レデューサーの数を19に設定しようとしています(ドキュメントが示唆するように、これは0.95 *容量です)。ただし、タスク トラッカーで自分のジョブを表示すると、合計で 1 つのレデューサーと表示されます。

System.err.println("here");
job.setNumReduceTasks(19);
System.err.println(job.getNumReduceTasks());

予想通りの収量:

here
19

しかし、最終出力では次のようになります。

12/05/16 11:10:54 INFO mapred.JobClient:     Data-local map tasks=111
12/05/16 11:10:54 INFO mapred.JobClient:     Rack-local map tasks=58
12/05/16 11:10:54 INFO mapred.JobClient:     Launched map tasks=169
12/05/16 11:10:54 INFO mapred.JobClient:     Launched reduce tasks=1

私が上書きした mapreduce の部分は次のとおりです。

  • マッパー
  • レデューサー
  • パーティショナー
  • グループ化コンパレータ。

私が最初に考えたのは、パーティショナーがすべてのキーに対して同じ値を返しているということでした。これを確認しましたが、そうではありませんでした。

また、グルーパーが正しく動作することも確認しました。

他に何が原因なのかわかりません。誰かがそれを助けることができれば、それは大歓迎です。

私は非常にアンチ Java の人なので、できれば非常に明確な例を試してみてください。

PS: 私はこのクラスターをセットアップしていません。これは大学によってセットアップされたものであるため、構成変数については不明です。PS: 投稿するにはコードが多すぎたので、特に見たいコードがあれば教えてください。

編集: TejasP から次の質問を受けました。

本当にコードを Hadoop またはローカル モードで実行していますか? (ジョブがジョブトラッカーとタスクトラッカーに表示されるかどうかを確認してください)。

はい、jobtracker UI で表示できます。これは、1 つのレデューサーも報告します。注:これには、settings.xmlで1としてリストされているレデューサーがあります

環境で HADOOP 変数をエクスポートしましたか?

はい、それらはenvに表示され、設定するまでコードはコンパイルされません。

env | grep HADOOP
HADOOP_HOME=/mnt/biginsights/opt/ibm/biginsights/IHC
HADOOP_CONF_DIR=/mnt/biginsights/opt/ibm/biginsights/hadoop-conf

クラスターは単一ノードですか、それとも複数ノードですか? および クラスタが複数のノードからなる場合でも、すべてのノードは正常ですか? 他のノードに問題はありますか?

はい、複数のノードがあります (10) ジョブ トラッカー レポート:

Nodes: 10
Map Task Capacity: 20
Reduce Task Capacity: 20
Blacklisted Nodes: 0

setNumReduceTasks を正しく使用していますか? 上で述べたように、set を呼び出してから get を呼び出し、(19) であるとされていた値を取得しましたが、最終的なコードではまだ 1 しか使用されていません。

詳細を削除することで、コードを小さな map-reduce コードに減らすことができます (これはデバッグ用です)。それを実行します。何が起こるか見てください。同じ問題に直面している場合は、元の質問で削減されたコードを提供してください。

結果を元にもう一度編集してみます

4

2 に答える 2

3

LocalJobRunner モードで実行しているようです (ほとんどの場合、Eclipse から)。このモードでは、reduce タスクの数が 1 を超えると、数が 1 にリセットされます。LocalJobRunner.java の次の数行を見てください。

int numReduceTasks = job.getNumReduceTasks();
if (numReduceTasks > 1 || numReduceTasks < 0) {
      // we only allow 0 or 1 reducer in local mode
      numReduceTasks = 1;
      job.setNumReduceTasks(1);
}
于 2012-08-28T21:39:52.243 に答える
1

考慮する必要のあるいくつかのポイント:

  1. 本当にHadoopでコードを実行していますか、それともローカルモードで実行していますか?(あなたの仕事がjobtrackerとtasktrackerに表示されるかどうかを確認してください)
  2. 環境にHADOOP変数をエクスポートしましたか?
  3. クラスターは単一ノードですか、それとも複数ノードですか?
  4. クラスターが複数のノードで構成されている場合でも、すべてのノードは正常ですか?他のノードに問題はありますか?
  5. setNumReduceTasksを正しく使用していますか?コードを小さなmap-reduceコードに減らすには、詳細を削除します(これはデバッグ用です)。それを実行します。何が起こるか見てください。同じ問題に直面して、元の質問で削減されたコードを提供します。
于 2012-05-16T11:45:38.370 に答える