Поделиться через


Разработка действий сценариев с помощью HDInsight

Узнайте, как настроить кластер HDInsight с помощью сценариев Bash. Действия сценариев предназначены для настройки HDInsight во время или после создания кластера.

Что такое действия сценариев?

Действия сценариев — это сценарии Bash, которые Azure выполняет на узлах кластера, чтобы вносить изменения в конфигурацию или устанавливать программное обеспечение. Действие сценария выполняется от имени привилегированного пользователя и предоставляет права полного доступа к узлам кластера.

Действия сценариев могут применяться следующими способами:

Этот метод используется для применения сценария… При создании кластера… В работающем кластере…
Портал Azure
Azure PowerShell
Классический Azure CLI  
Пакет SDK для HDInsight .NET
Шаблон Azure Resource Manager  

Дополнительные сведения об использовании этих методов см. в статье Настройка кластеров HDInsight с помощью действия сценария.

Рекомендации по разработке сценариев

При разработке пользовательского сценария для кластера HDInsight следует иметь в виду некоторые рекомендации.

Внимание

Действия сценария должны завершиться в течение 60 минут. В противном случае процесс завершиться ошибкой. Во время подготовки узла данный сценарий выполняется одновременно с другими процессами установки и настройки. Конкуренция за ресурсы, такие как ЦП или пропускная способность сети, может привести к затягиванию выполнения сценария по сравнению со временем его выполнения в среде разработки.

Выбор целевой версии Apache Hadoop

В различных версиях HDInsight используются различные версии служб Hadoop и компонентов. Если сценарий предполагает наличие определенной версии службы или компонента, то такой сценарий следует использовать только с версией HDInsight, включающей необходимые компоненты. Сведения о версиях компонентов, включенных в HDInsight, можно найти в документе Версии компонентов HDInsight .

Проверка версии операционной системы

Для разных версий HDInsight используются конкретные версии Ubuntu. В сценарии следует проверить различия между версиями ОС. Например, может потребоваться установить двоичный файл, привязанный к версии Ubuntu.

Чтобы проверить версию операционной системы, используйте lsb_release. Например, ниже показано, как создать ссылку на конкретный TAR-файл в зависимости от версии операционной системы:

OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
    echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
    HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
    echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
    HUE_TARFILE=hue-binaries-16-04.tgz
fi

Целевая версия операционной системы

HDInsight основан на дистрибутиве Ubuntu Linux. Для разных версий HDInsight используются разные версии Ubuntu. Это может изменить поведение сценария. Например, HDInsight версии 3.4 и более ранних версий основан на версии Ubuntu, в которой используется Upstart. Версии 3.5 и больше основаны на Ubuntu 16.04, который использует Systemd. Systemd и upstart полагаются на разные команды, поэтому скрипт должен быть записан для работы с обоими.

Еще одно важное различие между HDInsight версии 3.4 и 3.5 заключается в том, что теперь JAVA_HOME указывает на Java 8. В следующем коде показано, как определить версию Ubuntu (14 или 16), в которой выполняется сценарий:

OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
    echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
    HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
    echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
    HUE_TARFILE=hue-binaries-16-04.tgz
fi
...
if [[ $OS_VERSION == 16* ]]; then
    echo "Using systemd configuration"
    systemctl daemon-reload
    systemctl stop webwasb.service    
    systemctl start webwasb.service
else
    echo "Using upstart configuration"
    initctl reload-configuration
    stop webwasb
    start webwasb
fi
...
if [[ $OS_VERSION == 14* ]]; then
    export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
elif [[ $OS_VERSION == 16* ]]; then
    export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
fi

Полный скрипт, который содержит эти фрагменты кода, находится здесь: https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.

Сведения о версии Ubuntu, используемой в HDInsight, см. в документе HDInsight component version (Версия компонента HDInsight).

Сведения о различиях между Systemd и запуском см. в разделе Systemd "Пользователи запуска".

Предоставление стабильных ссылок на ресурсы сценария

Сценарии и связанные ресурсы должны оставаться доступными на протяжении жизненного цикла кластера. Эти ресурсы необходимы, если во время операций масштабирования в кластер добавляются новые узлы.

Мы советуем скачивать и архивировать все данные в свою учетную запись хранения Azure.

