Использование impala-shell для подключения к Impala

Вы можете подключиться к Impala с помощью инструмента командной строки — impala-shell. Эта утилита доступна на хостах, на которых установлен компонент Impala Client. Оболочка Impala может удаленно подключаться к любому экземпляру Impala Daemon.

Утилита impala-shell позволяет создавать базы данных и таблицы, управлять ими, добавлять данные и выполнять запросы. Вы также можете выполнять операторы SQL в интерактивном режиме. Можно указывать параметры командной строки для обработки одного оператора или script-файла, содержащего большое количество операторов.

Кроме того, вы можете сохранить набор настроек по умолчанию для impala-shell в файле конфигурации.

Запуск impala-shell

Чтобы запустить impala-shell, присвойте переменной окружения IMPALA_SHELL_HOME путь к утилите impala-shell:

$ export IMPALA_SHELL_HOME=/usr/lib/impala/impala-shell

$ impala-shell

Для выполнения запросов необходимо подключиться к демону impalad. Команда impala-shell подключается к impalad, работающему на том же хосте. Для получения информации о том, как подключиться к демону impalad на другом хосте, см. Подключение к impalad на определенном хосте.

ПРИМЕЧАНИЕ
Если при использовании impala-shell возникла ошибка ImportError: no module named pkg_resources, необходимо установить пакет python-setuptools. Для этого можно воспользоваться командой: yum install python-setuptools.

Параметры конфигурации

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

Параметры конфигурации impala-shell
Параметр командной строки Настройка в конфигурационном файле Описание

-B или --delimited

write_delimited=true

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

-b или --kerberos_host_fqdn

kerberos_host_fqdn=load-balancer-hostname

Переопределяет имя хоста принципала Kerberos демона Impala. impala-shell проверяет, соответствует ли принципал сервера этому имени хоста. Его можно использовать, когда доступ к impalad осуществляется через балансировщик нагрузки, но impala-shell должен напрямую подключаться к определённому демону impalad

--print_header

print_header=true

Определяет, следует ли печатать строку заголовка

-o filename или --output_file filename

output_file=filename

Указывает имя выходного файла. Обычно он используется для хранения результатов единичного запроса, выполненного из командной строки с параметром -q. Опция также работает для интерактивных сессий — отображаются сообщения, такие как количество извлеченных строк, но не фактический набор результатов. Чтобы эти сообщения не отображались (при сочетании параметров -q и -o), перенаправьте stderr в /dev/null

--output_delimiter=character

output_delimiter=character

Указывает символ, используемый в качестве разделителя между полями, когда результаты запроса печатаются в формате текста (параметр -B). Разделителем по умолчанию является табуляция (\t). Если выходное значение содержит символ-разделитель, такое поле может быть заключено в одинарные кавычки, или экранировано двойными кавычками, или и тем, и другим

-E или --vertical

vertical=true

Выводит итоговые данные запроса (строки) по вертикали. Эта опция не действует, если используется опция -B

-p или --show_profiles

show_profiles=true

Отображает план выполнения запроса (тот же результат, что и оператор EXPLAIN), а также более подробные этапы выполнения запроса

-h или --help

 — 

Отображает справочную информацию

 — 

history_max=1000

Устанавливает максимальное количество запросов для хранения в файле истории выполненных запросов в impala-shell

-i hostname или

--impalad=hostname[:port_num]

impalad=hostname[:port_num]

Подключается к демону impalad, установленному на указанном хосте. Если параметр port_number не определен, используется значение по умолчанию 21050. Эта опция позволяет подключиться к любому хосту в кластере. Если вы хотите получить доступ к экземпляру impalad, который запущен на другом порте (определенном параметром fe_port) добавьте этот порт в параметры опции

-q query или --query=query

query=query

Позволяет выполнить один запрос из командной строки, не запуская интерактивный интерпретатор. Вы можете использовать эту опцию для запуска impala-shell из script-файла оболочки или при вызове команды из Python, Perl или других скриптов. Запрос должен содержать один оператор, например, SELECT, CREATE TABLE, SHOW TABLES или любой другой оператор, распознаваемый impala-shell. Поскольку вы не можете передать оператор USE и другой запрос, используйте полные имена, включающие имя базы данных, для любой таблицы, которая не принадлежит базе данных по умолчанию. В качестве альтернативного решения используйте параметр -f для передачи файла с оператором USE, за которым могут следовать другие запросы

-f query_file или

--query_file=query_file

query_file=path_to_query_file

Позволяет обрабатывать файл, содержащий несколько операторов SQL. Например, набор операторов DDL для создания группы таблиц и представлений. Несколько операторов должны быть разделены точкой с запятой (;). Вы можете указать имя файла как - для использования стандартного ввода. Эта функция позволяет использовать impala-shell как часть пайплайна Unix, где операторы SQL генерируются динамически другими инструментами

