Korzystanie z notesów Apache Zeppelin z klastrem Apache Spark w usłudze Azure HDInsight

Klastry HDInsight Spark obejmują notesy Apache Zeppelin . Użyj notesów do uruchamiania zadań platformy Apache Spark. Z tego artykułu dowiesz się, jak używać notesu Zeppelin w klastrze usługi HDInsight.

Wymagania wstępne

Uruchamianie notesu Apache Zeppelin

  1. W obszarze Przegląd klastra Spark wybierz pozycję Notes Zeppelin z pulpitów nawigacyjnych klastra. Wprowadź poświadczenia administratora klastra.

    Uwaga

    Możesz również uzyskać dostęp do notesu Zeppelin dla klastra, otwierając następujący adres URL w przeglądarce. Zastąp ciąg CLUSTERNAME nazwą klastra:

    https://CLUSTERNAME.azurehdinsight.net/zeppelin

  2. Utwórz nowy notes. W okienku nagłówka przejdź do pozycji Notes>Utwórz nową notatkę.

    Create a new Zeppelin notebook.

    Wprowadź nazwę notesu, a następnie wybierz pozycję Utwórz notatkę.

  3. Upewnij się, że nagłówek notesu zawiera stan połączenia. Oznacza to zieloną kropkę w prawym górnym rogu.

    Zeppelin notebook status.

  4. Załaduj przykładowe dane do tabeli tymczasowej. Podczas tworzenia klastra Spark w usłudze HDInsight przykładowy plik hvac.csvdanych jest kopiowany do skojarzonego konta magazynu w obszarze \HdiSamples\SensorSampleData\hvac.

    W pustym akapicie utworzonym domyślnie w nowym notesie wklej następujący fragment kodu.

    %livy2.spark
    //The above magic instructs Zeppelin to use the Livy Scala interpreter
    
    // Create an RDD using the default Spark context, sc
    val hvacText = sc.textFile("wasbs:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv")
    
    // Define a schema
    case class Hvac(date: String, time: String, targettemp: Integer, actualtemp: Integer, buildingID: String)
    
    // Map the values in the .csv file to the schema
    val hvac = hvacText.map(s => s.split(",")).filter(s => s(0) != "Date").map(
        s => Hvac(s(0),
                s(1),
                s(2).toInt,
                s(3).toInt,
                s(6)
        )
    ).toDF()
    
    // Register as a temporary table called "hvac"
    hvac.registerTempTable("hvac")
    

    Naciśnij klawisze SHIFT + ENTER lub wybierz przycisk Odtwarzania akapitu, aby uruchomić fragment kodu. Stan w prawym rogu akapitu powinien przechodzić od POZYCJI GOTOWE, OCZEKUJĄCE, URUCHOMIONE na ZAKOŃCZONO. Dane wyjściowe są wyświetlane w dolnej części tego samego akapitu. Zrzut ekranu wygląda jak na poniższej ilustracji:

    Create a temporary table from raw data.

    Możesz również podać tytuł każdego akapitu. W prawym rogu akapitu wybierz ikonę Ustawienia (koło zębate), a następnie wybierz pozycję Pokaż tytuł.

    Uwaga

    Interpreter %spark2 nie jest obsługiwany w notesach zeppelin we wszystkich wersjach usługi HDInsight, a interpreter %sh nie będzie obsługiwany w usłudze HDInsight 4.0.

  5. Teraz możesz uruchomić instrukcje Spark SQL w hvac tabeli. Wklej następujące zapytanie w nowym akapicie. Zapytanie pobiera identyfikator budynku. Ponadto różnica między wartościami docelowymi i rzeczywistymi temperaturami dla każdego budynku w danym dniu. Naciśnij klawisze SHIFT + ENTER.

    %sql
    select buildingID, (targettemp - actualtemp) as temp_diff, date from hvac where date = "6/1/13"
    

    Instrukcja %sql na początku informuje notes o użyciu interpretera Livy Scala.

  6. Wybierz ikonę Wykres słupkowy, aby zmienić ekran. ustawienia są wyświetlane po wybraniu wykresu słupkowego, umożliwia wybranie pozycji Klucze i Wartości. Poniższy zrzut ekranu przedstawia dane wyjściowe.

    Run a Spark SQL statement using the notebook1.

  7. Instrukcje Spark SQL można również uruchamiać przy użyciu zmiennych w zapytaniu. W następnym fragmencie kodu pokazano, jak zdefiniować zmienną , Tempw zapytaniu z możliwymi wartościami, za pomocą których chcesz wykonać zapytanie. Po pierwszym uruchomieniu zapytania lista rozwijana zostanie automatycznie wypełniona wartościami określonymi dla zmiennej.

    %sql  
    select buildingID, date, targettemp, (targettemp - actualtemp) as temp_diff from hvac where targettemp > "${Temp = 65,65|75|85}"
    

    Wklej ten fragment kodu w nowym akapicie i naciśnij klawisze SHIFT + ENTER. Następnie wybierz pozycję 65 z listy rozwijanej Temp .

  8. Wybierz ikonę Wykres słupkowy, aby zmienić ekran. Następnie wybierz ustawienia i wprowadź następujące zmiany:

    • Grupy: Dodaj element targettemp.

    • Wartości: 1. Usuń datę. 2. Dodaj temp_diff. 3. Zmień agregator z SUM na AVG.

      Poniższy zrzut ekranu przedstawia dane wyjściowe.

      Run a Spark SQL statement using the notebook2.

Jak mogę używać pakietów zewnętrznych z notesem?

Notes Zeppelin w klastrze Apache Spark w usłudze HDInsight może używać zewnętrznych pakietów współtworonych przez społeczność, które nie są uwzględnione w klastrze. Przeszukaj repozytorium Maven, aby uzyskać pełną listę dostępnych pakietów. Możesz również uzyskać listę dostępnych pakietów z innych źródeł. Na przykład pełna lista pakietów współtworzynych przez społeczność jest dostępna w temacie Pakiety Spark.

W tym artykule dowiesz się, jak używać pakietu spark-csv z notesem Jupyter Notebook.

  1. Otwórz ustawienia interpretera. W prawym górnym rogu wybierz zalogowaną nazwę użytkownika, a następnie wybierz pozycję Interpreter.

    Launch interpreter.

  2. Przewiń do usługi livy2, a następnie wybierz pozycję Edytuj.

    Change interpreter settings1.

  3. Przejdź do klucza livy.spark.jars.packagesi ustaw jego wartość w formacie group:id:version. Dlatego jeśli chcesz użyć pakietu spark-csv , musisz ustawić wartość klucza na com.databricks:spark-csv_2.10:1.4.0.

    Change interpreter settings2.

    Wybierz pozycję Zapisz , a następnie przycisk OK , aby ponownie uruchomić interpreter usługi Livy.

  4. Jeśli chcesz dowiedzieć się, jak uzyskać wartość klucza wprowadzonego powyżej, oto jak to zrobić.

    a. Znajdź pakiet w repozytorium Maven. W tym artykule użyliśmy pliku spark-csv.

    b. Z repozytorium zbierz wartości GroupId, ArtifactId i Version.

    Use external packages with Jupyter Notebook.

    c. Połącz trzy wartości rozdzielone dwukropkiem (:).

    com.databricks:spark-csv_2.10:1.4.0
    

Gdzie są zapisywane notesy Zeppelin?

Notesy Zeppelin są zapisywane w węzłach głównych klastra. Dlatego w przypadku usunięcia klastra notesy również zostaną usunięte. Jeśli chcesz zachować notesy do późniejszego użycia w innych klastrach, musisz je wyeksportować po zakończeniu uruchamiania zadań. Aby wyeksportować notes, wybierz ikonę Eksportuj , jak pokazano na poniższej ilustracji.

Download notebook.

Ta akcja powoduje zapisanie notesu jako pliku JSON w lokalizacji pobierania.

Uwaga

  • W usłudze HDI 4.0 ścieżka katalogu notesu zeppelin to: /usr/hdp/<version>/zeppelin/notebook/<notebook_session_id>/

    Na przykład: /usr/hdp/4.1.17.10/zeppelin/2JMC9BZ8X/

    Gdzie tak jak w usłudze HDI 5.0 lub nowszym ta ścieżka jest inna /usr/hdp/<version>/zeppelin/notebook/<Kernel_name>/

    Na przykład: /usr/hdp/5.1.4.5/zeppelin/notebook/Scala/

  • Nazwa pliku przechowywana jest inna w usłudze HDI 5.0. Jest on przechowywany jako <notebook_name>_<sessionid>.zpln

    Na przykład: testzeppelin_2JJK53XQA.zzl

    W usłudze HDI 4.0 nazwa pliku jest po prostu note.json przechowywana w katalogu session_id.

    Na przykład: /2JMC9BZ8X/note.json

  • HdI Zeppelin zawsze zapisuje notes w ścieżce /usr/hdp/<version>/zeppelin/notebook/ na dysku lokalnym hn0.

    Jeśli chcesz, aby notes był dostępny nawet po usunięciu klastra, możesz spróbować użyć usługi Azure File Storage (przy użyciu protokołu SMB ) i połączyć go ze ścieżką lokalną. Aby uzyskać więcej informacji, zobacz Instalowanie udziału plików platformy Azure SMB w systemie Linux

    Po zainstalowaniu można zmodyfikować konfigurację zeppelin zeppelin zeppelin.notebook.dir do zainstalowanej ścieżki w interfejsie użytkownika ambari.

  • Udział plików SMB jako magazyn GitNotebookRepo nie jest zalecany w przypadku pakietu zeppelin w wersji 0.10.1

Konfigurowanie Shiro dostępu do interpreterów Zeppelin w klastrach pakietu Enterprise Security