Внимание

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

К слову, примеры, предоставляемые корпорацией Майкрософт, хранятся в учетной записи хранения по адресу https://hdiconfigactions.blob.core.windows.net/. Это открытый и доступный только для чтения контейнер, который поддерживает команда HDInsight.

Использование предварительно скомпилированных ресурсов

Чтобы сократить время выполнения сценария, избегайте операций, компилирующих ресурсы из исходного кода. Например, заранее скомпилируйте и сохраните ресурсы в BLOB-объекте учетной записи хранения Azure в том же центре обработки данных, что и кластер HDInsight.

Обеспечение идемпотентности сценария настройки кластера

Сценарии должны быть идемпотентными. Имеется в виду, что при многократном выполнении в каждом случае сценарий должен обеспечивать возврат кластера к одному и тому же состоянию.

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

Обеспечение высокого уровня доступности кластера

В кластерах HDInsight под управлением Linux есть два головных узла, активных в пределах кластера. Действия сценария выполняются на обоих узлах. Если устанавливаемым компонентам требуется только один головной узел, не устанавливайте компоненты на обоих головных узлах кластера.

Внимание

Службы, устанавливаемые вместе с HDInsight, выполняют отработку отказа между двумя узлами. Эта функциональность не распространяется на пользовательские компоненты, устанавливаемые при выполнении действий сценария. Если требуется высокий уровень доступности пользовательских компонентов, необходимо реализовать собственный механизм отработки отказа.

Настройка пользовательских компонентов для использования хранилища больших двоичных объектов Azure

Компоненты, устанавливаемые на кластере, могут по умолчанию использовать хранилище распределенной файловой системы (HDFS) Apache Hadoop. В качестве хранилища по умолчанию HDInsight использует хранилище Azure или Data Lake Storage. Это обеспечивает совместимую с HDFS файловую систему, которая сохраняет данные даже после удаления кластера. Может потребоваться настроить устанавливаемые компоненты для использования WASB или ADL вместо HDFS.

Для большинства операций не требуется указывать файловую систему. В следующем примере файл hadoop-common.jar копируется из локальной файловой системы в хранилище кластера.

hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/

В этом примере команда hdfs прозрачно использует хранилище кластера по умолчанию. Для некоторых операций может потребоваться указать URI. Например adl:///example/jars для Azure Data Lake Storage 1-го поколения, abfs:///example/jars Azure Data Lake Storage 2-го поколения или wasb:///example/jars для службы хранилища Azure.

Запись информации в STDOUT и STDERR

HDInsight заносит в журнал выходные данные сценария, которые записываются в поток STDOUT и STDERR. Эти данные можно просмотреть с помощью веб-интерфейса Ambari.

Примечание.

Веб-интерфейс Apache Ambari доступен, только если кластер успешно создан. Если во время создания кластера используется действие сценария и происходит сбой создания, см. раздел Устранение неполадок в действиях сценария, где описаны другие способы доступа к информации в журнале.

Большинство программ и пакетов установки добавляют данные в STDOUT и STDERR по умолчанию, однако вам может потребоваться добавить дополнительные записи в журнал. Для отправки текста в STDOUT используйте echo. Например:

echo "Getting ready to install Foo"

По умолчанию ключевое слово echo отправляет строку в STDOUT. Чтобы направить строку в STDERR, добавьте >&2 перед echo. Например:

>&2 echo "An error occurred installing Foo"

Информация, записываемая в STDOUT, перенаправляется STDERR (2). Дополнительные сведения о перенаправлении операций ввода и вывода см. здесь: https://www.tldp.org/LDP/abs/html/io-redirection.html.

Дополнительные сведения о просмотре сведений, регистрируемых действиями сценариев, см. в разделе Устранение неполадок в сценариях.

Сохранение файлов в формате ASCII с использованием LF в качестве символа завершения строки

Сценарии Bash должны храниться в формате ASCII. Для завершения строк в этом файле используется символ LF. Если в файлах используется кодировка UTF-8 или используется CRLF в качестве конца строки, сценарий может завершиться следующей ошибкой:

$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory

Использование логики повтора для восстановления после временных ошибок