--query_option="option=value" или -Q "option=value"

Строка заголовка — [impala.query_options], за которой следуют строки option=value, по одному параметру в строке

Устанавливает параметры запроса по умолчанию для команд impala-shell. Чтобы задать сразу несколько параметров запроса, используйте несколько экземпляров этой опции командной строки. Имена параметров запроса не чувствительны к регистру

-k или --kerberos

use_kerberos=true

Определяет использовать ли аутентификацию Kerberos при подключении к impalad. Если Kerberos не включен на экземпляре impalad, к которому подключается impala-shell, отображается ошибка. См. Enabling Kerberos Authentication for Impala

-s kerberos_service_name или

--kerberos_service_name=name

kerberos_service_name=name

Определяет имя impala-shell для аутентификации в определённом принципале сервиса impalad. Если kerberos_service_name не указано, по умолчанию используется impala. Если этот параметр задаётся для соединения, в котором не поддерживается Kerberos, возвращается ошибка

-V или --verbose

verbose=true

Включает подробный вывод

--quiet

verbose=false

Отключает подробный вывод

-v или --version

version=true

Выводит информацию о версии impala-shell

-c

ignore_query_failure=true

Определяет игнорировать ли ситуацию, когда запрос не смог выполниться

-d default_db или

--database=default_db

default_db=default_db

Указывает начальную базу данных. Эквивалентен выполнению оператора USE после подключения. Если параметр не указан, используется база данных DEFAULT

-ssl

ssl=true

Включает TLS/SSL для impala-shell

--ca_cert=path_to_certificate

ca_cert=path_to_certificate

Локальный путь к стороннему сертификату CA или к копии сертификата сервера для самоподписанных сертификатов сервера. Если --ca_cert не установлен, impala-shell включает TLS/SSL, но не проверяет сертификат сервера. Это полезно для подключения к доверенной Impala, которая работает только через TLS/SSL, когда копия сертификата недоступна, например, при отладке клиентских систем

-l

use_ldap=true

Включает LDAP-аутентификацию

-u

user=user_name

Указывает имя пользователя, когда аутентификация LDAP включена с помощью опции -l. Используйте короткое имя пользователя, а не полное отличительное имя LDAP. После использования этой опции оболочка запросит пароль

--ldap_password_cmd=command

 — 

Указывает команду для получения пароля LDAP, когда аутентификация LDAP включена с помощью параметра -l. Если команда включает аргументы, разделенные пробелами, заключите команду и ее аргументы в кавычки

--config_file=path_to_config_file

 — 

Указывает путь к файлу, содержащему настройки конфигурации impala-shell. Путь по умолчанию — /etc/impalarc. Этот параметр можно указать только в командной строке

--live_progress

live_progress=true

Отображает индикатор выполнения, показывающий приблизительный процент выполнения каждого запроса. Информация обновляется в интерактивном режиме по мере обработки запроса. См. LIVE_PROGRESS Query Option

--disable_live_progress

live_progress=false

Позволяет отключить live_progress в интерактивном режиме

--live_summary

 — 

Отображает подробный отчет, аналогичный команде SUMMARY, в котором отображаются сведения о ходе выполнения каждой фазы запроса. Информация обновляется в интерактивном режиме по мере обработки запроса. См. LIVE_PROGRESS Query Option

-var=variable_name=value

 — 

Определяет подстановочную переменную, которую можно использовать в сессии impala-shell. Переменная может быть заменена в операторах, обрабатываемых опциями -q или -f, или в интерактивной сессии. В операторе SQL используется следующий синтаксис: ${var:variable_name}

--auth_creds_ok_in_clear

 — 

Позволяет использовать аутентификацию LDAP при небезопасном подключении к impala-shell. Обратите внимание, что учетные данные для аутентификации отправляются в незашифрованном виде и могут быть уязвимы для атак

--protocol=protocol

 — 

Протокол, используемый для подключения к Impala. Допустимые значения:

  • hs2 — impala-shell подключается к impalad через HiveServer2 по бинарному протоколу TCP. Это значение по умолчанию.

  • hs2-http — impala-shell подключается к impalad через HiveServer2 по HTTP.

  • beeswax — impala-shell подключается к impalad через Beeswax по бинарному протоколу TCP.

--hs2_fp_format=HS2_FP_FORMAT

hs2_fp_format=HS2_FP_FORMAT

Задает спецификацию формата вывода для значений с плавающей запятой при использовании протокола HS2. По умолчанию значения обрабатываются встроенным методом Python str(). Используйте 16G, чтобы соответствовать выходному формату чисел с плавающей запятой протокола Beeswax

Конфигурационный файл impala-shell

Как упоминалось выше, можно сохранить набор настроек по умолчанию для impala-shell в конфигурационном файле.

