Автоматически увеличивайте производительность в 2–3 раза

Если вы найдете эту статью какой-либо полезной, прокомментируйте или нажмите кнопку аплодисментов слева, чтобы дать мне бесплатную виртуальную поддержку!

Мотивация

Этот bash скрипт очень полезен для выполнения файлов HiveQL (.hql)или файлов SQL (.sql). Например, вместо того, чтобы периодически проверять завершение CREATE TABLE или JOIN, этот сценарий предоставляет уведомления по электронной почте, а также запись времени, необходимого для задействованных операций Hive / SQL. Это особенно полезно для выполнения серии Hive / SQL JOIN за ночь для анализа на следующий день.

Сценарий

Как практикующий специалист по анализу данных, я не люблю излишне объясненную ерунду, когда я просто ищу код, который нужно переработать и изменить для своих целей, поэтому, пожалуйста, найдите сценарий ниже. Если вы хотите получить более подробное объяснение сценария, помимо комментариев к коду, см. Приложение в конце. Достаточное объяснение bash, его преобразований на битовом уровне, HiveQL / SQL и механизмов баз данных выходит за рамки этой статьи. Как написано, приведенный ниже скрипт будет работать только для HiveQL при копировании. Вам нужно будет внести небольшие изменения, чтобы он работал с вашим дистрибутивом SQL. Например, изменение hive -f на mysql source, если вы используете MySQL. Также возможно, чтобы сценарий отправлял электронные письма более чем на один адрес электронной почты.

#!/bin/bash
## By Andrew Young 
## Contact: [email protected]
## Last modified date: 13 Dec 2019
################
## DIRECTIONS ##
################
## Run the following <commands> without the "<" or ">".
## <chmod u+x scriptname> to make the script executable. (where scriptname is the name of your script)
## To run this script, use the following command:
## ./<yourfilename>.sh
#################################
## Ask user for Hive file name ##
#################################
echo Hello. Please enter the HiveQL filename with the file extension. For example, 'script.hql'. To cancel, press 'Control+C'. For your convenience, here is a list of files in the present directory\:
ls -l
read -p 'Enter the HiveQL filename: ' HIVE_FILE_NAME
#read HIVE_FILE_NAME
echo You specified: $HIVE_FILE_NAME
echo Executing...
######################
## Define variables ##
######################
start="$(date)"
starttime=$(date +%s)
#####################
## Run Hive script ##
#####################
hive -f "$HIVE_FILE_NAME"
#################################
## Human readable elapsed time ##
#################################
secs_to_human() {
    if [[ -z ${1} || ${1} -lt 60 ]] ;then
        min=0 ; secs="${1}"
    else
        time_mins=$(echo "scale=2; ${1}/60" | bc)
        min=$(echo ${time_mins} | cut -d'.' -f1)
        secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
        secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
    fi
    timeelapsed="Clock Time Elapsed : ${min} minutes and ${secs} seconds."
}
################
## Send email ##
################
end="$(date)"
endtime=$(date +%s)
secs_to_human $(($(date +%s) - ${starttime}))
subject="$HIVE_FILE_NAME started @ $start || finished @ $end"
## message="Note that $start and $end use server time. \n $timeelapsed"
## working version:
mail -s "$subject" [email protected] <<< "$(printf "
Server start time: $start \n
Server   end time: $end   \n
$timeelapsed")"
#################
## FUTURE WORK ##
#################
# 1. Add a diagnostic report. The report will calculate:
#    a. number of rows,
#    b. number of distinct observations for each column,
#    c. an option for a cutoff threshold for observations that ensures the diagnostic report is only produced for tables of a certain size. this can help prevent computationally expensive diagnostics for a large table
#
# 2. Option to save output to a text file for inclusion in email notification.
#################

Пояснение к сценарию

Здесь я объясню код для каждого раздела скрипта.

################
## DIRECTIONS ##
################
## Run the following <commands> without the "<" or ">".
## <chmod u+x scriptname> to make the script executable. (where scriptname is the name of your script)
## To run this script, use the following command:
## ./<yourfilename>.sh

chmod - это bash команда, обозначающая «режим изменения». Я использую его, чтобы изменить права доступа к файлу. Это гарантирует, что вам, владельцу, разрешено выполнять свой собственный файл на используемом вами узле / машине.