При скачивании файлов установка пакетов с помощью apt-get или других действий, которые передают данные через Интернет, действие может завершиться ошибкой из-за временных сетевых ошибок. Например, удаленный ресурс, с которым вы обмениваетесь данными, может находиться в процессе отработки отказа на резервный узел.

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

#retry
MAXATTEMPTS=3

retry() {
    local -r CMD="$@"
    local -i ATTMEPTNUM=1
    local -i RETRYINTERVAL=2

    until $CMD
    do
        if (( ATTMEPTNUM == MAXATTEMPTS ))
        then
                echo "Attempt $ATTMEPTNUM failed. no more attempts left."
                return 1
        else
                echo "Attempt $ATTMEPTNUM failed! Retrying in $RETRYINTERVAL seconds..."
                sleep $(( RETRYINTERVAL ))
                ATTMEPTNUM=$ATTMEPTNUM+1
        fi
    done
}

В следующих примерах показано, как использовать эту функцию.

retry ls -ltr foo

retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh

Вспомогательные методы для пользовательских сценариев

Вспомогательные методы действий сценариев — это служебные программы, которые можно использовать при создании пользовательских сценариев. Эти методы содержатся в скрипте https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh. Чтобы скачать и использовать их как часть сценария, используйте следующую команду:

# Import the helper method module.
wget -O /tmp/HDInsightUtilities-v01.sh -q https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh && source /tmp/HDInsightUtilities-v01.sh && rm -f /tmp/HDInsightUtilities-v01.sh

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

Назначение вспомогательного приложения Description
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Скачивает файл из исходного универсального кода ресурса (URI) и сохраняет его в указанное расположение. По умолчанию существующий файл не перезаписывается.
untar_file TARFILE DESTDIR Извлекает TAR-файл (с помощью -xf) в папку назначения.
test_is_headnode При запуске на головном узле кластера возвращается значение 1, в противном случае — 0.
test_is_datanode Если текущий узел является узлом данных (рабочим узлом), то возвращается значение 1, в противном случае — 0.
test_is_first_datanode Если текущий узел является первым узлом данных (рабочим узлом с именем workernode0), возвращается значение 1, в противном случае — 0.
get_headnodes Возвращает полное доменное имя головных узлов в кластере. Имена содержат разделители-запятые. При возникновении ошибки возвращается пустая строка.
get_primary_headnode Возвращает полное доменное имя основного головного узла. При возникновении ошибки возвращается пустая строка.
get_secondary_headnode Возвращает полное доменное имя дополнительного головного узла. При возникновении ошибки возвращается пустая строка.
get_primary_headnode_number Возвращает числовой суффикс основного головного узла. При возникновении ошибки возвращается пустая строка.
get_secondary_headnode_number Возвращает числовой суффикс дополнительного головного узла. При возникновении ошибки возвращается пустая строка.

Общие варианты использования

В этом разделе содержится руководство по реализации некоторых общих вариантов использования, которые могут понадобиться при написании пользовательского сценария.

Передача параметров в сценарий

В некоторых случаях для сценария требуется указывать параметры. Например, при использовании интерфейса Ambari REST API может потребоваться пароль администратора кластера.

Параметры, передаваемые в сценарий, называются позиционными параметрами, т. е. $1 соответствует первому параметру, $2 — второму и т.д. Значение $0 содержит имя самого сценария.

