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


Запуск Apache Oozie в кластерах Azure HDInsight с корпоративным пакетом безопасности

Apache Oozie — это система рабочего процесса и координации, которая управляет заданиями Apache Hadoop. Служба Oozie интегрирована со стеком Hadoop и поддерживает следующие задания:

  • Apache MapReduce
  • Apache Pig
  • Apache Hive
  • Apache Sqoop

Вы также можете использовать Oozie для планирования системных заданий, например Java-программ и сценариев оболочки.

Предпосылка

Кластер Azure HDInsight Hadoop с корпоративным пакетом безопасности (ESP). См. статью "Настройка кластеров HDInsight с помощью ESP".

Примечание.

Подробные инструкции по использованию Oozie в кластерах, отличных от ESP, см. в статье Об использовании рабочих процессов Apache Oozie в Azure HDInsight под управлением Linux.

Подключение к кластеру ESP

Дополнительные сведения о Secure Shell (SSH) см. в статье Подключение к HDInsight (Hadoop) с помощью SSH.

  1. Подключитесь к кластеру HDInsight с помощью SSH:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.net
    
  2. Чтобы проверить успешную аутентификацию Kerberos, используйте команду klist. В противном случае используйте kinit для запуска проверки подлинности Kerberos.

  3. Войдите в шлюз HDInsight, чтобы зарегистрировать маркер OAuth, необходимый для доступа к Azure Data Lake Storage:

    curl -I -u [[email protected]]:[DomainUserPassword] https://<clustername>.azurehdinsight.net
    

    Код ответа состояния 200 OK указывает на успешную регистрацию. Проверьте имя пользователя и пароль, если получен несанкционированный ответ, например 401.

Определение рабочего процесса

