один и тот же ключ входит в разные редукторы в Hadoop

Я испытываю что-то очень странное. Я получаю один и тот же ключ в разных редукторах. Я просто напечатал и собрал ключ и значения. Мой код редуктора выглядит так.

public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException {

System.out.println("The key is "+ key.toString());

while(values.hasNext()){


        Text value=values.next();

        key.set("");
        output.collect(key, value);

  }
 }

Вывод на консоль

  The key is 111-00-1234195967001
The key is 1234529857009
The key is 1234529857009
14/01/06 20:11:16 INFO mapred.Task: Task:attempt_local_0001_r_000000_0 is done. And is in the process of commiting
14/01/06 20:11:16 INFO mapred.LocalJobRunner: 
14/01/06 20:11:16 INFO mapred.Task: Task attempt_local_0001_r_000000_0 is allowed to commit now
14/01/06 20:11:16 INFO mapred.FileOutputCommitter: Saved output of task 'attempt_local_0001_r_000000_0' to hdfs://localhost:54310/user/hduser/joboutput11
14/01/06 20:11:18 INFO mapred.LocalJobRunner: reduce > reduce
14/01/06 20:11:18 INFO mapred.Task: Task 'attempt_local_0001_r_000000_0' done.
14/01/06 20:11:19 INFO mapred.JobClient:  map 100% reduce 100%
14/01/06 20:11:19 INFO mapred.JobClient: Job complete: job_local_0001
14/01/06 20:11:19 INFO mapred.JobClient: Counters: 23
14/01/06 20:11:19 INFO mapred.JobClient:   File Input Format Counters 
14/01/06 20:11:19 INFO mapred.JobClient:     Bytes Read=289074
14/01/06 20:11:19 INFO mapred.JobClient:   File Output Format Counters 
14/01/06 20:11:19 INFO mapred.JobClient:     Bytes Written=5707
14/01/06 20:11:19 INFO mapred.JobClient:   FileSystemCounters
14/01/06 20:11:19 INFO mapred.JobClient:     FILE_BYTES_READ=19185
14/01/06 20:11:19 INFO mapred.JobClient:     HDFS_BYTES_READ=1254215
14/01/06 20:11:19 INFO mapred.JobClient:     FILE_BYTES_WRITTEN=270933
14/01/06 20:11:19 INFO mapred.JobClient:     HDFS_BYTES_WRITTEN=5707
14/01/06 20:11:19 INFO mapred.JobClient:   Map-Reduce Framework
14/01/06 20:11:19 INFO mapred.JobClient:     Map output materialized bytes=5633
14/01/06 20:11:19 INFO mapred.JobClient:     Map input records=5
14/01/06 20:11:19 INFO mapred.JobClient:     Reduce shuffle bytes=0
14/01/06 20:11:19 INFO mapred.JobClient:     Spilled Records=10
14/01/06 20:11:19 INFO mapred.JobClient:     Map output bytes=5583
14/01/06 20:11:19 INFO mapred.JobClient:     Total committed heap usage (bytes)=991539200
14/01/06 20:11:19 INFO mapred.JobClient:     CPU time spent (ms)=0
14/01/06 20:11:19 INFO mapred.JobClient:     Map input bytes=289074
14/01/06 20:11:19 INFO mapred.JobClient:     SPLIT_RAW_BYTES=627
14/01/06 20:11:19 INFO mapred.JobClient:     Combine input records=0
14/01/06 20:11:19 INFO mapred.JobClient:     Reduce input records=5
14/01/06 20:11:19 INFO mapred.JobClient:     Reduce input groups=3
14/01/06 20:11:19 INFO mapred.JobClient:     Combine output records=0
14/01/06 20:11:19 INFO mapred.JobClient:     Physical memory (bytes) snapshot=0
14/01/06 20:11:19 INFO mapred.JobClient:     Reduce output records=7
14/01/06 20:11:19 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=0
14/01/06 20:11:19 INFO mapred.JobClient:     Map output records=5

