Быстрый старт с Hive

MySQLBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе рассматриваются настройка и базовые операции Hive. Она предназначена для учащихся с базовыми знаниями SQL и помогает понять архитектуру Hive, его базовое развёртывание и использование.

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

Введение в Hive

На этом шаге вы узнаете, как Apache Hive предоставляет SQL-интерфейс для запросов и анализа больших наборов данных, хранящихся в Hadoop. Ниже приведён обзор архитектуры Hive и его основных возможностей.

Архитектура Hive

  • Компоненты: Hive включает HCatalog для управления таблицами и хранилищем, а также WebHCat для запуска задач MapReduce, запросов Pig и взаимодействия с метаданными Hive через REST API.
  • Возможности:
    • Поддерживает SQL-запросы для задач хранилищ данных, таких как ETL, анализ данных и создание отчётов.
    • Данные хранятся в системах хранения, например HDFS или HBase, а запросы выполняются вычислительными механизмами Tez, Spark или MapReduce.
    • Поддерживает процедурные языки, HPL-SQL и получение данных из подзапросов с использованием Hive LLAP, YARN и Slider.

Основные единицы данных в Hive

  • База данных: пространство имён, предотвращающее конфликты имён и повышающее безопасность.
  • Таблица: однородная единица данных с одинаковой схемой, например таблица page_views со столбцами timestamp, userid и page_url.
  • Раздел: делит данные на разделы по ключам для ускорения получения данных.
  • Сегмент: делит секционированные данные на сегменты на основе значений хеш-функции, повышая эффективность запросов.

Типы данных Hive

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

Установка и развёртывание Hive

На этом шаге вы ознакомитесь с установкой и развёртыванием Hive, включая структуру каталогов, переменные окружения, metastore и системные параметры.

Сначала переключитесь на пользователя hadoop, чтобы выполнить последующие операции. Дважды щёлкните значок терминала Xfce на рабочем столе и введите следующие команды:

su - hadoop

подсказка: пароль пользователя hadoophadoop.

Затем с помощью команды wget скачайте последнюю стабильную версию Hive. В этой работе используется Hive версии 2.3.3:

sudo wget https://labexfile.oss-us-west-1.aliyuncs.com/courses/144/apache-hive-2.3.3-bin.tar.gz

Распакуйте скачанный установочный пакет. Введите в терминале следующую команду:

tar -zxvf apache-hive-2.3.3-bin.tar.gz

С помощью привилегии sudo переместите распакованный каталог в каталог /opt. Без привилегии sudo у вас может не быть прав на запись в /opt:

sudo mv /home/hadoop/apache-hive-2.3.3-bin /opt/hive-2.3.3

После перемещения каталога измените его владельца и группу на пользователя hadoop. Введите в терминале следующую команду:

sudo chown -R hadoop:hadoop /opt/hive-2.3.3

подсказка: для выполнения описанных выше операций с привилегией sudo можно открыть другой терминал.

labex:~/ $ ls -al /opt/
total 24
drwxrwxr-x 10 hadoop hadoop 4096 Mar 3 12:01 hive-2.3.3
...

Настройка переменных окружения

На этом шаге вы настроите переменные окружения Hive, чтобы HIVE_HOME указывала на каталог установки Hive.

Сначала откройте файл .bashrc пользователя hadoop в редакторе vim. Введите в терминале следующую команду:

vim /home/hadoop/.bashrc

Добавьте в конец файла следующий текст. Значение PATH необходимо изменить в соответствии с текущей средой лабораторной работы. Выражение $PATH используется для обращения к уже существующему содержимому переменной. Добавьте :$HIVE_HOME/bin непосредственно в конец переменной окружения PATH:

export HIVE_HOME=/opt/hive-2.3.3
export PATH=$PATH:$HIVE_HOME/bin

После завершения редактирования сохраните файл и выйдите из редактора. Затем используйте команду source, чтобы активировать эти переменные окружения.

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

Настройка конфигурации

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

Настройка metastore

Перед полноценным использованием Hive необходимо настроить хранилище метаданных. По умолчанию Hive хранит метаданные во встроенной базе данных Derby. Расположение этой базы на диске задаётся параметром javax.jdo.option.ConnectionURL в конфигурационном файле Hive conf/hive-default.xml. По умолчанию используется расположение ./metastore_db.

