Как вы справляетесь с пустыми или отсутствующими входными файлами в Apache Pig?

#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. Я знаю, что это немного похоже на подход Руба Голдберга, но пока все хорошо. 🙂