Executar o Apache Oozie em clusters do Azure HDInsight com o Enterprise Security Package

O Apache Oozie é um sistema de fluxo de trabalho e coordenação que gerencia os trabalhos do Apache Hadoop. O Oozie é integrado à pilha do Hadoop e dá suporte aos seguintes trabalhos:

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

Você também pode usar o Oozie para agendar trabalhos específicos para um sistema, como programas Java ou scripts de shell.

Pré-requisito

Um cluster do Azure HDInsight Hadoop com o ESP (Enterprise Security Package). Confira Configurar clusters do HDInsight com ESP.

Observação

Para obter instruções detalhadas sobre como usar o Oozie em clusters que não são do ESP, confira Usar fluxos de trabalho do Apache Oozie do Hadoop no Azure HDInsight baseado em Linux.

Conectar a um cluster ESP

Para obter mais informações sobre Secure Shell (SSH), consulte Conectar ao HDInsight (Hadoop) usando SSH.

  1. Conecte-se ao cluster HDInsight usando SSH:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.net
    
  2. Para verificar se a autenticação Kerberos foi bem-sucedida, use o comando klist. Caso contrário, use kinit para iniciar a autenticação Kerberos.

  3. Faça logon no gateway de HDInsight para registrar o token OAuth necessário para acessar o ADLS (Azure Data Lake Store):

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

    Um código de resposta de status 200 OK indica um registro bem-sucedido. Verifique o nome de usuário e a senha, caso uma resposta não autorizada seja recebida, como 401.

Definir o fluxo de trabalho

As definições de fluxos de trabalho do Oozie estão gravadas em Apache Hadoop Process Definition Language (hPDL). hPDL é uma linguagem de definição de processo XML. Realize as etapas a seguir para definir o fluxo de trabalho:

  1. Configurar um espaço de trabalho do usuário do 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 DomainUser pelo nome de usuário de domínio. Substitua DomainUserPath pelo caminho do diretório base do usuário de domínio. Substitua ClusterVersion pela sua versão da plataforma de dados do cluster.

  2. Use a instrução a seguir para criar e editar um novo arquivo:

    nano workflow.xml
    
  3. Quando o editor nano for aberto, insira o seguinte XML como conteúdo do arquivo:

    <?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 salvar o arquivo, selecione Ctrl+X. Insira Y. Em seguida, selecione Enter.

    O fluxo de trabalho é dividido em duas partes:

    • Credencial. Essa seção de credenciais usa as credenciais que serão usadas para autenticar as ações do Oozie:

      Esse exemplo usa autenticação para as ações do Hive. Para saber mais, veja Autenticação de Usuário.

      O serviço de credenciais permite que as ações do Oozie representem o usuário para acessar os serviços do Hadoop.

    • Ação. Esta seção tem três ações: redução de mapa, Hive server 2 e o servidor Hive 1:

      • A ação do map-reduce executa um exemplo de um pacote Oozie para o map-reduce que sai da contagem de palavra agregada.

      • As ações do servidor do Hive 2 e do servidor do Hive 1 executam uma consulta simples na tabela hivesample fornecida com o HDInsight.

      As ações do Hive usam as credenciais definidas na seção de credenciais para autenticação usando a palavra-chave cred no elemento action.

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

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Substitua domainuser por seu nome de usuário para o domínio.

Definir o arquivo de propriedades para o trabalho do Oozie

  1. Use a seguinte instrução para criar e editar as propriedades de trabalho de um novo arquivo:

    nano job.properties
    
  2. Quando o editor nano for aberto, use o seguinte XML como conteúdo do arquivo:

    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
    
    • Use o URI adl://home para a propriedade nameNode se você tiver o Azure Data Lake Storage Gen1 como armazenamento de cluster principal. Se você estiver usando o Armazenamento de Blobs do Azure, altere isso para wasb://home. Se você estiver usando o Azure Data Lake Storage Gen2, altere isso para abfs://home.
    • Substitua domainuser por seu nome de usuário para o domínio.
    • Substitua ClusterShortName pelo nome curto para o cluster. Por exemplo, se o nome do cluster for https:// [link do exemplo] sechadoopcontoso.azurehdisnight.net, o clustershortname é os primeiro de seis caracteres do cluster: sechad.
    • Substitua jdbcurlvalue pela URL JDBC da configuração do Hive. Por exemplo, jdbc:hive2://headnodehost:10001/;transportMode=http.
    • Para salvar o arquivo, selecione Ctrl+X, digite Ye selecione Enter.

    Esse arquivo de propriedades precisa estar presente localmente durante a execução de trabalhos do Oozie.

Crie scripts personalizados do Hive para os trabalhos do Oozie

Você pode criar os dois scripts de Hive para o servidor Hive 1 e Servidor Hive 2 conforme exibido nas seções a seguir.

Arquivo do Servidor do Hive 1

  1. Criar e editar um arquivo para ações de servidor Hive 1:

    nano countrowshive1.hql
    
  2. Criar o script:

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

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

Arquivo do Servidor do Hive 2

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

    nano countrowshive2.hql
    
  2. Criar o script:

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

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

Enviar trabalhos de Oozie

O envio de trabalhos do Oozie para clusters ESP é semelhante ao envio de trabalhos do Oozie em clusters que não são ESP.

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

Resultados do envio de trabalhos do Oozie

Os trabalhos do Oozie são executados para o usuário. Então, o Apache Hadoop YARN e o Apache Ranger auditam logs mostram os trabalhos que estão sendo executados como o usuário representado. A saída de interface de linha de comando de um trabalho do Oozie se parece com o código a seguir:

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 logs de auditoria do Ranger para as ações do servidor do Hive 2 mostram o Oozie executando a ação para o usuário. As exibições do Ranger e do YARN só estão visíveis para o administrador do cluster.

Configurar a autorização de usuário no Oozie

O Oozie por si só tem uma configuração de autorização do usuário, que pode impedir a interrupção dos usuários, encerrando os trabalhos de outro usuário. Para habilitar essa configuração, defina as oozie.service.AuthorizationService.security.enabled para true.

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

Para componentes como o servidor do Hive 1, no qual o plug-in do Ranger não está disponível ou é compatível, é possível apenas realizar a autorização de alta granularidade do HDFS. A autorização refinada está disponível por meio dos plug-ins do Ranger.

Obtenha a IU web do Oozie

A IU da Web do Oozie fornece um modo de exibição baseado na web sobre o status dos trabalhos do Oozie no cluster. Para obter a interface do usuário da Web, execute as seguintes etapas em clusters ESP:

  1. Adicionar um nó de borda e habilitar a autenticação SSH Kerberos.

  2. Siga as etapas da interface do usuário da Web do Oozie para habilitar o túnel SSH no nó de borda e acessar a interface do usuário da Web.

Próximas etapas