#################################
## Ask user for Hive file name ##
#################################
echo Hello. Please enter the HiveQL filename with the file extension. For example, 'script.hql'. To cancel, press 'Control+C'. For your convenience, here is a list of files in the present directory\:
ls -l
read -p 'Enter the HiveQL filename: ' HIVE_FILE_NAME
#read HIVE_FILE_NAME
echo You specified: $HIVE_FILE_NAME
echo Executing...

В этом разделе я использую команду ls -l, чтобы вывести список всех файлов в том же каталоге (т.е. «папке»), что и .sh файл, в который вы сохранили мой скрипт. read -p используется для сохранения введенных пользователем данных, т. Е. Имени файла .hql или .sql, который вы хотите запустить, в переменной, которая используется позже в сценарии.

######################
## Define variables ##
######################
start="$(date)"
starttime=$(date +%s)

Здесь регистрируется системное время. Мы сохраняем две версии в двух разных переменных: start и starttime.

start="$(date)" сохраняет системное время и дату.
starttime=$(date +%s) сохраняет системное время и дату в виде смещения числа секунд от 1900. Первая версия позже используется в электронном письме для отображения метки времени и даты начала выполнения сценария HiveQL / SQL. Второй используется для расчета количества прошедших секунд и минут. Это обеспечивает удобную запись количества времени, которое потребовалось для построения таблицы (таблиц) в предоставленном вами сценарии HiveQL / SQL.

#################################
## Human readable elapsed time ##
#################################
secs_to_human() {
    if [[ -z ${1} || ${1} -lt 60 ]] ;then
        min=0 ; secs="${1}"
    else
        time_mins=$(echo "scale=2; ${1}/60" | bc)
        min=$(echo ${time_mins} | cut -d'.' -f1)
        secs="0.$(echo ${time_mins} | cut -d'.' -f2)"
        secs=$(echo ${secs}*60|bc|awk '{print int($1+0.5)}')
    fi
    timeelapsed="Clock Time Elapsed : ${min} minutes and ${secs} seconds."
}

Это сложный для декодирования раздел. По сути, это большой код, который делает что-то очень простое: находит разницу между временем начала и окончания, как в секундах, затем преобразует прошедшее время из секунд в минуты и секунды. Например, если задание заняло 605 секунд, мы преобразовываем это время в 10 минут 5 секунд и сохраняем его в переменной с именем timeelapsed, которая будет использоваться в электронном письме, которое мы отправили себе и / или различным заинтересованным сторонам.

################
## Send email ##
################
end="$(date)"
endtime=$(date +%s)
secs_to_human $(($(date +%s) - ${starttime}))
subject="$HIVE_FILE_NAME started @ $start || finished @ $end"
## message="Note that $start and $end use server time. \n $timeelapsed"
## working version:
mail -s "$subject" [email protected] <<< "$(printf "
Server start time: $start \n
Server   end time: $end   \n
$timeelapsed")"

В этом разделе я снова записываю системное время в двух разных форматах как две разные переменные. На самом деле я использую только одну из этих переменных. Я решил оставить неиспользуемую переменную endtime для возможных будущих расширений этого скрипта. Переменная $end используется в уведомлении по электронной почте, чтобы сообщить системное время и дату завершения работы над файлом HiveQL / SQL.

Я определяю переменную subject, которая, что неудивительно, становится темой электронного письма. Я закомментировал переменную message, потому что не смог заставить команду printf правильно заменить \n новыми строками в теле сообщения электронной почты. Я оставил его на месте, потому что хотел предоставить вам возможность редактировать его для своих целей.

mail - это программа, которая отправляет электронные письма. Вероятно, он у вас будет или что-то в этом роде. Есть и другие варианты для mail, такие как mailx, sendmail, smtp-cli, ssmtp, S waks и ряд других. Некоторые из этих программ являются подмножествами или производными друг друга.

Будущая работа

