Uruchamianie rozwiązania Apache Oozie w klastrach usługi Azure HDInsight przy użyciu pakietu Enterprise Security

Apache Oozie to system przepływu pracy i koordynacji, który zarządza zadaniami apache Hadoop. Rozwiązanie Oozie jest zintegrowane ze stosem usługi Hadoop i obsługuje następujące zadania:

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

Można również użyć usługi Oozie do planowania zadań specyficznych dla systemu, takich jak programy Java lub skrypty powłoki.

Wymaganie wstępne

Klaster usługi Azure HDInsight Hadoop z pakietem Enterprise Security (ESP). Zobacz Konfigurowanie klastrów usługi HDInsight przy użyciu esp.

Uwaga

Aby uzyskać szczegółowe instrukcje dotyczące korzystania z usługi Oozie w klastrach innych niż ESP, zobacz Korzystanie z przepływów pracy usługi Apache Oozie w usłudze Azure HDInsight opartej na systemie Linux.

Nawiązywanie połączenia z klastrem ESP

Aby uzyskać więcej informacji na temat protokołu Secure Shell (SSH), zobacz Connect to HDInsight (Hadoop) using SSH (Nawiązywanie połączenia z usługą HDInsight (Hadoop) przy użyciu protokołu SSH.

  1. Połącz się z klastrem usługi HDInsight przy użyciu protokołu SSH:

    ssh [DomainUserName]@<clustername>-ssh.azurehdinsight.net
    
  2. Aby zweryfikować pomyślne uwierzytelnianie Kerberos, użyj klist polecenia . Jeśli nie, użyj polecenia kinit , aby uruchomić uwierzytelnianie Kerberos.

  3. Zaloguj się do bramy usługi HDInsight, aby zarejestrować token OAuth wymagany do uzyskania dostępu do Azure Data Lake Storage:

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

    Kod odpowiedzi stanu 200 OK wskazuje pomyślną rejestrację. Sprawdź nazwę użytkownika i hasło, jeśli zostanie odebrana nieautoryzowana odpowiedź, na przykład 401.

Definiowanie przepływu pracy

Definicje przepływu pracy Oozie są zapisywane w języku definicji procesów Apache Hadoop (hPDL). hPDL to język definicji procesu XML. Wykonaj następujące kroki, aby zdefiniować przepływ pracy:

  1. Konfigurowanie obszaru roboczego użytkownika domeny:

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

    Zastąp DomainUser ciąg nazwą użytkownika domeny. Zastąp DomainUserPath ciąg ścieżką katalogu macierzystego użytkownika domeny. Zastąp ClusterVersion element wersją platformy danych klastra.

  2. Użyj następującej instrukcji, aby utworzyć i edytować nowy plik:

    nano workflow.xml
    
  3. Po otworzie edytora nano wprowadź następujący kod XML jako zawartość pliku:

    <?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. Zastąp clustername ciąg nazwą klastra.

  5. Aby zapisać plik, naciśnij klawisze Ctrl+X. Wprowadź Y. Następnie wybierz klawisz Enter.

    Przepływ pracy jest podzielony na dwie części:

    • Poświadczeń. Ta sekcja zawiera poświadczenia używane do uwierzytelniania akcji Oozie:

      W tym przykładzie użyto uwierzytelniania dla akcji programu Hive. Aby dowiedzieć się więcej, zobacz Action Authentication (Uwierzytelnianie akcji).

      Usługa poświadczeń umożliwia akcji Oozie personifikację użytkownika w celu uzyskania dostępu do usług Hadoop.

    • Działania. Ta sekcja zawiera trzy akcje: map-reduce, Hive Server 2 i Hive Server 1:

      • Akcja map-reduce uruchamia przykład z pakietu Oozie dla funkcji map-reduce, która generuje zagregowaną liczbę wyrazów.

      • Akcje programu Hive Server 2 i Hive Server 1 uruchamiają zapytanie w przykładowej tabeli programu Hive dostarczonej z usługą HDInsight.

      Akcje programu Hive używają poświadczeń zdefiniowanych w sekcji poświadczeń do uwierzytelniania przy użyciu słowa kluczowego cred w elemecie akcji.

  6. Użyj następującego polecenia, aby skopiować workflow.xml plik do /user/<domainuser>/examples/apps/map-reduce/workflow.xmlpliku :

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Zastąp domainuser ciąg nazwą użytkownika domeny.

Definiowanie pliku właściwości zadania Oozie

  1. Użyj następującej instrukcji, aby utworzyć i edytować nowy plik dla właściwości zadania:

    nano job.properties
    
  2. Po otworzie edytora nano użyj następującego kodu XML jako zawartości pliku:

    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
    
    • Użyj identyfikatora adl://home URI dla nameNode właściwości , jeśli masz Azure Data Lake Storage Gen1 jako podstawowy magazyn klastra. Jeśli używasz Azure Blob Storage, zmień wartość na wasb://home. Jeśli używasz Azure Data Lake Storage Gen2, zmień wartość na abfs://home.
    • Zastąp domainuser ciąg nazwą użytkownika domeny.
    • Zastąp ClusterShortName ciąg krótką nazwą klastra. Jeśli na przykład nazwa klastra to https:// [przykładowy link] sechadoopcontoso.azurehdisnight.net, clustershortname jest to pierwsze sześć znaków klastra: sechad.
    • Zastąp jdbcurlvalue element adresem URL JDBC z konfiguracji programu Hive. Przykładem jest jdbc:hive2://headnodehost:10001/;transportMode=http.
    • Aby zapisać plik, naciśnij klawisze Ctrl+X, wprowadź Y, a następnie naciśnij klawisz Enter.

    Ten plik właściwości musi być obecny lokalnie podczas uruchamiania zadań Oozie.

Tworzenie niestandardowych skryptów Hive dla zadań Oozie

Można utworzyć dwa skrypty hive dla serwera Hive 1 i Hive Server 2, jak pokazano w poniższych sekcjach.

Plik serwera Hive 1

  1. Utwórz i edytuj plik dla akcji serwera Hive 1:

    nano countrowshive1.hql
    
  2. Utwórz skrypt:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}'
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    select devicemake from hivesampletable limit 2;
    
  3. Zapisz plik w rozproszonym systemie plików Apache Hadoop (HDFS):

    hdfs dfs -put countrowshive1.hql countrowshive1.hql
    

