Получить данные, вызвавшие сбой задания MapReduce

Есть много ситуаций, когда я пишу программу обработки данных, а новые ошибки обнаруживаются только на больших наборах данных. Например, рассмотрим скрипт, который дает сбой в 1 из 100 миллионов записей (из-за неожиданного ввода или чего-то еще); если я разрабатываю его на небольшой выборке данных, я не увижу эту ошибку. Все, что я могу сделать, это посмотреть на журналы ошибок Hadoop, настроить сценарий, а затем перезапустить всю работу. Это ужасно неэффективно как с точки зрения вычислений, так и времени разработки.

Что мне нужно, так это способ загрузить сегмент данных, который скрипт обрабатывал при сбое.

Есть ли простой способ получить это из Hadoop? (И в идеале, Hadoop Streaming?)

Несколько лет назад я научился какому-то ужасному трюку с копанием временных каталогов, которые создает сам Hadoop... хотя это не кажется хорошим решением, и я надеялся, что к настоящему времени есть что-то получше.


person Brendan OConnor    schedule 28.10.2012    source источник


Ответы (2)


Что мне нужно, так это способ загрузить сегмент данных, который скрипт обрабатывал при сбое.

Описание «keep.failed.task.files»: «Должны ли храниться файлы для неудачных задач. Это следует использовать только для заданий, которые терпят неудачу, потому что хранилище никогда не восстанавливается. Это также предотвращает стирание выходных данных карты из сокращать каталог по мере их использования».

По умолчанию установлено значение false. Измените это свойство на true, и данные должны быть доступны в случае сбоя задачи. Данные могут быть переданы на компьютер разработчика и программа отлажена. легко в Eclipse.

Все, что я могу сделать, это посмотреть на журналы ошибок Hadoop, настроить сценарий, а затем перезапустить всю работу. Это ужасно неэффективно как с точки зрения вычислений, так и времени разработки.

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

person Praveen Sripati    schedule 29.10.2012

Я предлагаю поместить блок try-catch вокруг логики в ваших методах setup(), map(), reduce() и cleanup(). В блоке catch для Exception увеличивается счетчик, группа которого — «Exception» (или что-то еще) и чье имя — строка, возвращаемая из метода getMessage() исключения. Это позволит вам узнать с первого взгляда, по крайней мере, что произошло. В этом блоке catch вы также можете записать в файл дополнительную информацию, включая трассировку стека, переданные ключ и значение (или произносимое) и т. д.

Для отладки мне также нравится "Отладка как... -> Java-приложение" для потока Hadoop в Eclipse. Это помогло мне найти и исправить кучу проблем в моем коде.

person Chris Gerken    schedule 28.10.2012