1

Hadoop の全順序パーティショナーとランダム サンプラーを入力サンプラーとして使用します。

しかし、スレーブ ノードを増やしてタスクを 8 に減らすと、次のエラーが発生します。

Caused by: java.io.IOException: Split points are out of order

このエラーの理由はわかりません。

関数の 3 つのパラメーターの数を設定するにはどうすればよいinputsampler.randomsamplerですか?

4

2 に答える 2

1

考えられる 2 つの問題

  • 重複したキーがあります
  • 入力サンプラーと、Total Order Partitioner を実行しているタスクに別のコンパレーターを使用している

これは、パーティション ファイルをダウンロードしてその内容を調べることで診断できます。パーティションファイルは、total.order.partitioner.path設定されているかどうかの値です_partition.lst。キーがテキストの場合は、実行hdfs dfs -text path_to_partition_file | lessして確認できます。これは他のキー タイプでも機能する可能性がありますが、試したことはありません。

パーティション ファイルに重複する行がある場合は、キーが重複しています。それ以外の場合は、間違ったコンパレータを使用している可能性があります。

直し方

重複キー

私の最善の推測は、キーが非常に不均衡であるため、パーティション間でレコードを均等に分割すると、同じ分割ポイントを持つパーティションが生成されることです。

これを解決するには、いくつかのオプションがあります。

  • 入力をよりよく区別するキーとして使用する値を選択します (おそらく不可能ですが、可能であればはるかに優れています)
  • より少ないパーティションとリデューサーを使用します (次のソリューションほどスケーラブルでも確実でもありませんが、特に重複が少ない場合は実装が簡単です)。元のパーティション数を重複エントリの最大数で割ります。(たとえばa、パーティションキーファイルaに、、、、、、、、bcccde分割ポイントとして、9 つのレデューサー (8 つの分割ポイント) と 3 の最大複製があります。したがって、3 つのレデューサー (3=floor(9/3)) を使用し、サンプリングが良好であれば、おそらく適切な分割になるでしょう。ポイント。完全な安定性を得るには、エントリが重複している場合にパーティション手順を再実行できるようにする必要があります。これにより、不均衡なキーの時折のオーバーサンプリングを防ぐことができますが、そのレベルの複雑さでは、調べることもできます次の解決策。
  • パーティション ファイルを読み取り、エントリが重複しないように書き換え、エントリの数を数え (これを と呼びますnum_non_duplicates)、num_non_duplicates+1リデューサーを使用します。重複したキーを持つレデューサーは、他のレデューサーよりもはるかに多くの作業を行い、実行時間が長くなります。reduce 操作が交換可能かつ結合的である場合、コンバイナーを使用することでこれを軽減できる場合があります。

間違ったコンパレータの使用

を使用して呼び出しとジョブのmapred.output.key.comparator.class両方で同じように設定していることを確認してくださいwritePartitionFileTotalOrderPartitioner

あなたが読む必要はないが楽しむかもしれない余分なもの:

Split points are out of orderエラーメッセージはコードから来ています:

  RawComparator<K> comparator =
    (RawComparator<K>) job.getOutputKeyComparator();
  for (int i = 0; i < splitPoints.length - 1; ++i) {
    if (comparator.compare(splitPoints[i], splitPoints[i+1]) >= 0) {
      throw new IOException("Split points are out of order");
    }
  }

この線comparator.compare(splitPoints[i], splitPoints[i+1]) >= 0は、分割点のペアが同一または順不同である場合に拒否されることを意味します。

分割ポイントは 1 つしかなく、ループは実行されないため、1 つまたは 2 つのレデューサーでこのエラーが発生することはありません。

于 2017-06-19T16:55:29.627 に答える
0

十分なキーを生成していますか? javadoc から: TotalOrderPartitioner

入力ファイルは、同じコンパレーターでソートされ、以下を含む必要があります

JobContextImpl.getNumReduceTasks() - 1 keys.
于 2016-10-08T15:14:25.427 に答える