Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Apache Hive
Содержание
История
Описание
Будучи построенным на Apache Hadoop обеспечивает:
Hive определяет простой SQL-подобный язык запросов, называемый HiveQL (Hive Query Language), что позволяет пользователям, знакомым с SQL легко работать с запросами к данным. HiveQL имеет функции для работы с форматами XML и JSON, поддержку нескалярных типов данных, таких как массивы, структуры, ассоциативные массивы, поддерживает широкий набор агрегирующих функций, определяемые пользователем функции (User Defined Functions), блокировки. В то же время, этот язык позволяет программистам, которые знакомы со структурой MapReduce, подключить свои пользовательских карты для выполнения более сложного анализа, который может быть не поддерживаемым встроенными возможностями языка. HiveQL может быть расширен с пользовательскими скалярных функций (UDF), агрегаций (UDAF годов), и табличных функций (UDTF).
Hive не требует, чтобы записываемые/считываемые данные быть в формате «Hive». Hive работает одинаково хорошо с, как со своими, так и с пользовательскими специализированными форматами данных. Для того, чтобы узнать, с чем может работать Hive, пожалуйста, смотрите главу «Форматы файлов» в Руководстве разработчика.
Hive не предназначен для OLTP нагрузок и не предлагает выполнения запросов в режиме реального времени или обновлений. Лучше всего использовать для пакетных заданий на больших наборах добавляемых данных (например, веб-журналы). За что Hive ценится больше всего, так это за масштабируемость (расширяется динамически при добавлении машины к кластеру Hadoop), расширяемость (при помощи MapReduce и UDF / UDAF / UDTF), отказоустойчивость и способность не привязываться к формату входных данных.
Возможности
Компоненты Hive включают в себя HCatalog и WebHCat:
В настоящее время в Hive поддерживаются 4 формата данных: TEXTFILE, SEQUENCEFILE, ORC и RCFILE. Apache Parquet может быть прочитан через плагин в версиях позже 0.10.
Остальные возможности, которые включает в себя Hive:
Безопасность
В версии Hive 0.7.0 была добавлена интеграция с безопасностью Hadoop. Hadoop начал использовать поддержку авторизации Kerberos для обеспечения безопасности. Kerberos допускает взаимную аутентификацию между клиентом и сервером. В этой системе запрос клиента на билет передается вместе с запросом. В предыдущих версиях Hadoop было несколько проблем, например, пользователи могли подделывать свое имя пользователя, задав свойство hadoop.job.ugi, а также операции MapReduce, выполняемые под одним и тем же пользователем: hadoop или mapred. Благодаря интеграции Hive версии 0.7.0 с безопасностью Hadoop эти проблемы в основном были устранены. Задания TaskTracker запускаются пользователем, который его запустил, и имя пользователя больше не может быть подделано путем установки свойства hadoop.job.ugi. Разрешения для вновь созданных файлов в Hive определяются HDFS (Hadoop Distributed File System). Модель авторизации распределенной файловой системы Hadoop использует три объекта: пользователь, группу и другие с тремя разрешениями: чтение, запись и выполнение. Разрешения по умолчанию для вновь создаваемых файлов можно установить, изменив значение umask для переменной конфигурации Hive hive.files.umask.value.
Форматы хранения данных
Текстовые файл
Формат текстового файла используется по умолчанию для Hive. Он использует четыре разделителя для разделения выходного или входного файла на строки, столбцы и сложные типы данных. Это может быть явно выражено с помощью выражения
Определение разделителей следует за определением схемы таблицы и должно иметь префикс:
описывает разделение строк по умолчанию на символ новой строки. К сожалению, этот разделитель не может быть установлен на что-либо еще, кроме новой строки. Чаще всего разделитель полей изменяется на запятую
Файл последовательности(SequenceFile)
Формат SequenceFile является значением по умолчанию в Hadoop и хранит данные в двоичных парах ключ-значение. Он оптимизирован для быстрого ввода-вывода и размера блока. Большинство инструментов в экосистеме Hadoop могут читать формат SequenceFile.
Hive сохранил свои данные строки в части значения пар. Этот формат более эффективен, чем простой текст, и его можно сжимать с доступными форматами в Hadoop либо по значению (строка), либо по блоку (блок данных). Последнее, как правило, более эффективно, так как сжатие с большей вероятностью находит приводимые шаблоны в большом блоке данных, чем в строке.
Недостаток этого формата заключается в том, что Hive должен читать и анализировать каждую строку для каждого запроса (при условии отсутствия разбиения), чтобы выполнить условия запроса для него. Это может привести к ненужным операциям чтения, если только несколько строк или несколько столбцов имеют отношение к запросу.
Файл столбцов строк(RCFile)
Формат файла столбцов строк (RCFile) объединяет принципы хранения, ориентированные на строки и столбцы. В каждом файле хранится одна или несколько групп строк, которые представляют собой количество строк. Сами группы строк хранятся в столбчатой структуре.
Например, файл может хранить строки 1–1 000 в первой группе и строки 1 001–2 000 в следующей и обе группы в одном RCFile. Сама группа строк хранит все столбцы вместе. Первая группа затем сохранит первый столбец строки с 1 по 1000, а затем следующий столбец и так далее.
Преимущество группировки столбцов заключается в более эффективном сжатии, поскольку сходные данные находятся рядом друг с другом. Что более важно, условия запроса могут быть переданы для чтения только соответствующих частей таблицы. Это особенно полезно для широких таблиц и запросов, которые применяются только к нескольким столбцам. В этих случаях Hive может пропускать большие части данных для экономии времени ввода-вывода и вычислительного времени.
ORC файл
Пример работы
При работе с hive можно выделить следующие объекты которыми оперирует hive:
База данных
База данных представляет аналог базы данных в реляционных СУБД. База данных представляет собой пространство имён, содержащее таблицы. Команда создания новой базы данных выглядит следующим образом:
Database и Schema в данном контексте это одно и тоже. Необязательная добавка IF NOT EXISTS как не сложно догадаться создает базу данных только в том случае если она еще не существует.
Пример создания базы данных:
Для переключения на соответствующую базу данных используем команду USE :
Таблица
Таблица в hive представляет из себя аналог таблицы в классической реляционной БД. Основное отличие — что данные hive’овских таблиц хранятся прост в виде обычных файлов на hdfs. Это могут быть обычные текстовые csv-файлы, бинарные sequence-файлы, более сложные колоночные paruqet-файлы и другие форматы. Но в любом случае данные, над которыми настроена hive-таблица очень легко прочитать и не из hive.
Таблицы в hive бывают двух видов:
Классическая таблица, данные в которую добавляются при помощи hive. Вот пример создания такой таблицы (источник примера):
Загрузить данные мы сможем при помощи следующей команды:
После hive переместит данныe, хранящемся в нашем файле в хранилище hive. Убедиться в этом можно прочитав данные напрямую из файла в хранилище hive в hdfs:
Классические таблицы можно также создавать как результат select-запроса к другим таблицам:
Кстати говоря, SELECT для создания таблицы в данном случае уже запустит mapreduce-задачу.
Внешняя таблица, данные в которую загружаются внешними системами, без участия hive. Для работы с внешними таблицами при создании таблицы нужно указать ключевое слово EXTERNAL, а также указать путь до папки, по которому хранятся файлы:
После этого таблицей можно пользоваться точно так же как и обычными таблицами hive. Самое удобное в этом, что вы можете просто скопировать файл в нужную папочку в hdfs, а hive будет автоматом подхватывать новые файлы при запросах к соответствующей таблице. Это очень удобно при работе например с логами.
Партиция (partition)
Так как hive представляет из себя движок для трансляции SQL-запросов в mapreduce-задачи, то обычно даже простейшие запросы к таблице приводят к полному сканированию данных в этой таблицы. Для того чтобы избежать полного сканирования данных по некоторым из колонок таблицы можно произвести партиционирование этой таблицы. Это означает, что данные относящиеся к разным значениям будут физически храниться в разных папках на HDFS.
Для создания партиционированной таблицы необходимо указать по каким колонкам будет произведено партиционирование:
При заливке данных в такую таблицу необходимо явно указать, в какую партицию мы заливаем данные:
Посмотрим теперь как выглядит структура директорий:
Видно, что структура директорий выглядит таким образом, что каждой партиции соответствует отдельная папка на hdfs. Теперь, если мы будем запускать какие-либо запросы, у казав в условии WHERE ограничение на значения партиций — mapreduce возьмет входные данные только из соответствующих папок.
В случае External таблиц партиционирование работает аналогичным образом, но подобную структуру директорий придется создавать вручную.
Партиционирование очень удобно например для разделения логов по датам, так как правило любые запросы за статистикой содержат ограничение по датам. Это позволяет существенно сократить время запроса.
Установка
Big Data от A до Я. Часть 5.1: Hive — SQL-движок над MapReduce
Привет, Хабр! Мы продолжаем наш цикл статьей, посвященный инструментам и методам анализа данных. Следующие 2 статьи нашего цикла будут посвящены Hive — инструменту для любителей SQL. В предыдущих статьях мы рассматривали парадигму MapReduce, и приемы и стратегии работы с ней. Возможно многим читателям некоторые решения задач при помощи MapReduce показались несколько громоздкими. Действительно, спустя почти 50 лет после изобретения SQL, кажется довольно странным писать больше одной строчки кода для решения задач вроде «посчитай мне сумму транзакций в разбивке по регионам».
С другой стороны, классические СУБД, такие как Postgres, MySQL или Oracle не имеют такой гибкости в масштабировании при обработке больших массивов данных и при достижении объема большего дальнейшая поддержка становится большой головоной болью.
Собственно, Apache Hive был придуман для того чтобы объединить два этих достоинства:
Общее описание
Hive появился в недрах компании Facebook в 2007 году, а через год исходники hive были открыты и переданы под управление apache software foundation. Изначально hive представлял собой набор скриптов поверх hadoop streaming (см 2-ю статью нашего цикла), позже развился в полноценный фреймворк для выполнения запросов к данным поверх MapReduce.
Актуальная версия apache hive(2.0) представляет собой продвинутый фреймворк, который может работать не только поверх фреймворка Map/Reduce, но и поверх Spark(про спарк у нас будут отдельные статьи в цикле), а также Apache Tez.
Apache hive используют в production такие компании как Facebook, Grooveshark, Last.Fm и многие другие. Мы в Data-Centric alliance используем HIve в качестве основного хранилища логов нашей рекламной платформы.
Архитектура
Hive представляет из себя движок, который превращает SQL-запросы в цепочки map-reduce задач. Движок включает в себя такие компоненты, как Parser(разбирает входящие SQL-запрсоы), Optimimer(оптимизирует запрос для достижения большей эффективности), Planner (планирует задачи на выполнение) Executor(запускает задачи на фреймворке MapReduce.
Для работы hive также необходимо хранилище метаданных. Дело в том что SQL предполагает работу с такими объектами как база данных, таблица, колонки, строчки, ячейки и тд. Поскольку сами данные, которые использует hive хранятся просто в виде файлов на hdfs — необходимо где-то хранить соответствие между объектами hive и реальными файлами.
В качестве metastorage используется обычная реляционная СУБД, такая как MySQL, PostgreSQL или Oracle.
Command line interface
Для того чтобы попробовать работу с hive проще всего воспользоваться его командной строкой. Современная утилита для работы с hive называется beeline (привет нашим партнёрам из одноименного оператора 🙂 ) Для этого на любой машине в hadoop-кластере (см. наш туториал по hadoop) с установленным hive достаточно набрать команду.
Далее необходимо установить соединение с hive-сервером:
Data Units
При работе с hive можно выделить следующие объекты которыми оперирует hive:
База данных
База данных представляет аналог базы данных в реляционных СУБД. База данных представляет собой пространство имён, содержащее таблицы. Команда создания новой базы данных выглядит следующим образом:
Database и Schema в данном контексте это одно и тоже. Необязательная добавка IF NOT EXISTS как не сложно догадаться создает базу данных только в том случае если она еще не существует.
Пример создания базы данных:
Для переключения на соответствующую базу данных используем команду USE:
Таблица
Таблица в hive представляет из себя аналог таблицы в классической реляционной БД. Основное отличие — что данные hive’овских таблиц хранятся просто в виде обычных файлов на hdfs. Это могут быть обычные текстовые csv-файлы, бинарные sequence-файлы, более сложные колоночные parquet-файлы и другие форматы. Но в любом случае данные, над которыми настроена hive-таблица очень легко прочитать и не из hive.
Таблицы в hive бывают двух видов:
Классическая таблица, данные в которую добавляются при помощи hive. Вот пример создания такой таблицы (источник примера):
Загрузить данные мы сможем при помощи следующей команды:
После hive переместит данныe, хранящемся в нашем файле в хранилище hive. Убедиться в этом можно прочитав данные напрямую из файла в хранилище hive в hdfs:
Классические таблицы можно также создавать как результат select-запроса к другим таблицам:
Кстати говоря, SELECT для создания таблицы в данном случае уже запустит mapreduce-задачу.
Внешняя таблица, данные в которую загружаются внешними системами, без участия hive. Для работы с внешними таблицами при создании таблицы нужно указать ключевое слово EXTERNAL, а также указать путь до папки, по которому хранятся файлы:
После этого таблицей можно пользоваться точно так же как и обычными таблицами hive. Самое удобное в этом, что вы можете просто скопировать файл в нужную папочку в hdfs, а hive будет автоматом подхватывать новые файлы при запросах к соответствующей таблице. Это очень удобно при работе например с логами.
Партиция (partition)
Так как hive представляет из себя движок для трансляции SQL-запросов в mapreduce-задачи, то обычно даже простейшие запросы к таблице приводят к полному сканированию данных в этой таблицы. Для того чтобы избежать полного сканирования данных по некоторым из колонок таблицы можно произвести партиционирование этой таблицы. Это означает, что данные относящиеся к разным значениям будут физически храниться в разных папках на HDFS.
Для создания партиционированной таблицы необходимо указать по каким колонкам будет произведено партиционирование:
При заливке данных в такую таблицу необходимо явно указать, в какую партицию мы заливаем данные:
Посмотрим теперь как выглядит структура директорий:
Видно, что структура директорий выглядит таким образом, что каждой партиции соответствует отдельная папка на hdfs. Теперь, если мы будем запускать какие-либо запросы, у казав в условии WHERE ограничение на значения партиций — mapreduce возьмет входные данные только из соответствующих папок.
В случае External таблиц партиционирование работает аналогичным образом, но подобную структуру директорий придется создавать вручную.
Партиционирование очень удобно например для разделения логов по датам, так как правило любые запросы за статистикой содержат ограничение по датам. Это позволяет существенно сократить время запроса.
Бакет
Партиционирование помогает сократить время обработки, если обычно при запросах известны ограничения на значения какого-либо столбца. Однако оно не всегда применимо. Например — если количество значений в столбце очень велико. Напрмер — это может быть ID пользователя в системе, содержащей несколько миллионов пользователей.
В этом случае на помощь нам придет разделение таблицы на бакеты. В один бакет попадают строчки таблицы, для которых значение совпадает значение хэш-функции вычисленное по определенной колонке.
При любой работе с бакетированными таблицами необходимо не забывать включать поддержку бакетов в hive (иначе hive будет работать с ними как с обычными таблицами):
Для создания таблицы разбитой на бакеты используется конструкция CLUSTERED BY
Так как команда Load используется для простого перемещения данных в хранилище hive — в данном случае для загрузки она не подходит, так как данные необходимо предобработать, правильно разбив их на бакеты. Поэтому их нужно загрузить при помощи команды INSERT из другой таблицы(например из внешней таблицы):
После выполнения команды убедимся, что данные действительно разбились на 10 частей:
Теперь при запросах за данными, относящимися к определенному пользователю, нам не нужно будет сканировать всю таблицу, а только 1/10 часть этой таблицы.
Checklist по использованию hive
Теперь мы разобрали все объекты, которыми оперирует hive. После того как таблицы созданы — можно работать с ними, так как с таблицами обычных баз данных. Однако не стоит забывать о том что hive — это все же движок по запуску mapreduce задач над обычными файлами, и полноценной заменой классическим СУБД он не является. Необдуманное использование таких тяжелых команд, как JOIN может привести к очень долгим задачам. Поэтому прежде чем строить вашу архитектуру на основе hive — необходимо несколько раз подумать. Приведем небольшой checklist по использованию hive:
Заключение
В данной статье мы разобрали архитектуру hive, data unit-ы, которыми оперирует hive, привели примеры по созданию и заполнению таблиц hive. В следующей статье цикла мы рассмотрим продвинутые возможности hive, включающие в себя:
Обзор Apache Hive и HiveQL в Azure HDInsight
Apache Hive — это система хранилища данных для Apache Hadoop. Hive позволяет обобщать, запрашивать и анализировать данные. Запросы Hive создаются на языке запросов HiveQL, который похож на SQL.
Hive позволяет создавать структуру для преимущественно неструктурированных данных. После определения структуры вы можете использовать HiveQL для запроса этих данных без знания Java или MapReduce.
HDInsight предоставляет несколько типов кластера, которые подходят для конкретных рабочих нагрузок. Для запросов Hive наиболее часто используются следующие типы кластеров:
| Тип кластера | Описание |
|---|---|
| Интерактивный запрос | Кластер Hadoop, который обеспечивает функцию аналитической обработки с низкой задержкой (LLAP) для оптимизации времени ответа для интерактивных запросов. Дополнительные сведения см. в статье Использование Interactive Hive с HDInsight (предварительная версия). |
| Hadoop | Кластер Hadoop, который предназначен для рабочих нагрузок пакетной обработки. Дополнительные сведения см. в статье Приступая к работе с Apache Hadoop в HDInsight. |
| Spark | Apache Spark содержит встроенные функциональные возможности для работы с Hive. Дополнительные сведения см. в статье Приступая к работе с Apache Spark в HDInsight. |
| HBase | HiveQL может использоваться для создания запросов данных, хранимых в Apache HBase. Дополнительные сведения см. в статье Приступая к работе с Apache HBase в HDInsight. |
Как использовать Hive
В следующей таблице показаны различные способы использования Hive в HDInsight:
| Используйте этот метод, если требуется: | . интерактивные запросы | . пакетная обработка | . из этого кластера операционной системы |
|---|---|---|---|
| Средства HDInsight для Visual Studio Code | ✔ | ✔ | Linux, Unix, Mac OS X или Windows |
| Средства HDInsight для Visual Studio | ✔ | ✔ | Windows |
| Представление Hive | ✔ | ✔ | Для приложений на основе браузера |
| клиент Beeline | ✔ | ✔ | Linux, Unix, Mac OS X или Windows |
| REST API | ✔ | Linux, Unix, Mac OS X или Windows | |
| Windows PowerShell | ✔ | Windows |
Справочник по языку HiveQL
Справочник по языку HiveQL доступен на странице руководства по языку.
Hive и структура данных
Hive поддерживает работу со структурированными и частично структурированными данными. Например, с текстовыми файлами, в которых поля разделяются с помощью определенных знаков. С помощью следующей инструкции HiveQL создается таблица для данных, разделенных пробелами:
Hive также поддерживает пользовательские сериализаторы/десериализаторы (SerDe) для сложных или беспорядочно структурированных данных. Дополнительные сведения см. в документе How to use a custom JSON SerDe with HDInsight (Как использовать настраиваемую сериализацию-десериализациюJSON с HDInsight).
Сравнение внутренних и внешних таблиц Hive
Существует два типа таблиц, которые вы можете создать с помощью Hive:
Используйте внутренние таблицы, если выполняется одно из следующих условий:
Внешняя: данные хранятся за пределами хранилища данных. Данные могут храниться в любом хранилище, доступном для кластера.
Используйте внешние таблицы, если выполняется одно из следующих условий:
Дополнительные сведения см. в записи блога HDInsight: Hive Internal and External Tables Intro (HDInsight: введение во внутренние и внешние таблицы Hive).
Определяемые пользователем функции (UDF)
Инфраструктура Hive также может быть расширена с помощью определяемых пользователем функций (UDF). UDF позволяет реализовать функции или логику, сложно моделируемые в HiveQL. Примеры использования определяемых пользователем функций с Hive приведены в следующих документах:
Демонстрационные данные
Пример запроса Hive
В предыдущем примере операторы HiveQL выполняют следующие действия.
Внешние таблицы следует использовать, если исходные данные должны обновляться с использованием внешних источников. Например, процессом автоматизированной передачи данных или другой операцией MapReduce.
Удаление внешней таблицы не приводит к удалению данных; будет удалено только описание таблицы.
Для создания внутренней таблицы вместо внешней используйте следующий запрос HiveQL.
Эти операторы выполняют следующие действия:
В отличие от внешних таблиц, удаление внутренней таблицы приводит к удалению базовых данных.
Повышение производительности запросов Hive
Apache Tez
Apache Tez — это платформа, которая позволяет повысить производительность приложений, обрабатывающих большие объемы данных (включая Hive). Tez включена по умолчанию. Раздел Документация по работе Apache Hive на Tez содержит дополнительные сведения о реализации этого решения и вариантах настроек.
Аналитическая обработка с низкой задержкой (LLAP)
LLAP (иногда называемая Live Long and Process) — это новая функция в Hive 2.0, которая разрешает кэширование запросов в памяти. LLAP создает запросы Hive гораздо быстрее — в некоторых случаях в 26 раз быстрее, чем Hive версии 1.x.
HDInsight предоставляет LLAP в кластере интерактивных запросов. Дополнительные сведения см. в статье Использование Interactive Hive с HDInsight (предварительная версия).
Планирование запросов Hive
Есть несколько служб, которые поддерживают запросы Hive в рамках рабочего процесса по расписанию или по требованию.
Фабрика данных Azure
Фабрика данных Azure позволяет использовать HDInsight как часть конвейера фабрики данных. Дополнительные сведения об использовании Hive из конвейера см. в документе Преобразование данных с помощью действия Hadoop Hive в фабрике данных Azure.
Задания Pig и SQL Server Integration Services
С помощью служб SQL Server Integration Services (SSIS) можно выполнить задание Hive. Пакет дополнительных компонентов Azure для служб SSIS предоставляет следующие компоненты, которые работают с заданиями Hive в HDInsight.
Дополнительные сведения см. в документации по пакету функций Azure.
Apache Oozie
Apache Oozie — это система рабочих процессов и координации, управляющая заданиями Hadoop. Дополнительные сведения см. в статье об использовании Apache Oozie с Hive для определения и запуска рабочего процесса.
Дальнейшие действия
Теперь, когда вы знаете, что такое инфраструктура Hive и как ее использовать с Hadoop в HDInsight, воспользуйтесь следующими ссылками, чтобы изучить другие способы работы с Azure HDInsight.