#hadoop #apache-pig
#hadoop #apache-pig
Вопрос:
В нашем рабочем процессе используется кластер AWS elastic map reduce для выполнения серии заданий Pig для обработки большого объема данных в агрегированных отчетах. К сожалению, входные данные потенциально противоречивы и могут привести либо к отсутствию входных файлов, либо к передаче файлов размером 0 байт в конвейер, либо даже к созданию на некоторых этапах конвейера.
Во время выполнения инструкции LOAD Pig завершается впечатляющим сбоем, если он либо не находит никаких входных файлов, либо любой из входных файлов имеет размер 0 байт.
Есть ли какой-нибудь хороший способ обойти это (надеюсь, в конфигурации Pig или скрипте или конфигурации кластера Hadoop, без написания пользовательского загрузчика …)?
(Поскольку мы используем AWS elastic map reduce, мы застряли с Pig 0.6.0 и Hadoop 0.20.)
Комментарии:
1. Я прекратил использовать Pig из-за подобных проблем. Также практически невозможно написать пользовательский загрузчик в версии 0.6.0 (они улучшили loader API в версии 0.8.0). Рассмотрите возможность использования Hive.
Ответ №1:
(Для потомков, мы предложили нестандартное решение:)
Чтобы справиться с проблемой 0 байт, мы обнаружили, что можем определить ситуацию и вместо этого вставить файл с одной новой строкой. Это вызывает сообщение типа:
Encountered Warning ACCESSING_NON_EXISTENT_FIELD 13 time(s).
но, по крайней мере, Pig не вылетает с исключением.
В качестве альтернативы, мы могли бы создать строку с соответствующим количеством 't'
символов для этого файла, которая позволила бы избежать предупреждения, но это привело бы к добавлению мусора в данные, которые нам затем пришлось бы отфильтровывать.
Эти же идеи можно было бы использовать для решения проблемы отсутствия входных файлов путем создания фиктивного файла, но у него есть те же недостатки, что перечислены выше.
Ответ №2:
Подход, который я использовал, заключается в запуске скриптов pig из командной строки. У меня есть одно задание, которое получает данные из шести разных входных каталогов. Итак, я написал фрагмент для каждого входного файла.
Оболочка проверяет существование входного файла и собирает окончательный сценарий pig из фрагментов.
Затем выполняется окончательный сценарий pig. Я знаю, что это немного похоже на подход Руба Голдберга, но пока все хорошо. 🙂