Amazon Ion — это один из форматов сериализации данных, который можно использовать при экспорте данных из DynamoDB в S3. Недавно я попытался выбрать данные из одного из таких экспортов с помощью Athena после использования Glue Crawler для создания схемы и таблицы. Это не сработало, и я получил странное сообщение об ошибке. В этом посте я покажу вам, как решить эту проблему. Если вы еще не знакомы с Ion, ознакомьтесь с более подробной информацией в моей недавней статье в блоге.
Сначала я должен объяснить, почему я хочу это сделать. DynamoDB — это база данных NoSQL, которая отлично подходит для данных с относительно статичными шаблонами доступа. Она легко обрабатывает огромные объемы данных с предсказуемой задержкой. Это отлично подходит для рабочих нагрузок OLTP, но аналитические рабочие нагрузки обычно имеют что угодно, только не статические шаблоны доступа. Поэтому я решил экспортировать данные в S3 и использовать сервис, который позволяет мне выполнять SQL-запросы к данным в S3 для выполнения моих аналитических запросов: Athena.
Чтобы Athena могла читать данные, нам нужна таблица в Glue Data Catalog, содержащая информацию о столбцах и структурах данных, а также место хранения и информацию о том, как данные должны быть прочитаны или записаны. Если вам не хочется заполнять всю эту информацию вручную, вы можете использовать Crawler для просеивания данных в S3 и создания таблиц на их основе. Именно это я и попытался сделать. Я развернул и запустил краулер, который создал для меня таблицу. На первый взгляд все выглядело отлично.
Когда я запросил данные из Athena, она ответила красивым сообщением об ошибке:
HIVE_UNSUPPORTED_FORMAT: Невозможно создать формат ввода.
Естественно, я попытался посмотреть на таблицу в Athena, чтобы понять, что происходит, но это не очень помогло. Она даже не показала мне оператора создания таблицы:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.NullPointerException
На этом этапе я немного раздражился. Я посмотрел на таблицу в Glue и запутался. Я увидел метку «Classification: ion», из-за которой казалось, что Crawler распознает формат данных. В приведенной ниже схеме он также правильно определил столбцы и типы данных в файлах.
По какой-то причине, однако, существенная информация отсутствует — нет настроенного Serde (Serializer / Deserializer), который бы сообщил системе, как данные могут быть прочитаны. Быстрый взгляд на документацию показал мне, что информация сериализатора состоит только из трех пар ключ-значение, которые являются статическими и никак не вычисляются. Я не понимаю, почему Crawler не смог их добавить.
Чтобы исправить это, вы просто добавляете значения в диалоге «Редактировать таблицу» в Glue, и она должна выглядеть следующим образом:
Вот удобная для копирования-вставки версия:
Input Format:
com.amazon.ionhiveserde.formats.IonInputFormat
Output Format:
com.amazon.ionhiveserde.formats.IonOutputFormat
Serde serialization lib
com.amazon.ionhiveserde.IonHiveSerDe
После этого мы можем повторно запустить исходный оператор и теперь должны увидеть данные в Athena:
Я не понимаю, почему Crawler не добавляет эту базовую информацию, но после разговора со службой поддержки AWS, похоже, что это известная ошибка, и команда обслуживания знает о ней. Исправят ли они ее или когда — как обычно, не сообщается.
Надеюсь, вы узнали что-то новое из этой статьи. Я буду рад любым вопросам, отзывам или опасениям.
— Морис
Title Photo by Torbjørn Helgesen on Unsplash