AWS Glue - как сканировать выходную папку Kinesis Firehose с S3 - PullRequest
0 голосов
/ 25 сентября 2018

У меня, как мне кажется, должен быть относительно простой вариант использования AWS Glue, но у меня много проблем с выяснением, как его реализовать.

У меня есть задание Kinesis Firehose, дампящее потоковые данныев ведро S3.Эти файлы состоят из серии отдельных событий просмотра веб-страниц, представленных в виде документов JSON с различной структурой (например, один документ может иметь поле «дата», но не поле «имя», тогда как другой может иметь «имя», но не «дата»).).

Я хочу запускать почасовые задания ETL для этих файлов, особенности которых не имеют отношения к данному вопросу.

Я пытаюсь запустить сканер каталога данных S3 ипроблема, с которой я сталкиваюсь, состоит в том, что выходной формат Kinesis - это не сам , а действительный JSON, что просто сбивает с толку.Вместо этого это набор документов JSON, разделенных переводом строки.Искатель может автоматически идентифицировать и анализировать файлы JSON, но не может это проанализировать.

Я думал о написании лямбда-функции для «исправления» файла Firehose, вызванного его созданием в корзине, но это звучит какдешевый обходной путь для двух частей, которые должны аккуратно совмещаться.

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

Я что-то упустил?Есть ли более простой способ синтаксического анализа выходных файлов Firehouse или, если это не сработает, обходя необходимость в гусеничном шасси?

ура и заранее спасибо

Ответы [ 4 ]

0 голосов
/ 28 марта 2019

Для меня это решило добавление поля новой строки '/ n' в конце каждой полезной нагрузки, отправляемой в firehose.

msg_pkg = (str(json_response) + '\n').encode('utf-8')
record = {'Data': msg_pkg}
put_firehose('agg2-na-firehose', record

Поскольку очевидно, что Hive JSON SerDe является значением по умолчанию, используемым для обработки данных json,После этого я смог сканировать данные json и читать их в Афине.

0 голосов
/ 26 сентября 2018

Похоже, вы описываете поведение Kinesis Firehose, которое объединяет несколько входящих записей в соответствии с некоторыми настройками буферизации (время и размер), а затем записывает записи в S3 как один объект. Доставка данных Firehose

Пакетирование нескольких записей в один файл важно, если рабочая нагрузка будет содержать большое количество записей, поскольку производительность (и затраты S3) для обработки множества небольших файлов изS3 может быть меньше оптимального.

Обнаружители клея AWS и задания ETL поддерживают обработку в формате 'JSON line' ( JSON ) с разделителями новой строки.

Если искатель имеетне удается запустить, включите журналы или сведения об ошибках (и, если возможно, продолжительность запуска искателя, а также количество созданных и обновленных таблиц.

Я видел сбой сканера в случае принудительной разницы в просматриваемых файлахон переходит в режим таблиц для файлов, и он достигает ограничения на количество таблиц. AWS Glue Limits

0 голосов
/ 03 января 2019

Мне удалось это исправить;в основном проблема заключалась в том, что не каждый документ JSON имел одинаковую базовую структуру.

Я написал лямбда-скрипт как часть процесса Kinesis, который принудительно вводил каждый документ в одну и ту же структуру, добавляя поля NULL, где это необходимо.После этого сканеры смогли правильно проанализировать полученные файлы и отобразить их в одну таблицу.

0 голосов
/ 25 сентября 2018

Не могли бы вы вставить несколько строк из файла json, созданного пожарным шлангом?Я запустил сканер файла json, сгенерированного Kinesis Streams, и он смог успешно его проанализировать.

Вы также пытались "преобразовать формат записи" при создании задания Firehose?Там вы можете указать каталог JSONSerDe или Glue для анализа ваших данных.

...