Impala и Hive

Impala может использовать существующую инфраструктуру Apache Hive для выполнения длительных, пакетных SQL-запросов. Impala хранит определения таблиц в базе данных MySQL или PostgreSQL, известной как Metastore, в той же базе данных, где Hive хранит данные такого типа. Таким образом, Impala может получить доступ к таблицам, определенным или загруженным через Hive, если во всех столбцах используются поддерживаемые Impala типы данных, форматы файлов и кодеки сжатия.

Использование одной и той же таблицы в Hive и Impala

Как описано выше, вы можете работать с одной и той же таблицей в Hive и Impala. Например, создадим таблицу в Hive (см. Работа с таблицами Hive). Командная строка Hive доступна на хостах, где установлен компонент Hive HiveServer2.

$ sudo -u hive hive
CREATE TABLE employees (
employee_id INT,
full_name STRING,
hours INT,
rate  INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

INSERT INTO TABLE
    employees
VALUES
     (1, 'James Wilson', 8, 500),
    (2, 'Mary Burton', 6, 450),
    (3, 'Patricia Robinson', 7, 430);

После этого можно использовать impala-shell для выборки данных:

$ impala-shell
SELECT * FROM employees;

Результат:

Query: select * from employees
Query submitted at: 2023-09-05 14:32:38 (Coordinator: http://ees-1adh.ru-central1.internal:25000)
Query progress can be monitored at: http://ees-1adh.ru-central1.internal:25000/query_plan?query_id=dd477956d9bde7ca:61358fec00000000
+-------------+-------------------+-------+------+
| employee_id | full_name         | hours | rate |
+-------------+-------------------+-------+------+
| 1           | James Wilson      | 8     | 500  |
| 2           | Mary Burton       | 6     | 450  |
| 3           | Patricia Robinson | 7     | 430  |
+-------------+-------------------+-------+------+
Fetched 3 row(s) in 0.21s

Добавим строки в таблицу в impala-shell:

insert into employees values ((4,"Robert Gray", 8, 480), (5,"Elizabeth Tucker", 7, 470));

Используйте командную строку Hive для отображения данных:

$ sudo -u hive hive
SELECT * FROM employees;

Результат:

OK
1   James Wilson    8   500
2   Mary Burton 6   450
3   Patricia Robinson   7   430
4   Robert Gray 8   480
5   Elizabeth Tucker    7   470
Time taken: 0.23 seconds, Fetched: 5 row(s)

Строки, добавленные в Impala, отобразились.

Первоначальный фокус на функциях запросов и производительности означает, что Impala может считывать больше типов данных с помощью оператора SELECT, чем записывать с помощью оператора INSERT. Чтобы запросить данные с использованием форматов файлов Avro, RCFile или SequenceFile, вы должны загрузить данные с помощью Hive.

Сбор статистики по таблицам и столбцам для оптимизации запросов

Impala может более эффективно оптимизировать сложные запросы или запросы к нескольким таблицам, если у нее есть статистика о размере данных и их распределении. Например, оптимизация JOIN-запросов требует статистики, чтобы определить, какая таблица больше. Это можно определить путем сравнения количества строк и среднего размера строк каждой таблицы.

Оптимизатор запросов Impala может использовать статистику таблиц и статистику столбцов. Первоначально эта информация собиралась с помощью оператора ANALYZE TABLE в Hive. В Impala вместо этого используйте оператор COMPUTE STATS. COMPUTE STATS требует меньше настроек, более надежен и не требует переключения между impala-shell и командной строкой Hive.

Статистика таблицы

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

Метаданные статистики хранятся в базе данных Metastore и могут обновляться с помощью Impala или Hive. Если значение недоступно, выводится -1. Некоторые значения, например количество и общий размер файлов данных, всегда остаются актуальными, поскольку их можно легко вычислить в процессе сбора метаданных HDFS.

Пример ниже использует оператор SHOW TABLE STATS, чтобы отобразить статистику таблицы. Для партиционированных таблиц также можно использовать оператор SHOW PARTITIONS, который отображает ту же информацию, что и SHOW TABLE STATS.

show table stats test_table1;

Результат:

+-------+--------+---------+--------------+-------------------+---------+-------------------+--------------------------------------------+
| #Rows | #Files |  Size   | Bytes Cached | Cache Replication |  Format | Incremental stats | Location                                   |
+-------+--------+---------+--------------+-------------------+---------+-------------------+--------------------------------------------+
| -1    |   52   | 12.62GB | NOT CACHED   | NOT CACHED        | PARQUET | false             | hdfs://adh/apps/hive/warehouse/test_table1 |

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

Выполним оператор COMPUTE STATS и проверим статистику таблицы:

compute stats test_table1;

show table stats test_table1;

Результат:

+-------------+--------+---------+--------------+-------------------+---------+-------------------+--------------------------------------------+
|    #Rows    | #Files |  Size   | Bytes Cached | Cache Replication |  Format | Incremental stats | Location                                   |
+-------------+--------+---------+--------------+-------------------+---------+-------------------+--------------------------------------------+
| 541666666   |   52   | 12.62GB | NOT CACHED   | NOT CACHED        | PARQUET | false             | hdfs://adh/apps/hive/warehouse/test_table1 |

Оператор COMPUTE STATS добавляет недостающие значения статистики.

В выводе результата вы можете увидеть колонку Incremental stats. Значение в этой колонке показывает, используется ли Incremental stats для сбора статистики. Функциональность Incremental stats была добавлена для партиционированных таблиц. Когда Impala вычисляет инкрементную статистику для партиционированной таблицы, по умолчанию, обрабатываются только те партиции, которые еще не имеют инкрементной статистики. Таким образом, статистика поддерживается в актуальном состоянии, и повторная обработка всей таблицы не проводится. Для каждой таблицы необходимо использовать один тип вычисления статистики: или COMPUTE STATS, или COMPUTE INCREMENTAL STATS. Типы нельзя комбинировать или чередовать. Если необходимо переключиться с COMPUTE STATS на COMPUTE INCREMENTAL STATS или наоборот для существующей таблицы, удалите всю статистику, выполнив команду DROP STATS, перед тем как менять тип статистики. За дополнительной информацией обратитесь к разделу Generating Table and Column Statistics статьи Table and Column Statistics.

Статистика столбцов

Планировщик запросов Impala может использовать статистику по отдельным столбцам, если эти метаданные доступны в базе данных Metastore. Такая статистика наиболее полезна, когда нужно сравнить столбцы таблиц в запросах JOIN, чтобы оценить, сколько строк запрос получит из каждой таблицы. Эта статистика также важна для подзапросов, использующих операторы EXISTS и IN. Эти операторы обрабатываются Impala по тому же принципу, что и запросы JOIN.

Следующий пример отображает статистику столбцов для непартиционированной таблицы в формате Parquet:

show column stats test_table2;

Результат:

+--------+---------+------------------+--------+----------+----------+--------+---------+
| Column | Type    | #Distinct Values | #Nulls | Max Size | Avg Size | #Trues | #Falses |
+--------+---------+------------------+--------+----------+----------+--------+---------+
| field1 | INT     | -1               | -1     |  4       | 4.0      |  -1    |  -1     |
| field2 | BOOLEAN | -1               | -1     |  1       | 1.0      |  -1    |  -1     |
| field3 | STRING  | -1               | -1     | -1       | -1       |  -1    |  -1     |
+--------+---------+------------------+--------+----------+----------+--------+---------+

В выводе команды максимальные и средние размер значений числовых типов и типов фиксированного размера отображены, поскольку они являются константами. Количество Distinct Values не определено, так как для этого требуется потенциально дорогостоящее сканирование всей таблицы, и значения отображаются как -1. То же самое относится к максимальным и средним размерам типов переменного размера, таких как STRING. Выполнение оператора COMPUTE STATS добавляет недостающие значения и обновляет статистику.

compute stats test_table2;

show column stats test_table2;

Результат:

+--------+---------+------------------+--------+----------+----------+--------+---------+
| Column | Type    | #Distinct Values | #Nulls | Max Size | Avg Size | #Trues | #Falses |
+--------+---------+------------------+--------+----------+----------+--------+---------+
| field1 | INT     | 6                | 0      | 4        | 4.0      | -1     | -1      |
| field2 | BOOLEAN | 2                | 0      | 1        | 1.0      | 14     | 7       |
| field3 | STRING  | 6                | 0      | 4        | 4.0      | -1     | -1      |
+--------+---------+------------------+--------+----------+----------+--------+---------+

Значения Trues и Falses вычисляются только для полей типа BOOLEAN.

Для эффективного использования статистики по столбцам Impala также необходима статистика по таблицам. Когда вы используете оператор Impala COMPUTE STATS, статистика по таблице и всем столбцам собирается одновременно. Если вы запустите оператор Hive ANALYZE TABLE COMPUTE STATISTICS FOR COLUMNS, будет собрана статистика по столбцам. Impala может использовать статистику столбцов только в том случае, если таблица непартиционированная. Impala не может использовать статистику столбцов, созданную Hive, для партиционированной таблицы.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней