Введение
Этот практикум посвящен настройке и базовым операциям в Hive и предназначен для студентов с определенным опытом работы с SQL для понимания архитектуры Hive, его базовой развертки и использования.
Вручную введите весь примерный код из документа; старайтесь не просто копировать и вставлять код. Только таким образом вы будете более знакомы с кодом. Если у вас возникнут проблемы, внимательно пересмотрите документацию, или вы можете обратиться за помощью и общением на форум.
Введение в Hive
Apache Hive - это пакет программ для управления данными, построенный поверх Hadoop, который позволяет запускать запросы и анализировать большие объемы данных с использованием запросов, похожих на SQL. Он упрощает агрегацию данных,即兴рочные запросы и анализ больших данных, предоставляя пользователям знакомый интерфейс SQL. Ниже представлен обзор архитектуры 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с колонками, такими как временная метка, идентификатор пользователя, URL-адрес страницы). - Раздел: Разделяет данные на разделы на основе ключей для эффективного извлечения данных.
- Ведро: Разделяет разделенные данные на ведра на основе значений хэш-функции для повышения эффективности запросов.
Типы данных Hive
- Поддерживает простые и комплексные типы данных. Подробности см. в документации по типам данных Hive.
Hive предназначен для задач управления данными, а не для онлайн-обработки транзакций (OLTP), и сосредоточен на масштабируемости, производительности, надежности и отказоустойчивости. Он поддерживает различные форматы ввода и может быть расширен с использованием коннекторов в различных форматах. Понимание архитектуры Hive, единиц данных и типов данных является важным для использования его возможностей в анализе больших данных.
Установка и развертывание Hive
В этом разделе рассматриваются загрузка и настройка директорий, настройка переменных окружения, настройка метабазы, параметры системы Hive и инициализация метабазы.
Сначала вам нужно переключиться на пользователя hadoop, чтобы выполнить последующие операции. Дважды щелкните по иконке Xfce Terminal на рабочем столе и введите следующие команды:
su - hadoop
Совет: пароль - это 'hadoop' для пользователя 'hadoop'
Затем используйте команду wget для загрузки последней стабильной версии Hive. Здесь мы выбрали версию 2.3.3 Hive:
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
После перемещения директории вам нужно изменить владельца директории Hive на пользователя 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 указывал на директорию его установки.
Сначала откройте файл .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 уже предварительно настроен. Мы также предварительно установили Hive, и вы можете использовать команду which hive, чтобы проверить. Однако создание файла по-прежнему необходимо, так как это позволяет определить, успешно ли пройден тест.
Настройка метабазы
Прежде чем можно официально использовать 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
После настройки метабазы вам нужно настроить внутренние параметры конфигурации 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
После редактирования параметров конфигурации сохраните файл и выйдите из редактора.
Инициализация метабазы
После завершения всей работы по настройке можно приступить к инициализации метабазы.
Поскольку данные, используемые позже, будут храниться на HDFS, необходимо запустить 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.
В этой лаборатории мы уже проинициализировали предварительно установленный Hive с использованием базы данных по умолчанию. Конечно, если вы хотите проинициализировать только что загруженный 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 shell, добавив абсолютный путь, вы войдете в только что настроенный Hive shell!
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 можно найти в его Руководстве по языку. Вы можете попробовать больше инструкций после завершения этого раздела.
Создание таблицы
Сначала вам нужно получить некоторые данные. В этом разделе эксперимента используются mainly данные из файла журнала, имитирующего сервер 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 shell.
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 shell.
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 shell.
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 в двоичном формате (точнее, в типе SequenceFile Hadoop). В том числе настройки в предложениях 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. Если таблица с новым именем уже существует, возвращается ошибка:
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.
Загрузка данных
Есть несколько способов загрузить данные в таблицу Hive. Пользователи могут создавать внешние таблицы, которые ссылаются на конкретные места в HDFS. В этом случае пользователь может использовать команду put или copy HDFS для копирования файла данных в указанное место и создания таблицы, которая ссылается на это место. Эта таблица будет содержать всю необходимую информацию о формате строк.
После создания пользователь может преобразовать данные и вставить их в любую другую таблицу 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;
Наконец, вставьте данные из внешней таблицы в таблицу 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';
Может потребоваться несколько минут, чтобы данные были загружены в HDFS и затем в таблицу page_view.
...
Loading data to table default.page_view partition (dt=2015-05-17, country=us)
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 6.31 sec HDFS Read: 369021 HDFS Write: 22943 SUCCESS
Total MapReduce CPU Time Spent: 6 seconds 310 msec
OK
Time taken: 25.304 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, вы можете прочитать следующие расширения:
Когда вы закончите с ним, вы можете использовать команду quit, чтобы выйти из командной строки интерфейса Hive:
quit;
Конечно, не забудьте выключить службу HDFS. Введите следующую команду в терминале:
stop-yarn.sh
stop-dfs.sh
Резюме
В этом разделе представлены архитектура Hive, его установка и развертывание, а также основные инструкции HQL. Кроме того, мы научились импортировать данные с использованием примера данных.
Основные аспекты, упомянутые в этом разделе:
- Архитектура Hive
- Основные единицы данных Hive
- Способы развертывания Hive
- Язык Hive HQL
В целом, как пакет программ для хранения данных, функции Hive требуют дальнейшего исследования. Будьте внимательны при изучении технических материалов и продолжайте изучать следующие курсы.