Однако в этой лабораторной работе для хранения метаданных будет использоваться MySQL. Поэтому необходимо изменить конфигурацию Hive.

Создайте и откройте подготовленный конфигурационный файл с помощью редактора vim:

vim /opt/hive-2.3.3/conf/hive-site.xml
<configuration>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://localhost:3306/hive_metastore1?createDatabaseIfNotExist=true</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.cj.jdbc.Driver</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>hiveuser1</value>
</property>
<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>123qweQWE...</value>
</property>
</configuration>

После изменения указанных параметров сохраните файл и выйдите из редактора.

Создание базы данных MySQL

Запустите сервер MySQL с помощью команды sudo mysql и создайте базу данных hive_metastore:

CREATE DATABASE hive_metastore1;
CREATE USER 'hiveuser1'@'localhost' IDENTIFIED BY '123qweQWE...';
GRANT ALL PRIVILEGES ON hive_metastore1.* TO 'hiveuser1'@'localhost';
FLUSH PRIVILEGES;
exit;

Затем скачайте драйвер JDBC для MySQL и скопируйте его в каталог /opt/hive-2.3.3/lib:

cp /usr/local/hive/lib/mysql-connector-j-8.3.0.jar /opt/hive-2.3.3/lib

Настройка системных параметров Hive

После настройки metastore необходимо задать внутренние параметры Hive, чтобы указать расположение Hadoop, путь к внутреннему конфигурационному файлу и другие параметры.

Сначала с помощью команды cp создайте копию шаблона настроек, чтобы он начал использоваться.

Введите в терминале следующую команду:

cp /opt/hive-2.3.3/conf/hive-env.sh.template /opt/hive-2.3.3/conf/hive-env.sh

Затем откройте файл hive-env.sh в редакторе vim:

vim /opt/hive-2.3.3/conf/hive-env.sh

В строке 48 задайте для HADOOP_HOME путь к каталогу установки Hadoop:

HADOOP_HOME=/home/hadoop/hadoop

После изменения указанных параметров сохраните файл и выйдите из редактора.

Инициализация metastore

На этом шаге вы инициализируете metastore Hive и запустите службы Hadoop, необходимые Hive.

Поскольку данные, используемые далее, будут храниться в HDFS, сначала запустите HDFS. Введите в терминале следующие команды:

start-dfs.sh
start-yarn.sh

Введите команду jps, чтобы проверить состояние служб:

hadoop:~/ $ jps                                                      [17:31:43]
8960 Jps
3153 NodeManager
2823 SecondaryNameNode
3017 ResourceManager
2570 DataNode
2428 NameNode

Если вы используете Hadoop впервые, необходимо удалить данные Hadoop и инициализировать его с помощью команды hdfs namenode -format.

В этой лабораторной работе metastore предварительно установленного Hive уже инициализирован с базой данных u. Если вы хотите инициализировать только что скачанный Hive, используйте следующую команду:

/opt/hive-2.3.3/bin/schematool -initSchema -dbType mysql
Initialization script completed
schemaTool completed

Если вы впервые инициализируете только что скачанный Hive, измените путь HIVE_HOME в файле ~/.bashrc на путь к установленному вами Hive и выполните source. Однако мы не рекомендуем этого делать, поскольку все последующие проверки Hive основаны на предварительно установленном Hive.

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

hive

подсказка: если ввести hive непосредственно в оболочке предварительно установленного Hive, будет запущен именно она. Добавьте абсолютный путь, и вы войдёте в только что настроенную оболочку Hive.

Hive Session ID = 3eee2693-175d-4452-82d2-47f1b639d9d5

Logging initialized using configuration in jar:file:/usr/local/hive/lib/hive-common-3.1.3.jar!/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
Hive Session ID = 68d0d345-92c3-4eb1-8393-7ee34f56363f
hive>

Базовые операции Hive

На этом шаге вы изучите основные операции с таблицами Hive. Все инструкции Hive также доступны в его Language Manual.

Создание таблицы

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

Снова откройте терминал и введите следующие команды, чтобы скачать пример данных:

su hadoop
cd ~
wget http://labfile.oss-cn-hangzhou.aliyuncs.com/courses/567/log_example.csv

Затем загрузите файл в HDFS:

hdfs dfs -mkdir -p /user/data/staging/page_view
hdfs dfs -put /home/hadoop/log_example.csv /user/data/staging/page_view

После получения данных первым делом создайте таблицу. Чтобы создать таблицу page_view для этих данных, введите в командной строке Hive следующую инструкцию:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

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

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

Следующая инструкция приведена только для демонстрации и не должна вводиться в оболочке hive.

CREATE TABLE page_view1(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
STORED AS SEQUENCEFILE;

Разделитель строк определяется разделителем в системе Hadoop, а не Hive, поэтому изменить его вручную нельзя.

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

Следующая инструкция приведена только для демонстрации и не должна вводиться в оболочке hive.

CREATE TABLE page_view2(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

В приведённом примере столбец userid распределяется хеш-функцией по 32 сегментам. В каждом сегменте данные сортируются по возрастанию viewTime. Такая организация данных позволяет эффективно выбирать значения из сгруппированного столбца — в данном случае userid. Сортировка также позволяет администраторам данных эффективнее выполнять запросы благодаря более подходящим структурам данных.

Следующая инструкция приведена только для демонстрации и не должна вводиться в оболочке hive.

CREATE TABLE page_view3(viewTime INT, userid BIGINT,
Page_url STRING, referrer_url STRING,
Friends ARRAY<BIGINT>, properties MAP<STRING, STRING>,
Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1'
COLLECTION ITEMS TERMINATED BY '2'
MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

В этом примере формат каждой строки таблицы определяется именами и типами полей, что похоже на определения типов в других языках программирования. Обратите внимание: имена таблиц и столбцов нечувствительны к регистру. IP Address of the User и приведённое ниже предложение COMMENT показывают, что комментарии можно добавлять как на уровне столбца, так и на уровне таблицы. Кроме того, предложение PARTITIONED BY определяет столбцы раздела, отличающиеся от столбцов данных. Как отмечалось выше, фактически они не хранят данные. Предложение CLUSTERED BY указывает, какой столбец использовать и на сколько сегментов разделить данные. Предложение ROW FORMAT DELIMITED задаёт способ хранения строк в таблице Hive. Для форматов с разделителями эта инструкция определяет разделитель поля, разделитель элемента коллекции (массива или отображения) и разделитель ключа отображения; числа здесь указаны в кодировке ASCII. STORED AS SEQUENCEFILE означает, что данные хранятся в HDFS в двоичном формате, а именно в формате Hadoop SequenceFile. При этом настройки в предложениях ROW FORMAT и STORED AS являются текущими значениями по умолчанию в Hive. Поэтому в инструкции, создающей таблицу в начале, мы не указывали их явно.

Просмотр таблиц и разделов

Чтобы вывести список существующих таблиц в хранилище, используйте следующую инструкцию:

SHOW TABLES;

Если таблиц много, эта инструкция вернёт большой объём информации. Можно ограничить область поиска, указав префикс. Например, чтобы вывести таблицы с префиксом page, используйте:

SHOW TABLES 'page.*';

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

Чтобы вывести список разделов таблицы, используйте следующую инструкцию. Если таблица не является секционированной, информация не возвращается:

SHOW PARTITIONS page_view;

Чтобы вывести список столбцов таблицы и их типов, используйте инструкцию DESCRIBE:

DESCRIBE page_view;

Чтобы вывести столбцы таблицы и все остальные свойства, добавьте ключевое слово EXTENDED. Будет выведен большой объём информации, поэтому обычно этот режим используют для отладки:

DESCRIBE EXTENDED page_view;

Изменение таблицы

Чтобы переименовать существующую таблицу, используйте инструкцию ALTER TABLE с RENAME TO. Если таблица с новым именем уже существует, будет возвращена ошибка. Следующие инструкции приведены только как примеры. Не выполняйте их, поскольку на следующем шаге используется созданная вами таблица page_view:

ALTER TABLE page_view RENAME TO new_page_view;

Просмотрите результат:

hive> ALTER TABLE page_view RENAME TO new_page_view;
OK
Time taken: 0.124 seconds
hive> show tables;
OK
new_page_view
...
Time taken: 0.021 seconds, Fetched: 4 row(s)

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

ALTER TABLE new_page_view REPLACE COLUMNS (viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ipaddr STRING COMMENT 'IP Address of the User');

Кроме того, в существующую таблицу можно добавлять новые столбцы:

ALTER TABLE new_page_view ADD COLUMNS (new_column INT COMMENT 'a new int column');

Обратите внимание: изменения схемы, например добавление столбца, сохраняют схему старого раздела таблицы, чтобы он не превратился в секционированную таблицу. Все запросы, обращающиеся к этим столбцам в старом разделе, неявно возвращают значения null или указанные значения по умолчанию.

Удаление таблиц и разделов

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

В следующем примере удаляется таблица. Не выполняйте его в этой лабораторной работе:

DROP TABLE new_page_view;

Загрузка и запрос данных

На этом шаге вы загрузите подготовленные данные в секционированную таблицу Hive и выполните запрос к результату.

Загрузка данных

Существует несколько способов загрузить данные в таблицу Hive. Можно создать внешнюю таблицу, связанную с определённым расположением в HDFS. В этом случае файл данных копируется в указанное расположение с помощью команды HDFS put или copy, а затем создаётся таблица, указывающая на это расположение. Такая таблица содержит всю необходимую информацию о формате строк.

После создания таблицы данные можно преобразовать и вставить в любую другую таблицу Hive. Мы заранее загрузили файл log_example.csv в HDFS и переименовали его в page_view. Чтобы загрузить его в таблицу page_view соответствующего раздела, выполните следующую команду.

Сначала создайте внешнюю таблицу и свяжите её с указанным файлом:

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 origin')
COMMENT 'This is the staging page view table'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '\n' STORED AS TEXTFILE
LOCATION '/user/data/staging/page_view';

Затем создайте таблицу page_view для окончательного хранения данных:

CREATE TABLE page_view(viewTime INT, userid BIGINT,
                Page_url STRING, referrer_url STRING,
                Ip STRING COMMENT 'IP Address of the User')
COMMENT 'This is the page view table'
PARTITIONED BY(dt STRING, country STRING)
STORED AS SEQUENCEFILE;

Для этого небольшого учебного набора данных распределённая задача YARN не требуется. Настройте локальный исполнитель заданий Hadoop для текущего сеанса Hive, чтобы вставка надёжно выполнялась внутри виртуальной машины лабораторной работы:

SET mapreduce.framework.name=local;

Наконец, вставьте данные из внешней таблицы в таблицу page_view:

FROM page_view_stg pvs
INSERT OVERWRITE TABLE page_view
PARTITION(dt='2015-05-17', country='us')
SELECT pvs.viewTime, pvs.userid, pvs.page_url, pvs.referrer_url, pvs.ip
WHERE pvs.country = 'us';

Локальное задание должно завершиться за несколько секунд и загрузить соответствующие строки в раздел page_view.

...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: ... HDFS Write: ... SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
Time taken: ... seconds

Простой запрос

После вставки данных выполните простой запрос. Он похож на обычную инструкцию SQL. Введите следующую инструкцию в интерфейсе командной строки Hive:

SELECT * FROM page_view WHERE userid = 0 LIMIT 10;

Возвращённая информация содержит найденные записи:

hive> select * from page_view;
OK
NULL 490 /downloads/product_1 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 490 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
NULL 3316 /downloads/product_2 /archives/webroot 217.168.17.5 2015-05-17 us
...

Остановка служб

На этом шаге вы выйдете из Hive и остановите службы Hadoop после ознакомления с ресурсами для дальнейшего изучения:

После завершения работы используйте команду quit, чтобы выйти из интерфейса командной строки Hive:

quit;

Разумеется, не забудьте остановить службу HDFS. Введите в терминале следующие команды:

stop-yarn.sh
stop-dfs.sh

Итоги

В этой лабораторной работе рассматриваются архитектура Hive, его установка и развёртывание, а также базовые инструкции HQL. Кроме того, вы научились импортировать данные с помощью набора примеров.

Основные рассмотренные темы:

  • Архитектура Hive
  • Основные единицы данных Hive
  • Развёртывание Hive
  • Язык HQL Hive

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