私はHadoopを学習していましたが、レデューサーの数が非常に混乱していることがわかりました。
1)レデューサーの数はパーティションの数と同じです。
2)レデューサーの数は、0.95または1.75に(ノードの数)*(ノードあたりの最大コンテナーの数)を掛けたものです。
3)レデューサーの数はmapred.reduce.tasksで設定されます。
4)レデューサーの数が最も近い:ブロックサイズの倍数* 5〜15分のタスク時間*可能な限り少ないファイルを作成します。
私は非常に混乱しています。レデューサーの数を明示的に設定しますか、それともmapreduceプログラム自体によって行われますか?
レデューサーの数はどのように計算されますか?レデューサーの数の計算方法を教えてください。
1-レデューサーの数はパーティションの数と同じです-False
。単一のレデューサーが1つ以上のパーティションで機能する場合があります。ただし、選択したパーティションは、開始されたレデューサーで完全に実行されます。
2-これは、Hadoopクラスターに構成できる最大レデューサーの理論上の数です。これは、処理しているデータの種類にも大きく依存します(レデューサーを持ち上げるのにどれだけの負担がかかるかを決定します)。
3-mapred-site.xml
構成は、Yarnへの単なる提案です。しかし、内部的にはResourceManagerが独自のアルゴリズムを実行しており、外出先で物事を最適化しています。したがって、その値は実際には毎回実行されるレデューサータスクの数ではありません。
4-これは少し非現実的なようです。私のブロックサイズは128MBで、128 * 5の最小数のレデューサーを使用できない場合があります。それはまた間違っていると私は信じています。
構成または計算できるレデューサータスクの固定数はありません。それは、実際にどれだけのリソースを割り当てることができるかによって異なります。
レデューサーの数は、ドライバープログラムで以下のAPIを使用して明示的に指定しない場合、処理しているデータのサイズから内部的に計算されます
job.setNumReduceTasks(x)
デフォルトでは、1GBのデータで1つのレデューサーが使用されます。
したがって、1 GB未満のデータで遊んでいて、レデューサーの数を具体的に設定していない場合は、1つのレデューサーが使用されます。
同様に、データが10 Gbの場合、10レデューサーが使用されます。
構成を変更して、1GBの代わりに大きいサイズまたは小さいサイズを指定することもできます。
レデューサーのサイズを設定するためのHiveのプロパティは次のとおりです。
Hive.exec.reducers.bytes.per.reducer
このプロパティを表示するには、Hivecliでsetコマンドを実行します。
パーティショナーは、どのデータがどのレデューサーに送られるかを決定するだけです。
あなたの仕事はレデューサーを必要とするかもしれないし、必要としないかもしれません、それはあなたが何をしようとしているのかによります。複数のレデューサーがある場合、マップタスクは出力をパーティション化し、それぞれがリデュースタスクごとに1つのパーティションを作成します。各パーティションには多くのキー(およびそれらに関連する値)が存在する可能性がありますが、特定のキーのレコードはすべて1つのパーティションにあります。経験則の1つは、それぞれが5分程度実行され、少なくとも1つのHDFSブロックに相当する出力を生成するレデューサーを目指すことです。レデューサーが多すぎると、小さなファイルがたくさんできてしまいます。
Partitionerは、複数のマッパーからの同じキーが同じレデューサーに送られるようにします。これは、パーティションの数がレデューサーの数と等しいという意味ではありません。ただし、job.setNumReduceTasks(2)のようなジョブインスタンスを使用して、ドライバープログラムでreduceタスクの数を指定できます。ドライバプログラムでreduceタスクの数を指定しない場合、デフォルト値が1のmapred.reduce.tasksから選択されます( https://hadoop.Apache.org/docs/r1 .0.4/mapred-default.html )つまり、すべてのマッパー出力は同じレデューサーに送られます。
また、プログラマーは入力分割に依存するため、マッパーの数を制御できないことに注意してください。プログラマーは、任意のジョブのレデューサーの数を制御できます。