Определения рабочих процессов Oozie написаны на языке определения процессов Apache Hadoop (hPDL). hPDL — это язык определения XML-процессов. Чтобы определить рабочий процесс, выполните следующие действия.

  1. Настройте рабочую область пользователя домена:

    hdfs dfs -mkdir /user/<DomainUser>
    cd /home/<DomainUserPath>
    cp /usr/hdp/<ClusterVersion>/oozie/doc/oozie-examples.tar.gz .
    tar -xvf oozie-examples.tar.gz
    hdfs dfs -put examples /user/<DomainUser>/
    

    Замените DomainUser доменным именем пользователя. Замените DomainUserPath путь к домашнему каталогу для пользователя домена. Замените ClusterVersion на версию вашей платформы данных кластера.

  2. Для создания и открытия файла выполните следующий запрос:

    nano workflow.xml
    
  3. Открыв редактор nano, введите следующий код XML в качестве содержимого файла:

    <?xml version="1.0" encoding="UTF-8"?>
    <workflow-app xmlns="uri:oozie:workflow:0.4" name="map-reduce-wf">
       <credentials>
          <credential name="metastore_token" type="hcat">
             <property>
                <name>hcat.metastore.uri</name>
                <value>thrift://<active-headnode-name>-<clustername>.<Domain>.com:9083</value>
             </property>
             <property>
                <name>hcat.metastore.principal</name>
                <value>hive/_HOST@<Domain>.COM</value>
             </property>
          </credential>
          <credential name="hs2-creds" type="hive2">
             <property>
                <name>hive2.server.principal</name>
                <value>${jdbcPrincipal}</value>
             </property>
             <property>
                <name>hive2.jdbc.url</name>
                <value>${jdbcURL}</value>
             </property>
          </credential>
       </credentials>
       <start to="mr-test" />
       <action name="mr-test">
          <map-reduce>
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <prepare>
                <delete path="${nameNode}/user/${wf:user()}/examples/output-data/mrresult" />
             </prepare>
             <configuration>
                <property>
                   <name>mapred.job.queue.name</name>
                   <value>${queueName}</value>
                </property>
                <property>
                   <name>mapred.mapper.class</name>
                   <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                   <name>mapred.reducer.class</name>
                   <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                   <name>mapred.map.tasks</name>
                   <value>1</value>
                </property>
                <property>
                   <name>mapred.input.dir</name>
                   <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                   <name>mapred.output.dir</name>
                   <value>/user/${wf:user()}/${examplesRoot}/output-data/mrresult</value>
                </property>
             </configuration>
          </map-reduce>
          <ok to="myHive2" />
          <error to="fail" />
       </action>
       <action name="myHive2" cred="hs2-creds">
          <hive2 xmlns="uri:oozie:hive2-action:0.2">
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <jdbc-url>${jdbcURL}</jdbc-url>
             <script>${hiveScript2}</script>
             <param>hiveOutputDirectory2=${hiveOutputDirectory2}</param>
          </hive2>
          <ok to="myHive" />
          <error to="fail" />
       </action>
       <action name="myHive" cred="metastore_token">
          <hive xmlns="uri:oozie:hive-action:0.2">
             <job-tracker>${jobTracker}</job-tracker>
             <name-node>${nameNode}</name-node>
             <configuration>
                <property>
                   <name>mapred.job.queue.name</name>
                   <value>${queueName}</value>
                </property>
             </configuration>
             <script>${hiveScript1}</script>
             <param>hiveOutputDirectory1=${hiveOutputDirectory1}</param>
          </hive>
          <ok to="end" />
          <error to="fail" />
       </action>
       <kill name="fail">
          <message>Oozie job failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
       </kill>
       <end name="end" />
    </workflow-app>
    
  4. Замените clustername именем кластера.

  5. Чтобы сохранить файл, нажмите клавиши CTRL+X. Введите Y. Затем нажмите Enter.

    Рабочий процесс разделен на две части:

    • Удостоверение Этот раздел принимает учетные данные, используемые для проверки подлинности действий Oozie:

      В этом примере используется проверка подлинности для действий Hive. Дополнительные сведения см. в разделе "Проверка подлинности действий".

      Служба учетных данных позволяет Oozie выполнять олицетворение пользователя для доступа к службам Hadoop.

    • Действие. В этом разделе есть три действия: map-reduce, Hive server 2 и Hive server 1:

      • Действие map-reduce запускает пример из пакета Oozie для map-reduce, который выводит агрегированное число слов.

      • Действия сервера Hive 2 и сервера Hive 1 выполняют запрос в примере таблицы Hive, предоставленной HDInsight.

      Действия Hive используют учетные данные, определенные в разделе учетных данных для проверки подлинности с помощью ключевого слова cred в элементе действия.

  6. Выполните следующую команду, чтобы скопировать файл workflow.xml в /user/<domainuser>/examples/apps/map-reduce/workflow.xml.

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Замените domainuser имя пользователя для домена.

Определение файла свойств для задания Oozie

  1. Используйте следующую инструкцию, чтобы создать и изменить новый файл для свойств задания:

    nano job.properties
    
  2. После открытия редактора nano используйте следующий XML-код в качестве содержимого файла:

    nameNode=adl://home
    jobTracker=headnodehost:8050
    queueName=default
    examplesRoot=examples
    oozie.wf.application.path=${nameNode}/user/[domainuser]/examples/apps/map-reduce/workflow.xml
    hiveScript1=${nameNode}/user/${user.name}/countrowshive1.hql
    hiveScript2=${nameNode}/user/${user.name}/countrowshive2.hql
    oozie.use.system.libpath=true
    user.name=[domainuser]
    jdbcPrincipal=hive/<active-headnode-name>.<Domain>.com@<Domain>.COM
    jdbcURL=[jdbcurlvalue]
    hiveOutputDirectory1=${nameNode}/user/${user.name}/hiveresult1
    hiveOutputDirectory2=${nameNode}/user/${user.name}/hiveresult2
    
    • Используйте универсальный adl://home код ресурса (URI) для nameNode свойства, если в качестве основного хранилища кластера используется Azure Data Lake Storage 1-го поколения. Если вы используете хранилище BLOB-объектов Azure, перейдите на wasb://home. Если вы используете Azure Data Lake Storage 2-го поколения, перейдите на abfs://home.
    • Замените domainuser на ваше имя пользователя для вашего домена.
    • Замените ClusterShortName коротким именем кластера. Например, если имя кластера https:// [пример ссылки] sechadoopcontoso.azurehdisnight.net, clustershortname это первые шесть символов кластера: sechad.
    • Замените jdbcurlvalue на URL-адрес JDBC из конфигурации Hive. Пример — jdbc:hive2://headnodehost:10001/; transportMode=http.
    • Чтобы сохранить файл, нажмите CTRL+X, введите Y, а затем нажмите Ввод.

    Этот файл свойств должен присутствовать локально при выполнении заданий Oozie.

