Share via


Apache Oozie uitvoeren in Azure HDInsight-clusters met Enterprise Security Package

Apache Oozie is een werkstroom- en coördinatiesysteem waarmee Apache Hadoop-taken worden beheerd. Oozie is geïntegreerd met de Hadoop-stack en ondersteunt de volgende taken:

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

U kunt Oozie ook gebruiken om taken te plannen die specifiek zijn voor een systeem, zoals Java-programma's of shellscripts.

Vereiste

Een Azure HDInsight Hadoop-cluster met Enterprise Security Package (ESP). Zie HDInsight-clusters configureren met ESP.

Verbinding maken met een ESP-cluster

Zie Verbinding maken met HDInsight (Hadoop) met behulp van SSH voor meer informatie over Secure Shell (SSH).

  1. Maak verbinding met het HDInsight-cluster met behulp van SSH:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.net
    
  2. Gebruik de opdracht om te klist controleren of kerberos-verificatie is geslaagd. Zo niet, gebruik kinit dan om Kerberos-verificatie te starten.

  3. Meld u aan bij de HDInsight-gateway om het OAuth-token te registreren dat is vereist voor toegang tot Azure Data Lake Storage:

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

    Een statusreactiecode van 200 OK geeft aan dat de registratie is geslaagd. Controleer de gebruikersnaam en het wachtwoord als er een niet-geautoriseerd antwoord wordt ontvangen, zoals 401.

De werkstroom definiëren

Oozie-werkstroomdefinities worden geschreven in Apache Hadoop Process Definition Language (hPDL). hPDL is een xml-procesdefinitietaal. Voer de volgende stappen uit om de werkstroom te definiëren:

  1. De werkruimte van een domeingebruiker instellen:

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

    Vervang door DomainUser de domeinnaam. Vervang door DomainUserPath het pad naar de basismap voor de domeingebruiker. Vervang door ClusterVersion de versie van uw clustergegevensplatform.

  2. Gebruik de volgende instructie om een nieuw bestand te maken en te bewerken:

    nano workflow.xml
    
  3. Nadat de nano-editor is geopend, voert u de volgende XML in als bestandsinhoud:

    <?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. Vervang clustername door de naam van het cluster.

  5. Selecteer Ctrl+X om het bestand op te slaan. Voer Y in. Selecteer vervolgens Enter.

    De werkstroom bestaat uit twee delen:

    • Referentie. In deze sectie worden de referenties gebruikt voor het verifiëren van Oozie-acties:

      In dit voorbeeld wordt verificatie gebruikt voor Hive-acties. Zie Actieverificatie voor meer informatie.

      Met de referentieservice kunnen Oozie-acties de gebruiker imiteren voor toegang tot Hadoop-services.

    • Actie. Deze sectie bevat drie acties: map-reduce, Hive-server 2 en Hive-server 1:

      • Met de actie map-reduce wordt een voorbeeld uitgevoerd uit een Oozie-pakket voor toewijzingsverperken dat het geaggregeerde aantal woorden uitvoert.

      • Met de acties Hive-server 2 en Hive-server 1 wordt een query uitgevoerd op een hive-voorbeeldtabel die bij HDInsight wordt geleverd.

      De Hive-acties gebruiken de referenties die zijn gedefinieerd in de sectie referenties voor verificatie met behulp van het trefwoord cred in het actie-element.

  6. Gebruik de volgende opdracht om het workflow.xml bestand te kopiëren naar /user/<domainuser>/examples/apps/map-reduce/workflow.xml:

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Vervang door domainuser uw gebruikersnaam voor het domein.