Путь по умолчанию к глобальному файлу конфигурации impala-shell — /etc/impalarc. Путь по умолчанию к файлу конфигурации пользовательского уровня — ~/.impalarc. Обратите внимание, что имя файла глобального уровня не включает точку (.). Чтобы изменить путь по умолчанию к глобальному файлу конфигурации, установите переменную среды $IMPALA_SHELL_GLOBAL_CONFIG_FILE.

Поскольку файлы конфигурации ADH Impala расположены в каталоге /etc/impala/conf, вы можете создать глобальный файл конфигурации impala-shell в этом каталоге и установить переменную $IMPALA_SHELL_GLOBAL_CONFIG_FILE:

$ export IMPALA_SHELL_GLOBAL_CONFIG_FILE=/etc/impala/conf

Также можно запустить impala-shell с параметром --config_file, устанавливающим путь к файлу конфигурации.

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

Файл конфигурации impala-shell (глобальный или пользовательский) должен содержать заголовок [impala], за которым следуют параметры.

Имена параметров в файле конфигурации аналогичны длинным формам аргументов командной строки impala-shell. Они перечислены в таблице выше.

Вы также можете указать опции, представляющие собой пары ключ/значение, используя keyval, аналогично параметру командной строки --var. Например, keyval=variable1=value1.

Файл конфигурации также может содержать параметры запроса в секции [impala.query_options]. Параметры, указанные в разделе [impala], переопределяют параметры из раздела [impala.query_options].

В приведенном ниже примере показан файл конфигурации, в котором включен подробный режим вывода, таким образом каждый вывод SQL-запроса сопровождается информацией о времени. impala-shell выполняет запросы к базе данных test по умолчанию. Вывод запроса форматируется как текст с разделителями и сохраняется в файле. Также включается опция show_profiles. Эта опция выводит подробную информацию о производительности после каждого запроса.

[impala]
verbose=true
default_db=test
write_delimited=true
output_delimiter=,
output_file=/home/test_result.csv
show_profiles=true
keyval=var1=value1,keyval=var2=value2

В следующем примере показан файл конфигурации, который подключается к определенному хосту Impala, выполняет один запрос к базе данных test, а затем завершает работу. Любые параметры запроса, предварительно определенные в разделе [impala.query_options], применяются во время сессии.

[impala]
impalad=ees-adh1.ru-central1.internal
default_db=test
# Run the query and exit
query=select count(*) from customers

[impala.query_options]
mem_limit=32g

Вы можете использовать второй тип файла конфигурации с параметром командной строки --config_file, чтобы легко выбирать между множеством предопределенных запросов, которые можно запускать для разных баз данных, хостов или даже разных кластеров. Чтобы запустить последовательность операторов вместо одного запроса, создайте файл с операторами и укажите параметр конфигурации query_file=path_to_query_file в тексте запроса.

Подключение к impalad на определенном хосте

Для подключения к демону impalad на другом хосте необходимо указать параметры подключения одним из описанных ниже способов.

С помощью параметров командной строки

Вы можете использовать параметры командной строки при запуске команды impala-shell:

$ impala-shell -i ees-1adh3.ru-central1.internal:28000 --protocol='hs2-http'

Этот пример подключается к impalad на хосте ees-1adh3.ru-central1.internal и порте 28000, через HiveServer2 по HTTP.

С помощью конфигурационного файла

Параметры подключения можно указать в файле. Создайте файл с настройками подключения, как описано в разделе Конфигурационный файл impala-shell. Например:

$ cat > ~/custom_conf1
[impala]
impalad=ees-1adh2.ru-central1.internal
query=select version()

При использовании команды cat нажмите CTRL+D, чтобы выйти.

Запустите impala-shell:

$ impala-shell --config_file=~/custom_conf1

Результат:

Starting Impala Shell with no authentication using Python 2.7.5
Warning: live_progress only applies to interactive shell sessions, and is being skipped for now.
Opened TCP connection to ees-1adh2.ru-central1.internal:21050
Connected to ees-1adh2.ru-central1.internal:21050
Server version: impalad version 4.2.0-RELEASE RELEASE (build 978afcfae9aa626de182b2872c4469646f42e0f6)
Query: select version()
Query submitted at: 2023-07-25 14:36:57 (Coordinator: http://ees-1adh2.ru-central1.internal:25000)
Query progress can be monitored at: http://ees-1adh2.ru-central1.internal:25000/query_plan?query_id=084b59535cac1baf:5f5e61f500000000
+----------------------------------------------------------------------------------------+
| version()                                                                              |
+----------------------------------------------------------------------------------------+
| impalad version 4.2.0-RELEASE RELEASE (build 978afcfae9aa626de182b2872c4469646f42e0f6) |
| Built on Mon Jun  5 16:33:03 UTC 2023                                                  |
+----------------------------------------------------------------------------------------+
Fetched 1 row(s) in 0.44s

С помощью команды CONNECT

Выполните команду CONNECT во время сессии impala-shell:

$ impala-shell
connect ees-1adh3.ru-central1.internal;

Результат:

Opened TCP connection to ees-1adh3.ru-central1.internal:21050
Connected to ees-1adh3.ru-central1.internal:21050
Server version: impalad version 4.2.0-RELEASE RELEASE (build 978afcfae9aa626de182b2872c4469646f42e0f6)
[ees-1adh3.ru-central1.internal:21050] default>

Подключение к определенной базе данных

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

$ impala-shell -i localhost -d my_db

localhost ссылается на тот же хост, на котором работает impala-shell.

Выполнение операторов SQL в неинтерактивном режиме

Вызовите impala-shell с параметром -q для запуска единичного оператора или с параметром -f для запуска последовательности операторов из файла. Команда impala-shell возвращает результат сразу, без перехода в интерактивный режим:

$ impala-shell -i localhost -d my_db -q 'show tables'

$ impala-shell -i localhost -d my_db -f recreate_tables.sql

Выполнение команд и операторов SQL

Интерпретатор impala-shell принимает операторы SQL, описанные в статье Impala SQL Statements, и команды оболочки, которые можно использовать для настройки работоспособности и диагностики проблем.

В неинтерактивном режиме результат запроса выводится в stdout или в файл, указанный в параметре -o. Ошибки выводятся в stderr. Таким образом, вы можете обрабатывать результат запроса как часть пайплайна Unix.

В интерактивном режиме impala-shell использует библиотеку Readline для вызова и редактирования предыдущих команд.

Вы можете использовать следующие сочетания клавиш и правила синтаксиса для запуска команд и операторов SQL в impala-shell:

  • Чтобы увидеть полный список доступных команд, дважды нажмите TAB.

  • Чтобы пролистать предыдущие команды, нажмите клавиши со стрелками вверх и вниз.

  • Используйте стандартный набор сочетаний клавиш в библиотеке GNU Readline для редактирования и перемещения курсора, например Ctrl+A для перемещения курсора в начало строки и Ctrl+E — в конец строки.

  • Команды и операторы SQL могут занимать несколько строк и должны заканчиваться точкой с запятой (;).

  • Используйте --, чтобы закомментировать однострочный комментарий, и /* <content> */, чтобы закомментировать несколько строк. Комментарий рассматривается как часть оператора, которому он предшествует. Когда вы вводите комментарий, вы получаете запрос на продолжение, пока не введете точку с запятой. Например:

    default> -- Show tables starting with t
    > SHOW TABLES LIKE 't*';

    Если комментарий содержит ${variable_name} и не предназначен для замены переменной, символ $ должен быть заэкранирован, например — \${hello}.

Приведенный ниже пример использует и команды impala-shell и операторы SQL, чтобы создать базу данных test и таблицу table1:

create database test;
use test;
create table table1 (field1 int, field2 boolean, field3 string);
insert into table1 values ((1,true,"row1"), (2,true,"row2"), (3,false,"row3"));
select * from table1;

Результат:

+--------+--------+--------+
| field1 | field2 | field3 |
+--------+--------+--------+
| 1      | true   | row1   |
| 2      | true   | row2   |
| 3      | false  | row3   |
+--------+--------+--------+

Подстановка переменных

Можно определить переменные, которые будут подставляться в операторы SQL, обрабатываемые impala-shell. Для этого в командной строке укажите параметр --var=variable_name=value. В интерактивной сессии или в файле скрипта, переданного с помощью параметра -f, используйте команду SET VAR:variable_name=value. Чтобы добавить переменную в оператор SQL, используйте запись: ${VAR:variable_name}.

Примеры ниже содержат несколько команд, определяющих переменные, и используют их в операторах SQL, выполняемых с помощью -q. Строки аргументов -q, в которых есть ссылки на переменные ${var:value}, заключены в одинарные кавычки.

Пример 1:

$ impala-shell --var=tname=table1 --var=colname=col1 --var=coltype=string -q 'CREATE TABLE ${var:tname} (${var:colname} ${var:coltype}) STORED AS PARQUET'

Результат:

Query: CREATE TABLE table1 (col1 string) STORED AS PARQUET
+-------------------------+
| summary                 |
+-------------------------+
| Table has been created. |
+-------------------------+

Пример 2:

$ impala-shell --quiet --var=tname=table1
use test;
select count(*) from ${var:tname};

Результат:

+----------+
| count(*) |
+----------+
| 3        |
+----------+

Пример 3:

$ impala-shell
set var:tname=table1;
select count(*) from ${var:tname};

Результат:

+----------+
| count(*) |
+----------+
| 3        |
+----------+
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней