Udostępnij za pośrednictwem


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żesz również użyć Oozie do planowania zadań specyficznych dla systemu, takich jak programy Java lub skrypty powłokowe.

Warunek wstępny

Klaster usługi Azure HDInsight Hadoop z pakietem Enterprise Security (ESP). Zobacz Konfigurowanie klastrów usługi HDInsight przy użyciu protokołu 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 Łączenie z usługą HDInsight (Hadoop) przy użyciu protokołu SSH.

  1. Nawiąż połączenie 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 usługi 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 apache Hadoop Process Definition Language (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 nazwą użytkownika domeny. Zastąp DomainUserPath ścieżką katalogu macierzystego użytkownika domeny. Zastąp ClusterVersion wersją platformy danych klastra.

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

    nano workflow.xml
    
  3. Po otwarciu 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 nazwą klastra.

  5. Aby zapisać plik, wybierz Ctrl+X. Wprowadź wartość Y. Następnie wybierz Enter.

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

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

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

      Usługa poświadczeń umożliwia akcji Oozie personifikację użytkownika na potrzeby uzyskiwania dostępu do usług Hadoop.

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

      • Akcja map-reduce uruchamia przykład z pakietu Oozie dla map-reduce, który generuje zliczenie wyrazów.

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

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

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

    hdfs dfs -put workflow.xml /user/<domainuser>/examples/apps/map-reduce/workflow.xml
    
  7. Zastąp domainuser nazwą użytkownika dla 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 otwarciu 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 właściwości nameNode, jeśli Azure Data Lake Storage Gen1 jest używana jako podstawowy magazyn klastra. Jeśli używasz usługi Azure Blob Storage, zmień wartość na wasb://home. Jeśli używasz usługi Azure Data Lake Storage Gen2, przejdź na abfs://home.
    • Zastąp domainuser swoją nazwą użytkownika dla domeny.
    • Zastąp ClusterShortName 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 ciąg jdbcurlvalue adresem URL JDBC z konfiguracji programu Hive. Przykładem jest jdbc:hive2://headnodehost:10001/; transportMode=http.
    • Aby zapisać plik, naciśnij Ctrl+X, wprowadź , Ya następnie naciśnij Enter.

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

Tworzenie niestandardowych skryptów Hive dla zadań Oozie

Dwa skrypty hive dla serwera Hive 1 i Hive Server 2 można utworzyć, 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 opartego na systemie Linux przy użyciu rozwiązania Apache Oozie z platformą Apache Hadoop.

Wyniki przesyłania zadania Oozie

Zadania Oozie są uruchamiane dla użytkownika. W związku z tym zarówno dzienniki inspekcji usług Apache Hadoop YARN, jak i Apache Ranger pokazują, że zadania są uruchamiane jako personifikowany użytkownik. Dane wyjściowe interfejsu wiersza polecenia zadania Oozie 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             -
-----------------------------------------------------------------------------------------------

Rejestry inspekcji Ranger dla działań serwera Hive 2 pokazują, że Oozie uruchamia działanie dla użytkownika. Widoki Ranger i YARN są widoczne tylko dla administratora klastra.

Konfigurowanie autoryzacji użytkownika w usłudze Oozie

Firma Oozie sama ma konfigurację autoryzacji użytkownika, która może uniemożliwić użytkownikom zatrzymywanie lub usuwanie zadań innych użytkowników. Aby włączyć tę konfigurację, ustaw oozie.service.AuthorizationService.security.enabled na true.

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, w których wtyczka Ranger nie jest dostępna lub obsługiwana, możliwa jest tylko grubozrnista autoryzacja systemu plików HDFS. Szczegółowa autoryzacja jest dostępna tylko za pośrednictwem wtyczek Ranger.

Uzyskaj internetowy interfejs użytkownika 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ł brzegowy i włącz uwierzytelnianie Kerberos za pomocą SSH.

  2. Wykonaj kroki interfejsu użytkownika sieci Web Oozie, aby włączyć tunelowanie SSH do węzła granicznego i uzyskać dostęp do interfejsu użytkownika sieci Web.

Następne kroki