Значения, передаваемые в сценарий в качестве параметров, должны быть заключены в одинарные кавычки ('). В этом случае переданное значение рассматривается как литерал.

настройка переменных среды.

Настройка переменной среды выполняется следующим образом:

VARIABLENAME=value

В примере выше VARIABLENAME является именем переменной. Для доступа к переменной используйте $VARIABLENAME. Например, чтобы присвоить значение позиционного параметра переменной среды с именем PASSWORD, воспользуйтесь следующей инструкцией:

PASSWORD=$1

Для последующего доступа к данным используйте $PASSWORD.

Переменные среды, заданные в сценарии, существуют только в пределах области сценария. В некоторых случаях может потребоваться добавить переменные среды, которые значимы на уровне системы и значение которых сохранится после выполнения сценария. Чтобы добавить переменные среды уровня системы, добавьте переменную в /etc/environment. Например, следующий оператор добавляет HADOOP_CONF_DIR:

echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment

Доступ к расположениям, в которых хранятся пользовательские сценарии

Сценарии, используемые для настройки кластера, должны храниться в одном из следующих расположений:

  • учетной записи хранения Azure, связанной с кластером;

  • дополнительной учетной записи хранения, связанной с кластером;

  • ресурсе с общедоступным URI. Например, URL-адрес к данным, хранящимся в OneDrive, Dropbox или других службах размещения файлов.

  • Учетная запись Azure Data Lake Storage, связанная с кластером HDInsight. Дополнительные сведения об использовании Azure Data Lake Store с HDInsight см. в кратком руководстве по установке кластеров в HDInsight.

    Примечание.

    Кластер HDInsight субъекта-службы с доступом к Data Lake Storage должен иметь доступ к сценарию с правами на чтение.

Ресурсы, используемые сценарием, также должны быть общедоступными.

Сохранение файлов в учетной записи хранения Azure или Azure Data Lake Storage поможет обеспечить быстрый доступ к файлам, так как оба хранилища находятся в сети Azure.

Примечание.

Формат универсального кода ресурса (URI), используемый для ссылки на скрипт, отличается в зависимости от используемой службы. Для учетной записи хранения, связанной с кластером HDInsight, используйте wasb:// или wasbs://, для общедоступного универсального кода ресурса (URI) — http:// или https://, а для Data Lake Storage — adl://.

Контрольный список для развертывания действия сценария

Ниже приведены шаги для подготовки к развертыванию сценария:

  • Поместите файлы, содержащие пользовательские сценарии, в месте, доступном из узлов кластера во время развертывания. Например, в хранилище по умолчанию для кластера. Файлы также могут храниться в общедоступных службах размещения.
  • Скрипт должен быть идемпотентным. Это обеспечит многократное выполнение сценария на одном узле.
  • Используйте папку для временных файлов, например /tmp, чтобы хранить скачанные файлы, используемый сценариями. После выполнения сценариев очистите эту папку.
  • В случае изменений параметров на уровне операционной системы или файлов конфигурации службы Hadoop может потребоваться перезапуск служб HDInsight.

Как запустить действие сценария

Действия сценариев можно использовать для настройки кластеров HDInsight с помощью следующих методов:

  • Портал Azure
  • Azure PowerShell
  • Шаблоны диспетчера ресурсов Azure
  • Пакет SDK для HDInsight .NET.

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

Примеры пользовательских сценариев

Корпорация Майкрософт предоставляет примеры сценариев для установки компонентов в кластере HDInsight. Пример действия сценария см. в статье Установка и использование Hue в кластерах HDInsight.

Устранение неполадок

Ниже перечислены ошибки, которые могут возникнуть при использовании ваших сценариев.

Ошибка: $'\r': command not found. Иногда дополняется фразой syntax error: unexpected end of file.

Причина.Эта ошибка возникает, когда для завершения строк в сценарии используется символ CRLF. В системах UNIX для завершения строк допускается только символ LF.

Зачастую эта проблема возникает при написании сценария в среде Windows, так как в текстовых редакторах для этой системы CRLF является стандартным символом завершения строки.

Решение.Если в вашем текстовом редакторе имеется функция выбора формата Unix или использования символа LF для завершения строк, воспользуйтесь ею. Кроме того, в системе Unix вы можете использовать следующие команды изменения CRLF на LF.

Примечание.

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

Команда Примечания.
unix2dos -b INFILE Для исходного файла будет создана резервная копия с расширением BAK.
tr -d '\r' < INFILE > OUTFILE В файле OUTFILE для окончания строк будут использоваться только символы LF.
perl -pi -e 's/\r\n/\n/g' INFILE Изменяет файл напрямую.
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE В файле OUTFILE для окончания строк будут использоваться только символы LF.

Ошибка: line 1: #!/usr/bin/env: No such file or directory.

Причина.Эта ошибка возникает, если сценарий сохранен в кодировке UTF-8 с меткой порядка байтов (BOM).

Решение.Сохраните файл в формате ASCII или UTF-8 без метки порядка байтов. Кроме того, для создания файла без метки порядка байтов в системе Linux или Unix вы можете использовать следующую команду:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

Замените INFILE на файл с меткой порядка байтов. OUTFILE должно быть новым именем файла, который будет содержать сценарий без метки порядка байтов.

Следующие шаги