4.3 Hive. SQL для Big data Flashcards
История Hive
- Разработка началась в 2010 году в Facebook
- SQL подобный язык запросов (HiveQL)
- Трансляция в каскад заданий
- Несколько движков исполнения (Map-Reduce, Tez, Spark)
- JDBC и ODBC драйверы для интеграции с существующими системами
Как хранится информация в Hive?
Информация хранится в обычных файлах(на HDFS или S3):
- Text file
- Sequence file
- Parquet, ORC
- …
Hive выглядит как база данных поверх данных на HDFS, но не является ей на самом деле. Это некая псевдо-база, которая не может себя полноценно обслуживать.
Как хранится Мета-информация в Hive?
Мета-информация хранится в RDBMS
- Apache Derby (по умолчанию)
- MySQL
- Postgres
- Oracle
т.е. вся мета информация (описание таблиц и полей, роли, доступы и пр.) хранится в специальной реляционной базе данных
UDF
Стоит отметить, что в Hive можно написать собственную функцию посредством UDF (User Defined Function). Существуют также UDAF (User Defined Aggregate Function) и UDTF (User Defined Tabular Function).
Можно на языке java (создать jar файл) или на других (напр. Python)
Иерархия Hive
->Database (папка на HDFS)
|
–»Table (папка на HDFS)
|
—»>Partition (папка на HDFS) *опционально
|
—»>Bucket (файлы HDFS) *опционально
|
–»View (представление - хранимый запрос)
|
–»Materialized view (query rewrite)
При создании Database (базы данных), Table (таблицы) или Partition (партиции) мы можем явно указывать расположение данных на HDFS.
Партиции
разбиение данных в таблице по какому-либо принципу. Например, по дням. Таким образом поиск нужных данных в большой таблице будет занимать меньше времени. Партиции также можно делать вложенными. На примере продаж продуктовой сети: 1 уровень — филиал, 2 уровень — дата продажи.
Buckets
Количество Buckets (бакеты) указывается на момент создания таблицы. Требуется указать по каким полям мы хотим бакетировать таблицу, с каким количеством бакетов и сортировку (опционально). Бакеты позволяют делать эффективный join таблиц, но требуют внимательного обслуживания.
View
(представления) не оптимизируют запрос, а только добавляют удобства в работе с большими запросами.
Materialized view
(материализованное представление) — условная витрина, строящаяся по какому-либо запросу. Материализованные представления пришли на смену индексам, так как начиная с версии Hive 3 их нет (они не получили широкого применения).
Архитектура Hive
1) На верхнем уровне представлены управляющие средства — Administration and Server Coordination.
В Hive есть собственный веб-интерфейс Hive Web Interface, где можно отслеживать процесс работы запросов в кластере.
Hive CLI представляет собой две утилиты (Hive и Beeline). С точки зрения архитектурной целостности Beeline является более правильным средством.
Hue — веб-интерфейс, подключаемый к кластеру Hadoop и позволяющий использовать HDFS, запускать запросы в Hive, делать минимальную графику.
2) JDBC (Java Database Connectivity) - стандарт взаимодействия Java-приложений с различными СУБД.
ODBC (Open Database Connectivity) — это программный интерфейс (API) доступа к базам данных, разработанный компанией Microsoft. С его помощью, например, можно подключиться к Hive через Excel.
3) Hive Driver получает запрос от Hive Thrift Server, который в свою очередь получает его от клиентских приложений, и анализирует его. Затем он обращается к Metastore для семантических и синтаксических проверок, строит план запроса и отправляет на выполнение.
4) В зависимости от выбранного движка (Map-Reduce, Tez, Spark), запрос будет преобразован должным образом. Работа производится внутри YARN.
5) В самом основании распределенное хранилище с файлами, которые использует Hive (HDFS).
Какие таблицы можно создать в Hive?
- managed таблицы
- external таблицы
- CTAS таблицы
Managed таблицы
В общем случае создание таблицы в Hive похоже на создание таблицы в любой реляционной БД. Мы можем задавать комментарии полям, либо таблице в целом.
Выражение PARTITIONED BY в нашем случае партиционирует таблицу по двум уровням. Первый уровень — поле dt, второй уровень — country. Стоит отметить, что значения этих полей в данных на HDFS не будет. Информация о партициях хранится в Metastore.
CLUSTERED BY позволяет бакетировать таблицу — разбивать данные на бакеты. В данном случае создается 32 бакета по полю userid. Также внутри бакета можем задавать сортировку.
ROW FORMAT DELIMETED указывает формат, в котором мы будем хранить таблицу. В нашем случае это будет SEQUENCEFILE и внутри него мы храним по паттерну, что поля разделяются символом ‘;’, сложные типы данных (коллекции) разделяются ‘,’ и тип данных MAP (словарь) разделяется ‘'.
CREATE TABLE page_view(
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING,
friends ARRAY<BIGING>,
properties MAP<STRING, STRING>,
ip STRING COMMENT 'IP Address of the Iser')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMETED
FIELDS TERMINATED BY ';'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY '\'
STORED AS SEQUENCEFILE;</BIGING>
External таблицы
Создание внешней таблицы в Hive тоже похоже на создание такой таблицы в обычных реляционных БД.
Мы можем создать внешнюю таблицу на данных, которые лежат не в папке, в котором расположен Hive, а где-то снаружи.
Главной причиной создания внешних таблиц является их поведение при удалении. При удалении обычной managed таблицы через команду DROP TABLE, Hive удаляет всю информацию о ней в Metastore и удаляет данные этой таблицы на HDFS. И проблема в том, что не во всех случаях данные можно восстановить обратно. Но при удалении внешней таблицы, удаляются только метаданные о ней. Сами данные не удаляются и не производится попыток их удаления.
LOCATION - обязательный параметр при создании внешних таблиц.
CREATE EXTERNAL TABLE page_view_stg (
viewTime INT,
userid BIGINT,
page_url STRING,
referrer_url STRING
ip STRING COMMENT ‘IP Address of the User’,
country STRING COMMENT ‘country of origination’
)
COMMENT ‘This is the staging page view table’
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘44’
LINES TERMINATED BY ‘10’
STORED AS TEXTFILE
LOCATION ‘/user/data/staging/page_view’;
CTAS таблицы
Create Table As Select
В Hive мы можем также создавать таблицы через CTAS. Это способ создания таблиц с помощью запроса к какой-то другой таблице (таблицам).
CREATE TABLE dataset_42 AS
SELECT
o.name AS office_name,
SUM(s.amount) AS total_amount
FROM fact_sells AS s
JOIN dim_office AS o
ON s.office_id = o.id
WHERE id BETWEEN 1000 AND 2000
GROUP BY o.name
STORED AS ORC;
Типы Join
- Классический reduce side join
- Map side join
- Sort Merge Bucket (SMB) join