Apache Spark и Hive для обработки партиционированных Parquet-файлов

Автор Категория , , ,
Apache Spark и Hive для обработки партиционированных Parquet-файлов

Недавно мы писали про обновление хранилища метаданных Apache Hive с помощью команды MSCK REPAIR TABLE, операторов AirFlow и Spark-заданий. В продолжение этой темы про работу с партиционированными Parquet-файлами сегодня рассмотрим применение Spark SQL для этого случая, чтобы использовать таблицу Hive вместо временного представления Spark.

Временные таблицы Hive/Spark и разделы в Parquet-файлах

В API DataFrame Apache Spark есть функция createOrReplaceTempView(), которая создает или заменяет локальное временное представление новым датафреймом. Время жизни этой временной таблицы привязано к сеансу SparkSession. Однако, при ее использовании иногда возникает ошибка, когда Spark не может связать временное представление или таблицу с базой данных по умолчанию. Избежать этого поможет использование таблицы Hive вместо временного представления Spark.

Напомним, временные таблицы Hive создаются временно в рамках активного сеанса для хранения промежуточных данных. По завершении обработки можно явно удалить временную таблицу или завершить сеанс, что приведет к автоматическому удалению всех временных данных. Временные таблицы хранят данные не в каталоге хранилища Hive, а в рабочем каталоге пользователя /tmp/hive/<user>/* в HDFS.

Если временная таблица Apache Hive названа одинаковым именем с постоянной таблицей в этом NoSQL-хранилище, то в рамках текущего сеанса любые ссылки на постоянную таблицу будут перенаправляться во временную. При этом доступ к постоянной таблице не будет возможен в рамках текущего сеанса, пока временная таблица с тем же именем не будет удалена или переименована. Временные таблицы не поддерживают индексы и разделы.

Таким образом, партиционировать временную таблицу, т.е. разделить ее на разделы, нельзя. Поэтому применять вышеупомянутую функцию Spark SQL createOrReplaceTempView() для обработки Parquet-файлов, невозможно. Обойти это ограничение поможет небольшая последовательность действий, которую мы рассмотрим далее.

Тонкости обработки разделов

Напомним, NoSQL-хранилище Apache Hive предоставляет SQL-интерфейс для доступа к Hadoop HDFS, используя хранилище метаданных (Metastore) для сохранения информации о таблицах и каталог хранилища в HDFS для фактических данных. Основным файлом конфигурации этой NoSQL-СУБД является hive-site.xml, в котором клиенту Hive указывается, где найти хранилище метаданных и каталог данных. При предоставлении службы для удаленного приложения, такого как Spark, NoSQL-хранилище запускает Thrift-сервис, который по умолчанию используется на порту 9083 для подключения. Spark со своей стороны считывает параметр hive.metastore.uris, чтобы узнать адрес Thrift-сервиса, который определен в файле hive-site.xml в каталоге конфигурации Spark. Также необходимо установить два других параметра Spark, связанных с Hive: HIVE_HOME и PATH.

После подключение Apache Hive к Spark, можно прочитать партиционированный Parquet-файл из HDFS во внешнюю таблицу Hive средствами Spark SQL, используя выражение partitioned by в запросе create external table. При этом при создании этой таблицы следует сразу определить ее схему, т.е. столбцы и их типы данных, а также обязательно указать в выражении partitioned by столбец разделения, если входные данные являются партиционированными Parquet-файлами. Если этого не сделать, возникнут при применении команд, связанных с разделами.

Далее следует сообщить хранилищу метаданных Hive информацию о разделах таблицы, применив к ней команду MSCK REPAIR TABLE. Как мы уже рассматривали здесь, эта команда обновляет хранилище метаданных. После этого можно выполнять SQL-запросы к этой партиционированной таблице Hive, включая модификации разделов. При удалении раздела с помощью выражения drop if exists partition в команде изменения таблицы ALTER TABLE раздел удаляется из хранилища метаданных. Но фактические данные, связанные с этим разделом, все еще находятся на диске, т.к. это внешняя таблица Hive, сам файл данных при удалении разделов не модифицируется.

Больше практических примеров по работе с Apache Spark и Hive для эффективной аналитики больших данных вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.DataFrame.createOrReplaceTempView.html
  2. https://medium.com/@fengliplatform/using-spark-hive-to-manipulate-partitioned-parquet-files-5264eb9b857f
  3. https://sparkbyexamples.com/apache-hive/hive-temporary-table-usage-and-how-to-create/
  4. https://medium.com/@fengliplatform/talking-to-apache-hive-from-spark-part-1-getting-hive-ready-7bc79aee43b6