Время прочтения: 2 мин.

Необходимо получить информацию из таблицы: партиционирована по дате, средний размер партиции 3,4 Тб, общий размер таблицы 3 Пб. Данные нужны за несколько месяцев. Одним запросом получить информацию оказалось невозможно, все попытки завершались ошибкой по истечении некоторого времени.

В таблице ниже первые 2 строки — это попытки обращения ко всей таблице, 3 строка – попытка выборки из 3-х партиций, последняя строка обращение к одной партиции.  

Aggregate Resource AllocationMB-secondsvcore-secondsTimeResultTotal Allocated Containers
 Без выбора партиции45458194277448min 30secApplication failed1
 Без выбора партиции51017973311351mins 53secApplication failed1
Выбраны 3 партиции75792403376142042hrs 6minsApplication finished166
 Выбрана 1 партиция235659945919125622mins 12secApplication finished166

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

Hive (Hue) не поддерживает циклы в явном виде. Можно имитировать цикл с помощью рекурсии, но этот способ применим не во всех случаях. Можно написать несколько запросов, и запустить их вместе. Да, они будут выполняться по очереди. Но есть минус, если один из запросов упадёт с ошибкой, то все следующие за ним не выполнятся.

Таким образом, задача сводится к необходимости цикличного запуска SQL-запроса с динамическим изменением условий.

У нас есть возможность выполнять запросы Hive с помощью Apache Beeline (далее — beeline).

Beeline может выполнять SQL-запросы и получать результаты, отображать метаданные таблиц и баз данных, а также управлять пользователями и таблицами (создавать, удалять, записывать). Он предоставляет удобный интерфейс командной строки, что делает его простым и удобным для использования. Также появляется возможность использовать bash-скрипты. Оболочка bash поддерживает циклы, есть планировщик, что позволяет запланировать запуск в «ночное» время, когда нагрузка минимальна.

В общем случае алгоритм выглядит следующим образом:Подключаюсь по ssh к серверу, с помощью клиента Putty (можно использовать любой знакомый/удобный для Вас);

1.В домашнем каталоге создаю файл, touch <имя файла>;

2. Открываю файл в любом редакторе, я использовал vim. Пишу скрипт:

3. Сначала объявляю массив, по которому буду итерироваться:

partArray=('2023-05-02' '2023-05-01')

Далее цикл и SQL – запрос, который будет запускаться:

for i in ${partArray[@]} 
do
beeline -u 'jdbc:hive2://<Сервер>:<Порт>/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2' -n <Логин> -p <Пароль> -e "INSERT INTO <Приемник> SELECT <список полей> FROM <таблица> WHERE <имя партиции> = '$i' AND <другие условия>
done

4. Сохраняю изменения и устанавливаю разрешения на выполнение для файла: chmod +x <имя файла>

5.Запускаю скрипт: ./ <имя файла>

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

Команда:

at 19:00 –f /<путь до файла>/<файл>

Преимуществом использования bash-скриптов являются: простота (использование команд и синтаксиса командной строки), гибкость, быстрое развертывание (легко скопировать, запустить).

Использование bash-скриптов позволяет облегчить рутинные задачи и повысить эффективность работы.