Apache Hive

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 18:32, 31 мая 2020.
Open book.svg Авторство
Н. Д. Щеглов
Согласовано: 18 декабря 2017 года
Apache Hive
Apache Hive
Создатели: Facebook
Разработчики: Contributors
Постоянный выпуск: 3.1.2 / 26 August 2019 года; 16 months ago (2019-08-26)
Состояние разработки: Активное
Написана на: Java
Операционная система: Кросс-платформенное
Тип ПО: Хранилище данных
Лицензия: Apache License 2.0
Веб-сайт hive.apache.org

Apache Hive - программное обеспечение, используемое хранилищами данных. Облегчает использование запросов и управление большими объемами данных, находящихся в распределенных хранилищах. Hive предоставляет механизм проектирования структур для этих данных и позволяет создавать запросы с использованием SQL -подобного языка, называемым HiveQL. В то же время этот язык позволяет программистам использовать их собственные запросы, когда неудобно или неэффективно использовать логику в HiveQL[Источник 1].

История

Hive была разработана корпорацией [Facebook] в 2008 году, а затем передан под открытой лицензией в собственность фонду Apache Software Foundation. На сегодняшний день эта система используется компанией Netflix и доступна в Amazon Web Services через Amazon Elastic MapReduce[Источник 2].

Описание

Будучи построенным на Apache Hadoop обеспечивает:

  • Инструменты для быстрого извлечения, изменения и загрузки данных
  • Механизм преобразования структуры в различные форматы данных
  • Доступ к файлам, расположенным либо напрямую в Apache HDFSTM или в других системах хранения данных, таких как Apache HBase
  • Выполнение запросов через MapReduce.

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), отказоустойчивость и способность не привязываться к формату входных данных.

Возможности

Для тех, кто знаком с SQL или реляционными базами данных, этот раздел будет очень знакомым. Как и в любой системе управления базами данных (СУБД), в Hive можно запускать запросы несколькими способами. Можете запустить их с помощью интерфейса командной строки (Hive Shell), с подключением БД Java или подключением к Open Database Connectivity, используя драйвера Hive или с помощью Экономного Hive клиента. Этот клиент такой же, как и любой другой клиент баз данных, который установлен на пользовательском компьютере (или в среднем уровне трехуровневой архитектуры): он общается с сервисами Hive, работающими на сервере. Можно использовать данный клиент в приложениях, написанных на C++ , Java , PHP, Python , Ruby , , Go(а так же, можно использовать эти клиентские языки со встроенным SQL для доступа к базам данных, таким как DB2 или Informix).

Компоненты Hive включают в себя HCatalog и WebHCat:

  • HCatalog является компонентом Hive. Это уровень управления таблицами и хранилищами Hadoop, который снабжает пользователей различными инструментами обработки данных - в том числе MapReduce и Pig - для более простого чтения и записи данных.
  • WebHCat предоставляет услуги, которые можно использовать для запуска Hadoop MapReduce, Pig, работы Hive или выполнять операции с метаданными Hive, используя интерфейс HTTP (стиль REST).

В настоящее время в Hive поддерживаются 4 формата данных: TEXTFILE, SEQUENCEFILE, ORC и RCFILE. Apache Parquet может быть прочитан через плагин в версиях позже 0.10.

Остальные возможности, которые включает в себя Hive:

  • Индексация для увеличения ускорения.
  • Различные типы хранения данных, такие как: простой текст, файл конфигурации, HBase, ORC, и другие.
  • Хранение метаданных в СУБД, что значительно снижает время на выполнение семантических проверок во время выполнения запроса.
  • Оперирование со сжатыми данными, хранящимися системе Hadoop с использованием таких алгоритмов, как DEFLATE, BWT и т.д.
  • Встроенные пользовательские функции (UDF), чтобы манипулировать датами, строками и другими инструментами обработки данных. Hive поддерживает расширения UDF для обработки сценариев использования, не поддерживаемых встроенными функциями.
  • SQL - запросы (HiveQL), которые неявно преобразуются в MapReduce или Tez, или Spark jobs.

Безопасность

В версии 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.

Форматы хранения данных

Текстовые файл

 1 CREATE TABLE country (
 2     name STRING,
 3     states ARRAY<STRING>,
 4     cities_and_size MAP<STRING, INT>,
 5     parties STRUCT<name STRING, votes FLOAT, members INT>
 6 )
 7 ROW FORMAT DELIMITED
 8 FIELDS TERMINATED BY '\001'
 9 COLLECTION ITEMS TERMINATED BY '\002'
10 MAP KEYS TERMINATED BY '\003'
11 LINES TERMINATED BY '\n'
12 STORED AS TextFile;

Формат текстового файла используется по умолчанию для Hive. Он использует четыре разделителя для разделения выходного или входного файла на строки, столбцы и сложные типы данных. Это может быть явно выражено с помощью выражения

STORED AS TextFile.

Определение разделителей следует за определением схемы таблицы и должно иметь префикс:

ROW FORMAT DELIMITED

Вырожение

LINES TERMINATED BY '\n'

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

FIELDS TERMINATED BY ','
или tab
FIELDS TERMINATED BY '\ t'

По умолчанию 0x01 или ^ A, также известный как Ctrl-A. По умолчанию для элементов коллекции - 0x02 и 0x03 для ключей карты. Важно понимать, что Hive не поддерживает экранированные символы. Например, лист, сохраненный в виде файла CSV из Excel, может быть отформатирован в двойных кавычках, чтобы экранировать запятые в полях.

Файл последовательности(SequenceFile)

1 CREATE TABLE country (name STRING, population INT)
2 STORED AS SequenceFile;

Формат SequenceFile является значением по умолчанию в Hadoop и хранит данные в двоичных парах ключ-значение. Он оптимизирован для быстрого ввода-вывода и размера блока. Большинство инструментов в экосистеме Hadoop могут читать формат SequenceFile.

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

Недостаток этого формата заключается в том, что Hive должен читать и анализировать каждую строку для каждого запроса (при условии отсутствия разбиения), чтобы выполнить условия запроса для него. Это может привести к ненужным операциям чтения, если только несколько строк или несколько столбцов имеют отношение к запросу.

Файл столбцов строк(RCFile)

1 CREATE TABLE country (name STRING, population INT)
2 STORED AS RCFile;

Формат файла столбцов строк (RCFile) объединяет принципы хранения, ориентированные на строки и столбцы. В каждом файле хранится одна или несколько групп строк, которые представляют собой количество строк. Сами группы строк хранятся в столбчатой структуре.

Например, файл может хранить строки 1–1 000 в первой группе и строки 1 001–2 000 в следующей и обе группы в одном RCFile. Сама группа строк хранит все столбцы вместе. Первая группа затем сохранит первый столбец строки с 1 по 1000, а затем следующий столбец и так далее.

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

ORC файл

Формат файла ORC стал общедоступным с Hive версии 0.11, хотя некоторые его функции еще не полностью реализованы. ORC следует рассматривать как альтернативу RCFile. ORC выходит за рамки RCFile и представляет оптимизированное для столбцов хранилище (например, кодирование переменной длины для целых чисел), большие размеры блоков (лучший дисковый ввод-вывод и меньшее количество файлов с меньшей загрузкой namenode), базовую статистику по столбцам в файле и простые файловые индексы для пропуска целых групп строк если они не соответствуют запросу.[Источник 3].

Пример работы

При работе с hive можно выделить следующие объекты которыми оперирует hive:

  • База данных
  • Таблица
  • Партиция (partition)
  • Бакет (bucket)

База данных

База данных представляет аналог базы данных в реляционных СУБД. База данных представляет собой пространство имён, содержащее таблицы. Команда создания новой базы данных выглядит следующим образом:

CREATE DATABASE|SCHEMA [IF NOT EXISTS] <database name>

Database и Schema в данном контексте это одно и тоже. Необязательная добавка IF NOT EXISTS как не сложно догадаться создает базу данных только в том случае если она еще не существует.

Пример создания базы данных:

CREATE DATABASE userdb;

Для переключения на соответствующую базу данных используем команду USE:

USE userdb;

Таблица

Таблица в hive представляет из себя аналог таблицы в классической реляционной БД. Основное отличие — что данные hive’овских таблиц хранятся прост в виде обычных файлов на hdfs. Это могут быть обычные текстовые csv-файлы, бинарные sequence-файлы, более сложные колоночные paruqet-файлы и другие форматы. Но в любом случае данные, над которыми настроена hive-таблица очень легко прочитать и не из hive.

Таблицы в hive бывают двух видов:

Классическая таблица, данные в которую добавляются при помощи hive. Вот пример создания такой таблицы (источник примера):

CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String)
COMMENT 'Employee details'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

Тут мы создали таблицу, данные в которой будут храниться в виде обычных csv-файлов, колонки которой разделены символом табуляции. После этого данные в таблицу можно загрузить. Пусть у нашего пользователя в домашней папке на hdfs есть (напоминаю, что загрузить файл можно при помощи hadoop fs -put) файл sample.txt вида:

1201	Gopal	45000	Technical manager
1202	Manisha	45000	Proof reader
1203	Masthanvali	40000	Technical writer
1204	Kiran	40000	Hr Admin
1205	Kranthi	30000	Op Admin

Загрузить данные мы сможем при помощи следующей команды:

LOAD DATA INPATH '/user/root/sample.txt'
OVERWRITE INTO TABLE employee;

После hive переместит данныe, хранящемся в нашем файле в хранилище hive. Убедиться в этом можно прочитав данные напрямую из файла в хранилище hive в hdfs:

[root@quickstart ~]# hadoop fs -text /user/hive/warehouse/userdb.db/employee/*
1201  Gopal       45000    Technical manager
1202  Manisha     45000    Proof reader
1203  Masthanvali 40000    Technical writer
1204  Kiran       40000    Hr Admin
1205  Kranthi     30000    Op Admin

Классические таблицы можно также создавать как результат select-запроса к другим таблицам:

0: jdbc:hive2://localhost:10000/default> CREATE TABLE big_salary as SELECT * FROM employee WHERE salary > 40000;

0: jdbc:hive2://localhost:10000/default> SELECT * FROM big_salary;
+-----------------+------------------+--------------------+-------------------------+--+
| big_salary.eid  | big_salary.name  | big_salary.salary  | big_salary.destination  |
+-----------------+------------------+--------------------+-------------------------+--+
| 1201            | Gopal            | 45000              | Technical manager       |
| 1202            | Manisha          | 45000              | Proof reader            |
+-----------------+------------------+--------------------+-------------------------+--+

Кстати говоря, SELECT для создания таблицы в данном случае уже запустит mapreduce-задачу.

Внешняя таблица, данные в которую загружаются внешними системами, без участия hive. Для работы с внешними таблицами при создании таблицы нужно указать ключевое слово EXTERNAL, а также указать путь до папки, по которому хранятся файлы:

CREATE EXTERNAL TABLE IF NOT EXISTS employee_external ( eid int, name String,
salary String, destination String)
COMMENT 'Employee details'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/root/external_files/';

После этого таблицей можно пользоваться точно так же как и обычными таблицами hive. Самое удобное в этом, что вы можете просто скопировать файл в нужную папочку в hdfs, а hive будет автоматом подхватывать новые файлы при запросах к соответствующей таблице. Это очень удобно при работе например с логами.

Партиция (partition)

Так как hive представляет из себя движок для трансляции SQL-запросов в mapreduce-задачи, то обычно даже простейшие запросы к таблице приводят к полному сканированию данных в этой таблицы. Для того чтобы избежать полного сканирования данных по некоторым из колонок таблицы можно произвести партиционирование этой таблицы. Это означает, что данные относящиеся к разным значениям будут физически храниться в разных папках на HDFS.

Для создания партиционированной таблицы необходимо указать по каким колонкам будет произведено партиционирование:

CREATE TABLE IF NOT EXISTS employee_partitioned ( eid int, name String,
salary String, destination String)
COMMENT 'Employee details'
PARTITIONED BY (birth_year int, birth_month string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE;

При заливке данных в такую таблицу необходимо явно указать, в какую партицию мы заливаем данные:

LOAD DATA INPATH '/user/root/sample.txt' OVERWRITE
INTO TABLE employee_partitioned
PARTITION (birth_year=1998, birth_month='May');

Посмотрим теперь как выглядит структура директорий:

[root@quickstart ~]# hadoop fs -ls /user/hive/warehouse/employee_partitioned/
Found 1 items
drwxrwxrwx   - root supergroup          0 2016-05-08 15:03 /user/hive/warehouse/employee_partitioned/birth_year=1998
[root@quickstart ~]# hadoop fs -ls -R /user/hive/warehouse/employee_partitioned/
drwxrwxrwx   - root supergroup          0 2016-05-08 15:03 /user/hive/warehouse/employee_partitioned/birth_year=1998
drwxrwxrwx   - root supergroup          0 2016-05-08 15:03 /user/hive/warehouse/employee_partitioned/birth_year=1998/birth_month=May
-rwxrwxrwx   1 root supergroup        161 2016-05-08 15:03 /user/hive/warehouse/employee_partitioned/birth_year=1998/birth_month=May/sample.txt

Видно, что структура директорий выглядит таким образом, что каждой партиции соответствует отдельная папка на hdfs. Теперь, если мы будем запускать какие-либо запросы, у казав в условии WHERE ограничение на значения партиций — mapreduce возьмет входные данные только из соответствующих папок.

В случае External таблиц партиционирование работает аналогичным образом, но подобную структуру директорий придется создавать вручную.

Партиционирование очень удобно например для разделения логов по датам, так как правило любые запросы за статистикой содержат ограничение по датам. Это позволяет существенно сократить время запроса.

Установка

Источники

  1. Apache Hive // Википедия. [2017—2017]. Дата обновления: 11.09.2017. URL: https://ru.wikipedia.org/wiki/Apache_Hive (дата обращения: 11.09.2017).
  2. URL: http://s3.amazonaws.com/awsdocs/ElasticMapReduce/latest/emr-dg.pdf Amazon Elastic MapReduce Developer Guide (дата обращения: 19.05.2020).
  3. URL: http://www.semantikoz.com/blog/the-free-apache-hive-book/ The Free Hive Book (дата обращения: 31.05.2020).

Ссылки