разные ключи помещаются в 1 файл, даже если используется собственный разделитель Hadoop

У меня заканчивается минутный выпуск.

Я пытаюсь получить другой файл для разных ключей от Reducer.

Разделитель

public class customPartitioner extends Partitioner<Text, NullWritable> implements
Configurable {
private Configuration configuration;

@Override
public Configuration getConf() {
    return configuration;
}

public int getPartition(Text key, NullWritable value, int numPartitions) {
    return Math.abs(key.hashCode()) % numPartitions;
}
}

И я установил следующее в своем классе драйверов

job0.setPartitionerClass(customPartitioner.class);
job0.setNumReduceTasks(5);

Для редуктора у меня 5 ключей

[3, 0, 5, 8, 12]

Поэтому мне нужно получить 5 разных файлов.

Но как только я запускаю этот код, я получаю 5 файлов частей, но результаты не ожидаются.

ВЫВОД

Found 6 items
-rw-r--r--   3 sreeveni root          0 2015-12-09 11:44 /OUT/Part/OUT/_SUCCESS
-rw-r--r--   3 sreeveni root          0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00000
-rw-r--r--   3 sreeveni root          4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00001
-rw-r--r--   3 sreeveni root          0 2015-12-09 11:44 /OUT/Part/OUT/part-r-00002
-rw-r--r--   3 sreeveni root          4 2015-12-09 11:44 /OUT/Part/OUT/part-r-00003
-rw-r--r--   3 sreeveni root          3 2015-12-09 11:44 /OUT/Part/OUT/part-r-00004

В том, что 2 файла пусты, а другой содержит

sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00001
3
8
sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00003
0
5
sreeveni@machine10:~$ hadoop fs -cat /OUT/Part/OUT/part-r-00004
12

Почему 2 ключа приходят под один файл?

Я делаю какую-либо ошибку в своем коде? Пожалуйста помоги


person USB    schedule 09.12.2015    source источник


Ответы (1)


Ваш разделитель работает правильно, поэтому я попытаюсь объяснить, почему. Давайте передадим каждый из ваших входных данных в код вашего раздела и посмотрим, что получится. numPartitions – это 5, так как это количество установленных вами редукторов.

int hash = new Text("3").hashCode(); // = 82
hash % numPartitions; // = 2

hash = new Text("0").hashCode(); // = 79
hash % numPartitions; // = 4

hash = new Text("5").hashCode(); // = 84
hash % numPartitions; // = 4

hash = new Text("8").hashCode(); // = 87
hash % numPartitions; // = 2

hash = new Text("12").hashCode(); // = 2530
hash % numPartitions; // = 0

Как мы видим, мы получаем те же результаты, запуская его вручную. Два ключа находятся в одном файле, потому что разделитель назначает их одному и тому же редюсеру. Разделение будет выравниваться по мере увеличения набора данных, но вы не можете ожидать, что этот код будет автоматически и равномерно распределять все входные данные.

person Ben Watson    schedule 09.12.2015