Partilhar via


Executar o Apache Oozie em clusters do Azure HDInsight com o Pacote de Segurança Enterprise

O Apache Oozie é um sistema de coordenação e fluxo de trabalho que gere tarefas do Apache Hadoop. O Oozie está integrado na pilha do Hadoop e suporta as seguintes tarefas:

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

Também pode utilizar o Oozie para agendar tarefas específicas de um sistema, como programas Java ou scripts de shell.

Pré-requisito

Um cluster do Azure HDInsight Hadoop com o Pacote de Segurança Enterprise (ESP). Veja Configurar clusters do HDInsight com ESP.

Nota

Para obter instruções detalhadas sobre como utilizar o Oozie em clusters não ESP, veja Utilizar fluxos de trabalho do Apache Oozie no Azure HDInsight baseado em Linux.

Ligar a um cluster esp

Para obter mais informações sobre o Secure Shell (SSH), veja Ligar ao HDInsight (Hadoop) com SSH.

  1. Ligue-se ao cluster do HDInsight através de SSH:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.net
    
  2. Para verificar a autenticação Kerberos com êxito, utilize o klist comando . Caso contrário, utilize kinit para iniciar a autenticação Kerberos.

  3. Inicie sessão no gateway do HDInsight para registar o token OAuth necessário para aceder Azure Data Lake Storage:

    curl -I -u [DomainUserName@Domain.com]:[DomainUserPassword] https://<clustername>.azurehdinsight.net
    

    Um código de resposta de estado de 200 OK indica um registo com êxito. Verifique o nome de utilizador e a palavra-passe se for recebida uma resposta não autorizada, como 401.

Definir o fluxo de trabalho

As definições de fluxo de trabalho do Oozie são escritas na Linguagem de Definição de Processos (hPDL) do Apache Hadoop. hPDL é uma linguagem de definição de processo XML. Siga os seguintes passos para definir o fluxo de trabalho:

  1. Configurar a área de trabalho de um utilizador de domínio:

    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>/
    

    Substitua pelo DomainUser nome de utilizador do domínio. Substitua DomainUserPath pelo caminho do diretório raiz para o utilizador de domínio. Substitua pela ClusterVersion versão da plataforma de dados do cluster.

  2. Utilize a seguinte instrução para criar e editar um novo ficheiro:

    nano workflow.xml
    
  3. Depois de o editor nano abrir, introduza o seguinte XML como o conteúdo do ficheiro:

    <?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. Substitua clustername pelo nome do cluster.

  5. Para guardar o ficheiro, selecione Ctrl+X. Introduza Y. Em seguida, selecione Enter.

    O fluxo de trabalho está dividido em duas partes:

    • Credencial. Esta secção utiliza as credenciais utilizadas para autenticar as ações do Oozie:

      Este exemplo utiliza a autenticação para ações do Hive. Para saber mais, veja Autenticação de Ação.

      O serviço de credenciais permite que as ações do Oozie representem o utilizador para aceder aos serviços do Hadoop.

    • Ação. Esta secção tem três ações: map-reduce, Hive server 2 e Hive server 1:

      • A ação de redução de mapas executa um exemplo de um pacote Oozie para redução de mapas que produz a contagem de palavras agregada.

      • As ações do Hive Server 2 e do Hive Server 1 executam uma consulta numa tabela do Hive de exemplo fornecida com o HDInsight.

      As ações do Hive utilizam as credenciais definidas na secção credenciais para autenticação com a palavra-chave cred no elemento de ação.

  6. Utilize o seguinte comando para copiar o workflow.xml ficheiro para /user/<domainuser>/examples/apps/map-reduce/workflow.xml:

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Substitua pelo domainuser nome de utilizador do domínio.

