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
- Klaster Apache Spark w usłudze HDInsight. Aby uzyskać instrukcje, zobacz Tworzenie klastra platformy Apache Spark w usłudze Azure HDInsight.
- Schemat identyfikatora URI dla magazynu podstawowego klastrów. Schematem będzie
wasb://
usługa Azure Blob Storage dlaabfs://
usługi Azure Data Lake Storage Gen2 lubadl://
Azure Data Lake Storage Gen1. Jeśli bezpieczny transfer jest włączony dla usługi Blob Storage, identyfikator URI towasbs://
. Aby uzyskać więcej informacji, zobacz Require secure transfer in Azure Storage (Wymagaj bezpiecznego transferu w usłudze Azure Storage ).
Uruchamianie notesu Apache Zeppelin
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
Utwórz nowy notes. W okienku nagłówka przejdź do pozycji Notes>Utwórz nową notatkę.
Wprowadź nazwę notesu, a następnie wybierz pozycję Utwórz notatkę.
Upewnij się, że nagłówek notesu zawiera stan połączenia. Oznacza to zieloną kropkę w prawym górnym rogu.
Załaduj przykładowe dane do tabeli tymczasowej. Podczas tworzenia klastra Spark w usłudze HDInsight przykładowy plik
hvac.csv
danych 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:
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.
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.
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.
Instrukcje Spark SQL można również uruchamiać przy użyciu zmiennych w zapytaniu. W następnym fragmencie kodu pokazano, jak zdefiniować zmienną ,
Temp
w 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 .
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.
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.
Otwórz ustawienia interpretera. W prawym górnym rogu wybierz zalogowaną nazwę użytkownika, a następnie wybierz pozycję Interpreter.
Przewiń do usługi livy2, a następnie wybierz pozycję Edytuj.
Przejdź do klucza
livy.spark.jars.packages
i ustaw jego wartość w formaciegroup:id:version
. Dlatego jeśli chcesz użyć pakietu spark-csv , musisz ustawić wartość klucza nacom.databricks:spark-csv_2.10:1.4.0
.Wybierz pozycję Zapisz , a następnie przycisk OK , aby ponownie uruchomić interpreter usługi Livy.
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.
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.
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:
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 = *
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 wroles[]
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.
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.
Przewiń do usługi livy2, a następnie wybierz pozycję uruchom ponownie.
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
Przejdź do
https://CLUSTERNAME.azurehdinsight.net/#/main/services/ZEPPELIN/summary
lokalizacji CLUSTERNAME to nazwa klastra.Przejdź do pozycji CONFIGS>Advanced zeppelin-log4j-properties>log4j_properties_content.
Zmodyfikuj
log4j.appender.dailyfile.Threshold = INFO
nalog4j.appender.dailyfile.Threshold = DEBUG
.Dodaj
log4j.logger.org.apache.zeppelin.realm=DEBUG
element .Zapisz zmiany i uruchom ponownie usługę.