Создание пользовательских скриптов Hive для заданий Oozie

Вы можете создать два скрипта Hive для сервера Hive 1 и Сервера Hive 2, как показано в следующих разделах.

Файл сервера Hive 1

  1. Создайте и измените файл для действий сервера Hive 1:

    nano countrowshive1.hql
    
  2. Создайте сценарий:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select devicemake from hivesampletable limit 2;
    
  3. Сохраните файл в распределенной файловой системе Apache Hadoop (HDFS):

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

Файл сервера Hive 2

  1. Создайте и измените поле для действий сервера Hive 2:

    nano countrowshive2.hql
    
  2. Создайте сценарий:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}' 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    select devicemodel from hivesampletable limit 2;
    
  3. Сохраните файл в HDFS:

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

Отправьте задания Oozie

Отправка заданий Oozie для кластеров ESP похожа на отправку заданий Oozie в кластерах, отличных от ESP.

Дополнительные сведения см. в статье Об использовании Apache Oozie с Apache Hadoop для определения и запуска рабочего процесса на платформе Linux в Azure HDInsight.

Результаты выполнения задания Oozie

Задания Oozie выполняются для пользователя. Поэтому в журналах аудита Apache Hadoop YARN и Apache Ranger отображаются задания, выполняемые в качестве олицетворенного пользователя. Выходные данные интерфейса командной строки задания Oozie выглядят следующим образом:

Job ID : 0000015-180626011240801-oozie-oozi-W
------------------------------------------------------------------------------------------------
Workflow Name : map-reduce-wf
App Path      : adl://home/user/alicetest/examples/apps/map-reduce/wf.xml
Status        : SUCCEEDED
Run           : 0
User          : alicetest
Group         : -
Created       : 2018-06-26 19:25 GMT
Started       : 2018-06-26 19:25 GMT
Last Modified : 2018-06-26 19:30 GMT
Ended         : 2018-06-26 19:30 GMT
CoordAction ID: -

Actions
------------------------------------------------------------------------------------------------
ID                        Status    Ext ID            ExtStatus                 ErrCode
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@:start:    OK    -                         OK             -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@mr-test    OK    job_1529975666160_0051    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@myHive2    OK    job_1529975666160_0053    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@myHive    OK     job_1529975666160_0055    SUCCEEDED      -
------------------------------------------------------------------------------------------------
0000015-180626011240801-oozie-oozi-W@end       OK     -                         OK             -
-----------------------------------------------------------------------------------------------

Журналы аудита Ranger для действий Hive Server 2 показывают, что Oozie выполняет действие от имени пользователя. Представления Ranger и YARN видны только администратору кластера.

Настройка авторизации пользователей в Oozie

Oozie сама по себе имеет конфигурацию авторизации пользователей, которая может блокировать остановку или удаление заданий других пользователей. Чтобы включить эту конфигурацию, установите oozie.service.AuthorizationService.security.enabled на true.

Дополнительные сведения см. в статье Об установке и настройке Apache Oozie.

Для таких компонентов как сервер Hive 1, где подключаемый модуль Ranger недоступен или не поддерживается, возможна только крупнозернистая авторизация HDFS. Детализированная авторизация доступна только с помощью подключаемых модулей Ranger.

Откройте веб-интерфейс Oozie

Веб-интерфейс Oozie позволяет получить информацию о состоянии задания Oozie в кластере. Чтобы получить веб-интерфейс, выполните следующие действия в кластерах ESP:

  1. Добавьте пограничный узел и включите проверку подлинности Kerberos SSH.

  2. Следуйте шагам в веб-интерфейсе Oozie, чтобы включить SSH-туннелирование к пограничному узлу и получить доступ к веб-интерфейсу.

Дальнейшие действия