Jak wspomniano powyżej, %sh interpreter nie jest obsługiwany w usłudze HDInsight 4.0. Ponadto, ponieważ %sh interpreter wprowadza potencjalne problemy z zabezpieczeniami, takie jak tabły dostępu za pomocą poleceń powłoki, został również usunięty z klastrów ESP usługi HDInsight 3.6 ESP. Oznacza to, że %sh interpreter nie jest dostępny po kliknięciu pozycji Utwórz nową notatkę lub domyślnie w interfejsie użytkownika interpretera.

Użytkownicy domeny uprzywilejowanej mogą użyć Shiro.ini pliku do kontrolowania dostępu do interfejsu użytkownika interpretera. Tylko ci użytkownicy mogą tworzyć nowe %sh interpretery i ustawiać uprawnienia dla każdego nowego %sh interpretera. Aby kontrolować dostęp przy użyciu shiro.ini pliku, wykonaj następujące czynności:

  1. Zdefiniuj nową rolę przy użyciu istniejącej nazwy grupy domen. W poniższym przykładzie adminGroupName jest to grupa uprzywilejowanych użytkowników w usłudze AAD. Nie używaj znaków specjalnych ani białych spacji w nazwie grupy. Znaki po = udzieleniu uprawnień dla tej roli. * oznacza, że grupa ma pełne uprawnienia.

    [roles]
    adminGroupName = *
    
  2. Dodaj nową rolę dostępu do interpreterów Zeppelin. W poniższym przykładzie wszyscy użytkownicy w programie adminGroupName mają dostęp do interpreterów Zeppelin i mogą tworzyć nowe interpretery. Można umieścić wiele ról między nawiasami kwadratowymi w roles[]pliku rozdzielanych przecinkami. Następnie użytkownicy, którzy mają niezbędne uprawnienia, mogą uzyskiwać dostęp do interpreterów Zeppelin.

    [urls]
    /api/interpreter/** = authc, roles[adminGroupName]
    

Przykład shiro.ini dla wielu grup domen:

[main]
anyofrolesuser = org.apache.zeppelin.utils.AnyOfRolesUserAuthorizationFilter

[roles]
group1 = *
group2 = *
group3 = *

[urls]
/api/interpreter/** = authc, anyofrolesuser[group1, group2, group3]

Zarządzanie sesjami usługi Livy

Pierwszy akapit kodu w notesie Zeppelin tworzy nową sesję usługi Livy w klastrze. Ta sesja jest udostępniana we wszystkich notesach Zeppelin, które później utworzysz. Jeśli sesja usługi Livy zostanie z jakiegoś powodu zabita, zadania nie będą uruchamiane z notesu Zeppelin.

W takim przypadku przed rozpoczęciem uruchamiania zadań z notesu Zeppelin należy wykonać następujące czynności.

  1. Uruchom ponownie interpreter usługi Livy z notesu Zeppelin. Aby to zrobić, otwórz ustawienia interpretera, wybierając zalogowaną nazwę użytkownika w prawym górnym rogu, a następnie wybierz pozycję Interpreter.

    Launch interpreter.

  2. Przewiń do usługi livy2, a następnie wybierz pozycję uruchom ponownie.

    Restart the Livy interpreter.

  3. Uruchom komórkę kodu z istniejącego notesu Zeppelin. Ten kod tworzy nową sesję usługi Livy w klastrze usługi HDInsight.

Informacje ogólne

Weryfikowanie usługi

Aby zweryfikować usługę z systemu Ambari, przejdź do https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary lokalizacji, w której clusterNAME jest nazwą klastra.

Aby zweryfikować usługę z poziomu wiersza polecenia, protokół SSH do węzła głównego. Przełącz użytkownika na zeppelin przy użyciu polecenia sudo su zeppelin. Polecenia stanu:

Polecenie opis
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh status Stan usługi.
/usr/hdp/current/zeppelin-server/bin/zeppelin-daemon.sh --version Wersja usługi.
ps -aux | grep zeppelin Identyfikowanie identyfikatora PID.

Lokalizacje dziennika

Usługa Ścieżka
zeppelin-server /usr/hdp/current/zeppelin-server/
Dzienniki serwera /var/log/zeppelin
Interpreter konfiguracji, Shiro, site.xml, log4j /usr/hdp/current/zeppelin-server/conf lub /etc/zeppelin/conf
Katalog PID /var/run/zeppelin

Włączanie rejestrowania debugowania

  1. Przejdź do https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary lokalizacji CLUSTERNAME to nazwa klastra.

  2. Przejdź do pozycji CONFIGS>Advanced zeppelin-log4j-properties>log4j_properties_content.

  3. Zmodyfikuj log4j.appender.dailyfile.Threshold = INFO na log4j.appender.dailyfile.Threshold = DEBUG.

  4. Dodaj log4j.logger.org.apache.zeppelin.realm=DEBUGelement .

  5. Zapisz zmiany i uruchom ponownie usługę.

Następne kroki