Время прочтения: 2 мин.
Необходимо получить информацию из таблицы: партиционирована по дате, средний размер партиции 3,4 Тб, общий размер таблицы 3 Пб. Данные нужны за несколько месяцев. Одним запросом получить информацию оказалось невозможно, все попытки завершались ошибкой по истечении некоторого времени.
В таблице ниже первые 2 строки — это попытки обращения ко всей таблице, 3 строка – попытка выборки из 3-х партиций, последняя строка обращение к одной партиции.
Aggregate Resource Allocation | MB-seconds | vcore-seconds | Time | Result | Total Allocated Containers |
Без выбора партиции | 45458194 | 2774 | 48min 30sec | Application failed | 1 |
Без выбора партиции | 51017973 | 3113 | 51mins 53sec | Application failed | 1 |
Выбраны 3 партиции | 7579240337 | 614204 | 2hrs 6mins | Application finished | 166 |
Выбрана 1 партиция | 2356599459 | 191256 | 22mins 12sec | Application finished | 166 |
В итоге получить информацию за приемлемое время можно обращаясь в одном запросе к одной партиции.
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-скриптов позволяет облегчить рутинные задачи и повысить эффективность работы.