リデュース プロセッサが発生する場所がわからないシナリオがあります。
i) 入力テキスト ファイルがあり、1 ~ 4 のバランスの取れた範囲にある 1000 の整数が含まれています。
ii) 各ノードに 12 個のスロットを持つ 4 ノード クラスターがあり、そのうち 4 個がレデューサーとして割り当てられているとします。合計で 16 個のリデュース スロットが得られます。
iii) ドライバーにレデューサーの数を設定しました。
jobConf.setNumReduceTasks(4);
iii)そして最後に、次のパーティショナーメソッドがあるとします
public class MyPartitioner extends Partitioner<Text,Text>{
@Override
public int getPartition(Text key, Text value, int numPartitions) {
return Integer.parseInt(key.toString());
}
}
1) 私。各ノードIEで複数のリデューサーを実行するのではなく、各ノードで1つのリデューサーを使用して(他の3つのローカルリデューサーをアイドル状態のままにして)reduceを処理するように強制するにはどうすればよいですかノード 2、3、4 のアイドル状態で 12 スロットがあります。
ii. Hadoop MR はリソースを管理して、「ノード X が最もアイドル状態です。そこでレデューサーを生成します...」
2) キーにスキューがあり、それをグループ化する場合、そのキーに対して複数のレデューサーを生成できますか。たとえば、ランダムな整数を値「4」のシード値に追加し、パーティショナーを使用して 3 つのレデューサーを追加して処理できますか?レデューサー 4、5、6、および 7 の値「4」?
jobConf.setNumReduceTasks(7);
と
public class MyPartitioner2 extends Partitioner<Text,Text>{
@Override
public int getPartition(Text key, Text value, int numPartitions) {
int p = Integer.parseInt(key.toString());
if (p == 4){return p + (new Random()).nextInt(4);}//extra 3 partitions...
return p;
}
}
それはスキューに効きますか?