Het eigenschappenbestand voor de Oozie-taak definiëren

  1. Gebruik de volgende instructie om een nieuw bestand voor taakeigenschappen te maken en te bewerken:

    nano job.properties
    
  2. Nadat de nano-editor is geopend, gebruikt u de volgende XML als inhoud van het bestand:

    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
    
    • Gebruik de adl://home URI voor de nameNode eigenschap als u Azure Data Lake Storage Gen1 als primaire clusteropslag hebt. Als u Azure Blob Storage gebruikt, wijzigt u in wasb://home. Als u Azure Data Lake Storage Gen2 gebruikt, wijzigt u in abfs://home.
    • Vervang door domainuser uw gebruikersnaam voor het domein.
    • Vervang door ClusterShortName de korte naam voor het cluster. Als de clusternaam bijvoorbeeld is https:// [voorbeeldkoppeling] sechadoopcontoso.azurehdisnight.net, is de clustershortname de eerste zes tekens van het cluster: sechad.
    • Vervang door jdbcurlvalue de JDBC-URL uit de Hive-configuratie. Een voorbeeld is jdbc:hive2://headnodehost:10001/;transportMode=http.
    • Als u het bestand wilt opslaan, selecteert u Ctrl+X, voert u in Yen selecteert u vervolgens Enter.

    Dit eigenschappenbestand moet lokaal aanwezig zijn bij het uitvoeren van Oozie-taken.

Aangepaste Hive-scripts maken voor Oozie-taken

U kunt de twee Hive-scripts maken voor Hive-server 1 en Hive-server 2, zoals wordt weergegeven in de volgende secties.

Hive-server 1-bestand

  1. Een bestand maken en bewerken voor Hive-server 1-acties:

    nano countrowshive1.hql
    
  2. Maak het script:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select devicemake from hivesampletable limit 2;
    
  3. Sla het bestand op in HDFS (Apache Hadoop Distributed File System):

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

Hive-server 2-bestand

  1. Een veld maken en bewerken voor hive-server 2-acties:

    nano countrowshive2.hql
    
  2. Maak het script:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}' 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    select devicemodel from hivesampletable limit 2;
    
  3. Sla het bestand op in HDFS:

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

Oozie-taken verzenden

Het indienen van Oozie-taken voor ESP-clusters is hetzelfde als het indienen van Oozie-taken in niet-ESP-clusters.

Zie Apache Oozie gebruiken met Apache Hadoop om een werkstroom te definiëren en uit te voeren in Azure HDInsight op basis van Linux voor meer informatie.

Resultaten van het indienen van een Oozie-taak

Oozie-taken worden uitgevoerd voor de gebruiker. Zowel apache Hadoop YARN- als Apache Ranger-auditlogboeken tonen dus aan dat de taken worden uitgevoerd als de geïmiteerde gebruiker. De uitvoer van de opdrachtregelinterface van een Oozie-taak ziet eruit als de volgende code:

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

In de Ranger-auditlogboeken voor hive server 2-acties wordt weergegeven dat Oozie de actie voor de gebruiker uitvoert. De Ranger- en YARN-weergaven zijn alleen zichtbaar voor de clusterbeheerder.

Gebruikersautorisatie configureren in Oozie

Oozie heeft zelf een configuratie voor gebruikersautorisatie die kan voorkomen dat gebruikers taken van andere gebruikers stoppen of verwijderen. Als u deze configuratie wilt inschakelen, stelt u de oozie.service.AuthorizationService.security.enabled in op true.

Zie Installatie en configuratie van Apache Oozie voor meer informatie.

Voor onderdelen zoals Hive-server 1 waarvoor de Ranger-invoegtoepassing niet beschikbaar is of wordt ondersteund, is alleen grofkorrelige HDFS-autorisatie mogelijk. Fijnmazige autorisatie is alleen beschikbaar via Ranger-invoegtoepassingen.

De Oozie-webinterface ophalen

De Oozie-webgebruikersinterface biedt een webweergave van de status van Oozie-taken in het cluster. Voer de volgende stappen uit in ESP-clusters om de webgebruikersinterface op te halen:

  1. Voeg een edge-knooppunt toe en schakel SSH Kerberos-verificatie in.

  2. Volg de stappen van de Oozie-webinterface om SSH-tunneling naar het edge-knooppunt in te schakelen en toegang te krijgen tot de webgebruikersinterface.

Volgende stappen