В духе сотрудничества и продолжения этих усилий вот несколько идей для будущей работы:

  1. Разрешить пользователю указать каталог файлов HiveQL / SQL, в котором будет выполняться поиск целевого файла. Примером использования является случай, когда пользователь мог организовать свой код HiveQL / SQL в несколько каталогов в зависимости от проекта / времени.
  2. Улучшите форматирование уведомления по электронной почте.
  3. Добавьте надежности сценарию, автоматически определяя, был ли введен сценарий HiveQL или SQL, и, если последний, возможность указать распределение (например, OracleDB, MySQL и т. Д.).
  4. Добавьте параметр, позволяющий пользователю указать, следует ли отправлять вывод запроса на указанный адрес электронной почты. Пример использования: запуск множества операторов SELECT для исследовательского анализа данных (EDA). Например, подсчет количества различных значений каждого поля таблицы, поиск отдельных уровней категориального поля, поиск подсчетов по группам, числовая сводная статистика, такая как среднее значение, медиана, стандартное отклонение и т. Д.
  5. Добавьте возможность пользователю указать один или несколько адресов электронной почты в командной строке.
  6. Добавьте возможность пользователю указать несколько файлов .hql и / или .sql, которые будут запускаться последовательно или, возможно, параллельно.
  7. Добавьте возможность распараллеливания. Пример использования: у вас сжатые сроки, и вам не нужно беспокоиться об использовании ресурсов или этикете коллег. Мне нужны мои результаты!
  8. Добавьте возможность запланировать выполнение кода. Скорее всего, в виде sleep, указанного пользователем. Вариант использования: вы хотите быть вежливым и избегать запусков во время выполнения производственного кода и при высокой загрузке кластера в течение рабочего дня.
  9. Сделайте один или несколько из перечисленных выше параметров доступными с помощью флагов. Это было бы действительно круто, но еще нужно много работать, чтобы просто посыпать сверху.
  10. Более.

Учебник для новичков

  1. Откройте любой интерфейс терминала командной строки, который вы предпочитаете. Примеры включают Терминал в MacOS и Cygwin в Windows. В MacOS уже установлен Терминал. В Windows вы можете загрузить Cygwin здесь.
  2. Перейдите в каталог с вашими .hql файлами. Например, введите cd anyoung/hqlscripts/, чтобы изменить текущий рабочий каталог на эту папку. Это концептуальный эквивалент двойного щелчка по папке, чтобы открыть ее, за исключением того, что здесь мы используем текстовую команду.
  3. nano <whateverfilename>.sh
    nano - это команда, которая открывает программу с тем же именем и просит ее создать новый файл с именем <whateverfilename>.sh
    Чтобы изменить этот файл, используйте ту же команду.
  4. Скопируйте мой сценарий и вставьте его в этот новый .sh файл. Измените адрес электронной почты получателя в моем скрипте с [email protected] на ваш.
  5. bash <whateverfilename>.sh
    Bash использует файлы с расширением типа .sh. Эта команда просит программу bash запустить ваш файл «оболочки» с расширением .sh. После запуска сценарий выведет список всех файлов в том же каталоге, что и сценарий оболочки. Этот вывод списка я запрограммировал для удобства.
  6. Поразитесь увеличению вашей продуктивности!

об авторе

Эндрю Янг - менеджер по научным исследованиям и разработкам в Neustar. Для контекста, Neustar - это компания, предоставляющая информационные услуги, которая получает структурированные и неструктурированные текстовые и графические данные от сотен компаний в таких областях, как авиация, банковское дело, правительство, маркетинг, социальные сети и телекоммуникации. Neustar объединяет эти компоненты данных, а затем продает готовое блюдо с добавленной стоимостью корпоративным клиентам для таких целей, как консультирование, кибербезопасность, обнаружение мошенничества и маркетинг. В этом контексте г-н Янг является ведущим архитектором в небольшой группе по исследованиям и разработкам, занимающейся наукой о данных, которая создает систему, обеспечивающую все продукты и услуги, которые приносят Neustar более 1 миллиарда долларов годового дохода.

Приложение

Создание сценария HiveQL

Предварительным условием для запуска приведенного выше сценария оболочки является наличие сценария HiveQL или SQL для его запуска. Вот пример сценария HiveQL, example.hql:

CREATE TABLE db.tb1 STORED AS ORC AS
SELECT *
FROM db.tb2
WHERE a >= 5;
CREATE TABLE db.tb3 STORED AS ORC AS
SELECT *
FROM db.tb4 a
INNER JOIN db.tb5 b
ON a.col2 = b.col5
WHERE dt >= 20191201 AND DOB != 01-01-1900;

Обратите внимание, что в одном скрипте HiveQL / SQL может быть одна или несколько CREATE TABLE команд. Они будут выполняться последовательно. Если у вас есть доступ к кластеру узлов, вы также можете воспользоваться распараллеливанием ваших запросов. Я могу объяснить это в другой статье.