Ключ 1234529857009 повторяется дважды, что является ненормальным. Есть идеи, почему это происходит.

Спасибо


person shujaat    schedule 05.01.2014    source источник
comment
Не могли бы вы проверить значения и сообщить нам, сколько значений предоставляется с каждым ключом и сколько из них различаются?   -  person Mehraban    schedule 05.01.2014
comment
Спасибо. Есть 2 разных ключа, то есть 111-00-1234195967001 и 1234529857009. Первый ключ дает 2 значения, а второй ключ предоставляет 3 значения. Но эти три разделены, и 2 значения входят в один редуктор, а третье - в другой редуктор. Теперь, как сказал simplefish, это нормальное поведение, которое снова является проблемой. Я объяснил в комментарии к ответу simplefish, какую проблему он создает для меня. Я использую один узел.   -  person shujaat    schedule 06.01.2014


Ответы (2)


Из-за спекулятивного выполнения в Hadoop не гарантируется, что каждый key переходит к редюсеру ровно один раз во время выполнения. Вам нужно следить за завершенным выводом, а не за состоянием процесса. Так что, если вы замените этот редуктор на редуктор идентичности, а в выводе по-прежнему будете видеть повторяющиеся строки, то вам есть о чем беспокоиться. В противном случае он может работать так, как задумано, так как hadoop может генерировать несколько заданий редуктора, но будет сохранять только вывод одного из них (обычно того, который завершается первым).

person Simplefish    schedule 05.01.2014
comment
Спасибо за ответ. Это создает мне проблему. С каждым ключом у меня есть значение, которое является датой. Все похожие ключ/значение собираются в массив, их даты/значения вычитаются друг из друга, а разница отправляется в HDFS. Теперь, если похожий ключ входит в разные редукторы, массив будет неполным, и вывод будет не тем, который я хочу. Так что же является альтернативой в этом случае? - person shujaat; 06.01.2014
comment
Просто чтобы вы знали, что ключ, который входит в разные редукторы, также имеет разные значения. Есть 3 уникальных значения для ключа, и 2 из них поступают в один редуктор, а третий поступает в другой редуктор, что не имеет смысла. На мой взгляд, спекулятивное выполнение должно давать избыточные значения. - person shujaat; 06.01.2014

@shujaat - @simplefish не говорит, что разделение вывода является нормальным поведением, а несколько редукторов, обрабатывающих один ключ, являются нормальным поведением. Из Полного руководства по спекулятивному исполнению ниже.

Перейдите на страницу JobTracker.jsp и под заданием проверьте значения Reduce Input Records и Reduce Output Records в разделе Map-Reduce Framework, чтобы убедиться, что они совпадают.

Важно понимать, что спекулятивное выполнение не работает при запуске двух повторяющихся задач примерно в одно и то же время, чтобы они могли соперничать друг с другом. Это было бы пустой тратой ресурсов кластера. Скорее, спекулятивная задача запускается только после того, как все задачи для задания были запущены, а затем только для задач, которые выполнялись в течение некоторого времени (не менее минуты) и в среднем не смогли добиться такого большого прогресса. как и другие задачи с работы. Когда задача завершается успешно, все запущенные повторяющиеся задачи уничтожаются, поскольку они больше не нужны. Таким образом, если исходная задача завершается раньше спекулятивной задачи, то спекулятивная задача уничтожается; с другой стороны, если спекулятивная задача завершается первой, оригинал уничтожается.

person Jerry Ragland    schedule 06.01.2014
comment
Спасибо за ответ. Я понял, что сказал Simplefish и что вы говорите. Проблема, с которой я столкнулся, странная. С одним и тем же ключом существуют разные группы сокращения. См. вывод выше. В нем говорится, что у меня есть 3 разных группы сокращения, а я говорю, что их должно быть две, потому что есть 2 ключа. Я также отключил спекулятивное выполнение. Выход все тот же. - person shujaat; 07.01.2014