Definir o ficheiro de propriedades para a tarefa do Oozie

  1. Utilize a seguinte instrução para criar e editar um novo ficheiro para as propriedades da tarefa:

    nano job.properties
    
  2. Depois de o editor nano abrir, utilize o seguinte XML como o conteúdo do ficheiro:

    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
    
    • Utilize o adl://home URI para a nameNode propriedade se tiver Azure Data Lake Storage Gen1 como o armazenamento do cluster principal. Se estiver a utilizar Armazenamento de Blobs do Azure, mude para wasb://home. Se estiver a utilizar Azure Data Lake Storage Gen2, mude para abfs://home.
    • Substitua pelo domainuser nome de utilizador do domínio.
    • Substitua ClusterShortName pelo nome abreviado do cluster. Por exemplo, se o nome do cluster for https:// [ligação de exemplo] sechadoopcontoso.azurehdisnight.net, é clustershortname os primeiros seis carateres do cluster: sechad.
    • Substitua pelo jdbcurlvalue URL JDBC da configuração do Hive. Um exemplo é jdbc:hive2://headnodehost:10001/;transportMode=http.
    • Para guardar o ficheiro, selecione Ctrl+X, introduza Ye, em seguida, selecione Enter.

    Este ficheiro de propriedades tem de estar presente localmente ao executar tarefas do Oozie.

Criar scripts do Hive personalizados para tarefas do Oozie

Pode criar os dois scripts do Hive para o Hive Server 1 e o Hive Server 2, conforme mostrado nas secções seguintes.

Ficheiro do Hive Server 1

  1. Criar e editar um ficheiro para as ações do Hive Server 1:

    nano countrowshive1.hql
    
  2. Crie o script:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select devicemake from hivesampletable limit 2;
    
  3. Guarde o ficheiro no Sistema de Ficheiros Distribuído Apache Hadoop (HDFS):

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

Ficheiro do Hive Server 2

  1. Criar e editar um campo para as ações do Hive Server 2:

    nano countrowshive2.hql
    
  2. Crie o script:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}' 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    select devicemodel from hivesampletable limit 2;
    
  3. Guarde o ficheiro no HDFS:

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

Submeter tarefas do Oozie

Submeter tarefas do Oozie para clusters ESP é como submeter tarefas do Oozie em clusters não ESP.

Para obter mais informações, veja Utilizar o Apache Oozie com o Apache Hadoop para definir e executar um fluxo de trabalho no Azure HDInsight baseado em Linux.

Resultados de uma submissão de trabalho do Oozie

As tarefas do Oozie são executadas para o utilizador. Assim, tanto os registos de auditoria do Apache Hadoop YARN como do Apache Ranger mostram os trabalhos que estão a ser executados como o utilizador representado. A saída da interface de linha de comandos de uma tarefa do Oozie é semelhante ao seguinte código:

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             -
-----------------------------------------------------------------------------------------------

Os registos de auditoria do Ranger para as ações do Servidor do Hive 2 mostram o Oozie a executar a ação para o utilizador. As vistas Ranger e YARN são visíveis apenas para o administrador do cluster.

Configurar a autorização do utilizador no Oozie

Por si só, o Oozie tem uma configuração de autorização de utilizador que pode impedir os utilizadores de parar ou eliminar tarefas de outros utilizadores. Para ativar esta configuração, defina como oozie.service.AuthorizationService.security.enabledtrue.

Para obter mais informações, veja Instalação e Configuração do Apache Oozie.

Para componentes como o Hive Server 1 em que o plug-in do Ranger não está disponível ou suportado, só é possível autorização hdFS agregada. A autorização detalhada só está disponível através de plug-ins do Ranger.

Obter a IU web do Oozie

A IU Web do Oozie fornece uma vista baseada na Web sobre o estado das tarefas do Oozie no cluster. Para obter a IU da Web, siga os seguintes passos nos clusters esp:

  1. Adicione um nó de extremidade e ative a autenticação SSH Kerberos.

  2. Siga os passos da IU Web do Oozie para ativar o túnel SSH para o nó de extremidade e aceder à IU da Web.

Passos seguintes