Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak dostosować klaster usługi HDInsight używając skryptów powłoki Bash. Akcje skryptu to sposób dostosowywania usługi HDInsight podczas tworzenia klastra lub po jego utworzeniu.
Co to są akcje skryptu
Akcje skryptu to skrypty powłoki Bash, które Azure uruchamia na węzłach klastra, aby wprowadzać zmiany konfiguracji lub instalować oprogramowanie. Akcja skryptu jest wykonywana jako root, co zapewnia pełne prawa dostępu do węzłów klastra.
Akcje skryptu można stosować za pomocą następujących metod:
Użyj tej metody, aby zastosować skrypt... | Podczas tworzenia klastra... | W uruchomionym klastrze... |
---|---|---|
Portal Azure | ✓ | ✓ |
Azure PowerShell | ✓ | ✓ |
Klasyczny CLI platformy Azure | ✓ | |
HDInsight .NET SDK | ✓ | ✓ |
Szablon usługi Azure Resource Manager | ✓ |
Aby uzyskać więcej informacji na temat używania tych metod do stosowania akcji skryptu, zobacz Dostosowywanie klastrów usługi HDInsight przy użyciu akcji skryptu.
Najlepsze rozwiązania dotyczące tworzenia skryptów
Podczas tworzenia niestandardowego skryptu dla klastra usługi HDInsight należy pamiętać o kilku najlepszych rozwiązaniach:
- Celuj w wersję platformy Apache Hadoop
- Skieruj uwagę na wersję systemu operacyjnego
- zapewnianie stabilnych linków do zasobów skryptu
- Używanie wstępnie skompilowanych zasobów
- Upewnij się, że skrypt dostosowywania klastra jest idempotentny
- zapewnienie wysokiej dostępności architektury klastra
- Konfigurowanie składników niestandardowych do korzystania z usługi Azure Blob Storage
- Zapisz informacje do STDOUT i STDERR
- Zapisz pliki jako ASCII z końcami linii LF
- Użyj logiki ponawiania prób, aby odzyskać dane po błędach przejściowych
Ważne
Akcje skryptu muszą zostać wykonane w ciągu 60 minut lub proces zakończy się niepowodzeniem. Podczas aprowizacji węzła skrypt jest uruchamiany współbieżnie z innymi procesami instalacji i konfiguracji. Konkurencja o zasoby, takie jak czas procesora CPU lub przepustowość sieci, może spowodować, że ukończenie skryptu trwa dłużej niż w środowisku projektowym.
Ukierunkowanie na wersję Apache Hadoop
Różne wersje usługi HDInsight mają zainstalowane różne wersje usług Hadoop i składników. Jeśli skrypt oczekuje określonej wersji usługi lub składnika, należy użyć skryptu tylko z wersją usługi HDInsight, która zawiera wymagane składniki. Informacje na temat wersji składników zawartych w usłudze HDInsight można znaleźć w dokumencie wersjonowanie składników usługi HDInsight.
Sprawdzanie wersji systemu operacyjnego
Różne wersje usługi HDInsight korzystają z określonych wersji systemu Ubuntu. Mogą istnieć różnice między wersjami systemu operacyjnego, które należy sprawdzić w skrypsie. Na przykład może być konieczne zainstalowanie pliku binarnego powiązanego z wersją systemu Ubuntu.
Aby sprawdzić wersję systemu operacyjnego, użyj lsb_release
. Na przykład poniższy skrypt pokazuje, jak odwołać się do określonego pliku tar w zależności od wersji systemu operacyjnego:
OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
HUE_TARFILE=hue-binaries-16-04.tgz
fi
Wybranie wersji systemu operacyjnego
Usługa HDInsight jest oparta na dystrybucji systemu Ubuntu Linux. Różne wersje usługi HDInsight korzystają z różnych wersji systemu Ubuntu, co może zmienić sposób działania skryptu. Na przykład usługa HDInsight 3.4 i starsze są oparte na wersjach systemu Ubuntu korzystających z narzędzia Upstart. Wersje 3.5 i nowsze są oparte na systemie Ubuntu 16.04, który używa Systemd
.
Systemd
i Upstart polegają na różnych poleceniach, więc skrypt powinien być napisany do pracy z obydwoma.
Kolejną ważną różnicą między usługą HDInsight 3.4 i 3.5 jest to, że JAVA_HOME
teraz wskazuje na Java 8. Poniższy kod pokazuje, jak określić, czy skrypt jest uruchomiony w systemie Ubuntu 14 lub 16:
OS_VERSION=$(lsb_release -sr)
if [[ $OS_VERSION == 14* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-14-04."
HUE_TARFILE=hue-binaries-14-04.tgz
elif [[ $OS_VERSION == 16* ]]; then
echo "OS version is $OS_VERSION. Using hue-binaries-16-04."
HUE_TARFILE=hue-binaries-16-04.tgz
fi
...
if [[ $OS_VERSION == 16* ]]; then
echo "Using systemd configuration"
systemctl daemon-reload
systemctl stop webwasb.service
systemctl start webwasb.service
else
echo "Using upstart configuration"
initctl reload-configuration
stop webwasb
start webwasb
fi
...
if [[ $OS_VERSION == 14* ]]; then
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
elif [[ $OS_VERSION == 16* ]]; then
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
fi
Pełny skrypt zawierający te fragmenty kodu można znaleźć na stronie https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.
Aby zapoznać się z wersją systemu Ubuntu używaną przez usługę HDInsight, zobacz dokument wersji składnika usługi HDInsight.
Aby zrozumieć różnice między Systemd
i programem Upstart, zobacz Systemd
dla użytkowników z systemem Upstart.
Udostępnianie stabilnych linków do zasobów skryptu
Skrypt i skojarzone zasoby muszą pozostać dostępne przez cały okres istnienia klastra. Te zasoby są wymagane, jeśli nowe węzły są dodawane do klastra podczas operacji skalowania.
Najlepszym rozwiązaniem jest pobranie i zarchiwizowanie wszystkich elementów na koncie usługi Azure Storage w ramach subskrypcji.
Ważne
Używane konto magazynu musi być domyślnym kontem magazynu dla klastra lub kontenerem tylko do odczytu na dowolnym innym publicznym koncie magazynu.
Na przykład przykłady dostarczone przez firmę Microsoft są przechowywane na koncie pamięci masowej https://hdiconfigactions.blob.core.windows.net/
. Ta lokalizacja jest publicznym kontenerem tylko do odczytu obsługiwanym przez zespół usługi HDInsight.
Korzystanie ze wstępnie skompilowanych zasobów
Aby skrócić czas potrzebny na uruchomienie skryptu, unikaj operacji kompilujących zasoby z kodu źródłowego. Na przykład wstępnie skompiluj zasoby i przechowuj je w obiekcie blob konta usługi Azure Storage zlokalizowanym w tym samym centrum danych co HDInsight.
Upewnij się, że skrypt dostosowywania klastra jest idempotentny
Skrypty muszą być idempotentne. Jeśli skrypt jest uruchamiany wiele razy, powinien zwracać klaster do tego samego stanu za każdym razem.
Jeśli skrypt jest uruchamiany wiele razy, skrypt modyfikujący pliki konfiguracji nie powinien dodawać zduplikowanych wpisów.
Zapewnianie wysokiej dostępności architektury klastra
Klastry usługi HDInsight oparte na systemie Linux zapewniają dwa węzły główne, które są aktywne w klastrze, a akcje skryptu są uruchamiane w obu węzłach. Jeśli instalowane składniki oczekują tylko jednego węzła głównego, nie instaluj składników w obu węzłach głównych.
Ważne
Usługi dostępne w ramach HDInsight są zaprojektowane tak, aby w razie potrzeby przełączać się między dwoma węzłami głównymi. Ta funkcja nie jest rozszerzana na składniki niestandardowe zainstalowane za pomocą akcji skryptu. Jeśli potrzebujesz wysokiej dostępności dla składników niestandardowych, musisz zaimplementować własny mechanizm przełączania awaryjnego.
Konfigurowanie składników niestandardowych do korzystania z usługi Azure Blob Storage
Składniki instalowane w klastrze mogą mieć domyślną konfigurację korzystającą z magazynu rozproszonego systemu plików Apache Hadoop (HDFS). Usługa HDInsight używa usługi Azure Storage lub Data Lake Storage jako magazynu domyślnego. Oba zapewniają zgodny z systemem plików HDFS system plików, który utrwala dane, nawet jeśli klaster zostanie usunięty. Może być konieczne skonfigurowanie instalowanych składników do używania systemu plików WASB lub ADL zamiast systemu plików HDFS.
W przypadku większości operacji nie trzeba określać systemu plików. Na przykład, poniższa komenda kopiuje plik hadoop-common.jar z lokalnego systemu plików do magazynu klastra.
hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/
W tym przykładzie polecenie hdfs
w sposób przezroczysty używa domyślnego magazynu klastra. W przypadku niektórych operacji może być konieczne określenie identyfikatora URI. Na przykład adl:///example/jars
dla usługi Azure Data Lake Storage Gen1, abfs:///example/jars
dla usługi Data Lake Storage Gen2 lub wasb:///example/jars
dla usługi Azure Storage.
Zapisz informacje do STDOUT i STDERR
Usługa HDInsight rejestruje dane wyjściowe skryptu zapisywane w plikach STDOUT i STDERR. Te informacje można wyświetlić przy użyciu internetowego interfejsu użytkownika systemu Ambari.
Uwaga
Narzędzie Apache Ambari jest dostępne tylko wtedy, gdy klaster został pomyślnie utworzony. Jeśli używasz akcji skryptu podczas tworzenia klastra, a tworzenie się nie powiedzie, zobacz Rozwiązywanie problemów z akcjami skryptu, aby uzyskać inne sposoby dostępu do zarejestrowanych informacji.
Większość programów narzędziowych i pakietów instalacyjnych już zapisuje informacje w plikach STDOUT i STDERR, jednak warto dodać dodatkowe rejestrowanie. Aby wysłać tekst do elementu STDOUT, użyj echo
. Na przykład:
echo "Getting ready to install Foo"
Domyślnie echo
wysyła ciąg do stDOUT. Aby skierować go do STDERR, dodaj >&2
przed echo
. Na przykład:
>&2 echo "An error occurred installing Foo"
Spowoduje to przekierowanie informacji zapisanych do STDOUT do STDERR (2) zamiast tego. Aby uzyskać więcej informacji na temat przekierowywania operacji we/wy, zobacz https://www.tldp.org/LDP/abs/html/io-redirection.html.
Aby uzyskać więcej informacji na temat wyświetlania informacji rejestrowanych przez akcje skryptu, zobacz Rozwiązywanie problemów z akcjami skryptu.
Zapisz pliki jako ASCII z zakończeniami wierszy LF
Skrypty powłoki Bash powinny być przechowywane w formacie ASCII, z wierszami kończącymi się na LF. Pliki, które są przechowywane jako UTF-8, lub używają CRLF jako zakończenia linii, mogą zakończyć się niepowodzeniem z powodu następującego błędu:
$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory
Użyj logiki ponawiania prób, aby odzyskać dane po błędach przejściowych
Podczas pobierania plików, instalowania pakietów przy użyciu polecenia apt-get lub innych akcji, które przesyłają dane przez Internet, akcja może zakończyć się niepowodzeniem z powodu przejściowych błędów sieciowych. Na przykład zasób zdalny, z którym komunikujesz się, może być w trakcie przechodzenia w tryb failover do węzła kopii zapasowej.
Aby skrypt był odporny na błędy przejściowe, można zaimplementować logikę ponawiania prób. Poniższa funkcja pokazuje, jak zaimplementować logikę ponawiania prób. Ponawia próbę wykonania operacji trzy razy przed niepowodzeniem.
#retry
MAXATTEMPTS=3
retry() {
local -r CMD="$@"
local -i ATTMEPTNUM=1
local -i RETRYINTERVAL=2
until $CMD
do
if (( ATTMEPTNUM == MAXATTEMPTS ))
then
echo "Attempt $ATTMEPTNUM failed. no more attempts left."
return 1
else
echo "Attempt $ATTMEPTNUM failed! Retrying in $RETRYINTERVAL seconds..."
sleep $(( RETRYINTERVAL ))
ATTMEPTNUM=$ATTMEPTNUM+1
fi
done
}
W poniższych przykładach pokazano, jak używać tej funkcji.
retry ls -ltr foo
retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh
Metody pomocnika dla skryptów niestandardowych
Metody pomocnicze akcji skryptu to narzędzia do używania podczas pisania skryptów niestandardowych. Te metody znajdują się w skrypcie https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh. Użyj poniższych instrukcji, aby pobrać je i użyć w ramach skryptu:
# Import the helper method module.
wget -O /tmp/HDInsightUtilities-v01.sh -q https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh && source /tmp/HDInsightUtilities-v01.sh && rm -f /tmp/HDInsightUtilities-v01.sh
W skrypcie są dostępne następujące narzędzia pomocnicze:
Użycie pomocnika | Opis |
---|---|
download_file SOURCEURL DESTFILEPATH [OVERWRITE] |
Pobiera plik z adresu URI do określonej ścieżki docelowej. Domyślnie nie zastępuje istniejącego pliku. |
untar_file TARFILE DESTDIR |
Wyodrębnia plik tar (przy użyciu -xf ) do katalogu docelowego. |
test_is_headnode |
Jeśli skrypt został uruchomiony w węźle głównym klastra, zwróć 1; w przeciwnym razie, 0. |
test_is_datanode |
Jeśli bieżący węzeł jest węzłem danych (węzłem roboczym), zwróć wartość 1; w przeciwnym razie zwróć wartość 0. |
test_is_first_datanode |
Jeśli bieżący węzeł jest pierwszym węzłem danych (proces roboczy) (nazwany workernode0) zwraca wartość 1; w przeciwnym razie, 0. |
get_headnodes |
Zwróć w pełni kwalifikowaną nazwę domeny serwerów głównych w klastrze. Nazwy są rozdzielane przecinkami. W przypadku błędu zwracany jest pusty ciąg. |
get_primary_headnode |
Pobiera w pełni kwalifikowaną nazwę domeny podstawowego węzła głównego. Pusty ciąg jest zwracany w przypadku błędu. |
get_secondary_headnode |
Pobiera w pełni kwalifikowaną nazwę domeny drugorzędnego węzła głównego. W przypadku błędu zwracany jest pusty ciąg. |
get_primary_headnode_number |
Pobiera sufiks liczbowy podstawowego węzła głównego. Po wystąpieniu błędu zwracany jest pusty ciąg. |
get_secondary_headnode_number |
Pobiera numer sufiksu drugorzędnego węzła głównego. Pusty ciąg jest zwracany w przypadku błędu. |
Typowe wzorce użycia
Ta sekcja zawiera wskazówki dotyczące implementowania niektórych typowych wzorców użycia, które mogą wystąpić podczas pisania własnego skryptu niestandardowego.
Przekazywanie parametrów do skryptu
W niektórych przypadkach skrypt może wymagać parametrów. Na przykład może być konieczne hasło administratora klastra podczas korzystania z interfejsu API REST systemu Ambari.
Parametry przekazywane do skryptu są znane jako parametry pozycyjnei są przypisywane do $1
dla pierwszego parametru, $2
dla drugiego i so-on.
$0
zawiera nazwę samego skryptu.
Wartości przekazywane do skryptu jako parametry powinny być ujęte w pojedyncze cudzysłowy ('). Dzięki temu przekazywana wartość jest traktowana jako literał.
Ustawianie zmiennych środowiskowych
Ustawienie zmiennej środowiskowej jest wykonywane przez następującą instrukcję:
VARIABLENAME=value
W poprzednim przykładzie VARIABLENAME
jest nazwą zmiennej. Aby uzyskać dostęp do zmiennej, użyj $VARIABLENAME
. Aby na przykład przypisać wartość dostarczaną przez parametr pozycyjny jako zmienną środowiskową o nazwie PASSWORD, należy użyć następującej instrukcji:
PASSWORD=$1
Późniejszy dostęp do informacji może następnie użyć $PASSWORD
.
Zmienne środowiskowe ustawione w skrycie istnieją tylko w zakresie skryptu. W niektórych przypadkach może być konieczne dodanie zmiennych środowiskowych obejmujących cały system, które będą utrwalane po zakończeniu działania skryptu. Aby dodać zmienne środowiskowe dla całego systemu, dodaj zmienną do /etc/environment
. Na przykład następująca instrukcja dodaje HADOOP_CONF_DIR
:
echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment
Dostęp do lokalizacji, w których są przechowywane skrypty niestandardowe
Skrypty używane do dostosowywania klastra muszą być przechowywane w jednej z następujących lokalizacji:
Konto usługi Azure Storage skojarzone z klastrem.
dodatkowe konto magazynu skojarzone z klastrem.
publicznie czytelny identyfikator URI. Na przykład adres URL danych przechowywanych w usłudze OneDrive, Dropbox lub innej usłudze hostingu plików.
Konto usługi Azure Data Lake Storage skojarzone z klastrem usługi HDInsight. Aby uzyskać więcej informacji na temat korzystania z usługi Azure Data Lake Storage w usłudze HDInsight, zobacz Szybki start: konfigurowanie klastrów w usłudze HDInsight.
Uwaga
Główna jednostka usługi HDInsight używana do uzyskiwania dostępu do usługi Data Lake Storage musi mieć dostęp do odczytu do skryptu.
Zasoby używane przez skrypt muszą być również publicznie dostępne.
Przechowywanie plików na koncie usługi Azure Storage lub w usłudze Azure Data Lake Storage zapewnia szybki dostęp, zarówno w ramach sieci platformy Azure.
Uwaga
Format identyfikatora URI używany do odwołowania się do skryptu różni się w zależności od używanej usługi. W przypadku kont magazynu skojarzonych z klastrem usługi HDInsight użyj wasb://
lub wasbs://
. W przypadku publicznie czytelnych identyfikatorów URI użyj http://
lub https://
. W przypadku usługi Data Lake Storage użyj adl://
.
Lista kontrolna wdrażania akcji skryptu
Poniżej przedstawiono kroki, które należy wykonać podczas przygotowywania do wdrożenia skryptu:
- Umieść pliki zawierające skrypty niestandardowe w miejscu dostępnym dla węzłów klastra podczas wdrażania. Na przykład domyślny magazyn dla klastra. Pliki mogą być również przechowywane w publicznie czytelnych usługach hostingowych.
- Sprawdź, czy skrypt jest idempotentny. Dzięki temu skrypt może być wykonywany wiele razy w tym samym węźle.
- Użyj tymczasowego katalogu plików /tmp, aby zachować pobrane pliki używane przez skrypty, a następnie wyczyścić je po wykonaniu skryptów.
- Jeśli ustawienia na poziomie systemu operacyjnego lub pliki konfiguracji usługi Hadoop zostaną zmienione, warto ponownie uruchomić usługi HDInsight.
Jak uruchomić akcję skryptu
Za pomocą akcji skryptu można dostosować klastry usługi HDInsight przy użyciu następujących metod:
- Portal Azure
- Azure PowerShell
- Szablony usługi Azure Resource Manager
- SDK .NET dla HDInsight.
Aby uzyskać więcej informacji na temat korzystania z każdej metody, zobacz Jak używać akcji skryptu.
Przykłady skryptów niestandardowych
Firma Microsoft udostępnia przykładowe skrypty do instalowania składników w klastrze usługi HDInsight. Zobacz Install and use Hue on HDInsight clusters jako przykładową akcję skryptu.
Rozwiązywanie problemów
Poniżej przedstawiono błędy, które mogą wystąpić podczas używania utworzonych skryptów:
Błąd: $'\r': command not found
. Czasami następuje syntax error: unexpected end of file
.
Przyczyna: ten błąd jest spowodowany, gdy wiersze skryptu kończą się znakiem CRLF. Systemy Unix oczekują tylko LF jako zakończenia wiersza.
Ten problem występuje najczęściej, gdy skrypt jest utworzony w środowisku systemu Windows, ponieważ CRLF jest typowym wierszem kończącym się dla wielu edytorów tekstów w systemie Windows.
Rezolucja: Jeśli jest to opcja w edytorze tekstu, wybierz format Unix lub LF jako zakończenie linii. Możesz również użyć następujących poleceń w systemie Unix, aby zmienić CRLF na LF:
Uwaga
Następujące polecenia są mniej więcej równoważne w tym sensie, że powinny zmienić zakończenia wiersza CRLF na LF. Wybierz jeden na podstawie narzędzi dostępnych w systemie.
Komenda | Notatki |
---|---|
unix2dos -b INFILE |
Oryginalny plik jest kopiony zapasowo z rozszerzeniem .BAK. |
tr -d '\r' < INFILE > OUTFILE |
PLIK OUTFILE zawiera wersję z tylko zakończeniami LF |
perl -pi -e 's/\r\n/\n/g' INFILE |
Modyfikuje plik bezpośrednio |
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE |
PLIK OUTFILE zawiera wersję wyłącznie z zakończeniami LF. |
Błąd: line 1: #!/usr/bin/env: No such file or directory
.
Przyczyna: ten błąd występuje, gdy skrypt został zapisany jako UTF-8 z znacznikiem kolejności bajtów (BOM).
Rezolucja: Zapisz plik jako ASCII lub UTF-8 bez BOM. Możesz również użyć następującego polecenia w systemie Linux lub Unix, aby utworzyć plik bez znacznika BOM.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Zastąp INFILE
plikiem zawierającym BOM.
OUTFILE
powinna być nową nazwą pliku, który zawiera skrypt bez znacznika BOM.
Następne kroki
- Dowiedz się, jak dostosować klastry usługi HDInsight za pomocą akcji skryptu
- Skorzystaj z dokumentacji zestawu SDK platformy .NET usługi HDInsight, aby dowiedzieć się więcej na temat tworzenia aplikacji platformy .NET, które zarządzają usługą HDInsight
- Użyj API REST usługi HDInsight, aby dowiedzieć się, jak wykorzystywać REST do czynności zarządzania klastrami usługi HDInsight.