Plik serwera Hive 2

  1. Tworzenie i edytowanie pola dla akcji serwera Hive 2:

    nano countrowshive2.hql
    
  2. Utwórz skrypt:

    INSERT OVERWRITE DIRECTORY '${hiveOutputDirectory1}' 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
    select devicemodel from hivesampletable limit 2;
    
  3. Zapisz plik w systemie plików HDFS:

    hdfs dfs -put countrowshive2.hql countrowshive2.hql
    

Przesyłanie zadań Oozie

Przesyłanie zadań Oozie dla klastrów ESP przypomina przesyłanie zadań Oozie w klastrach innych niż ESP.

Aby uzyskać więcej informacji, zobacz Definiowanie i uruchamianie przepływu pracy w usłudze Azure HDInsight opartej na systemie Linux przy użyciu platformy Apache Oozie z platformą Apache Hadoop.

Wyniki przesyłania zadania Oozie

Zadania Oozie są uruchamiane dla użytkownika. W związku z tym dzienniki inspekcji usług Apache Hadoop YARN i Apache Ranger pokazują, że zadania są uruchamiane jako personifikowany użytkownik. Dane wyjściowe zadania Oozie interfejsu wiersza polecenia wyglądają podobnie do następującego kodu:

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

Dzienniki inspekcji platformy Ranger dla akcji serwera Hive 2 pokazują, że Oozie uruchamia akcję dla użytkownika. Widoki Ranger i YARN są widoczne tylko dla administratora klastra.

Konfigurowanie autoryzacji użytkownika w usłudze Oozie

Sama usługa Oozie ma konfigurację autoryzacji użytkownika, która może uniemożliwiać użytkownikom zatrzymywanie lub usuwanie zadań innych użytkowników. Aby włączyć tę konfigurację oozie.service.AuthorizationService.security.enabledtrue, ustaw wartość .

Aby uzyskać więcej informacji, zobacz Apache Oozie Installation and Configuration (Instalacja i konfiguracja oprogramowania Apache Oozie).

W przypadku składników, takich jak hive server 1, gdzie wtyczka Ranger nie jest dostępna lub obsługiwana, możliwe jest tylko grubsze autoryzacja systemu plików HDFS. Szczegółowa autoryzacja jest dostępna tylko za pośrednictwem wtyczek platformy Ranger.

Uzyskiwanie internetowego interfejsu użytkownika usługi Oozie

Internetowy interfejs użytkownika Oozie udostępnia internetowy widok stanu zadań Oozie w klastrze. Aby uzyskać internetowy interfejs użytkownika, wykonaj następujące kroki w klastrach ESP:

  1. Dodaj węzeł krawędzi i włącz uwierzytelnianie protokołu Kerberos protokołu SSH.

  2. Postępuj zgodnie z instrukcjami internetowego interfejsu użytkownika usługi Oozie , aby włączyć tunelowanie SSH do węzła brzegowego i uzyskać dostęp do internetowego interfejsu użytkownika.

Następne kroki