Pengembangan aksi skrip dengan HDInsight
Pelajari cara kustomisasi klaster HDInsight menggunakan skrip Bash. Tindakan skrip adalah cara untuk menyesuaikan HDInsight selama atau setelah pembuatan klaster.
Apa yang dimaksud dengan tindakan skrip
Tindakan skrip adalah skrip Bash yang dijalankan Azure pada node klaster untuk membuat perubahan konfigurasi atau menginstal perangkat lunak. Aksi skrip dijalankan sebagai root, dan menyediakan hak akses penuh ke node klaster.
Tindakan skrip dapat diterapkan melalui metode berikut:
Gunakan metode ini untuk menerapkan skrip... | Selama pembuatan klaster... | Pada klaster yang sedang berjalan... |
---|---|---|
Portal Azure | ✓ | ✓ |
Azure PowerShell | ✓ | ✓ |
Azure Classic CLI | ✓ | |
HDInsight .NET SDK | ✓ | ✓ |
Templat Azure Resource Manager | ✓ |
Untuk informasi selengkapnya tentang penggunaan metode ini untuk menerapkan tindakan skrip, lihat Kustomisasi klaster HDInsight menggunakan tindakan skrip.
Praktik terbaik untuk pengembangan skrip
Ketika Anda mengembangkan skrip kustom untuk klaster HDInsight, ada beberapa praktik terbaik yang perlu diingat:
- Menargetkan versi Apache Hadoop
- Menargetkan Versi OS
- Menyediakan tautan yang stabil ke sumber daya skrip
- Menggunakan sumber daya pra-kompilasi
- Memastikan bahwa skrip kustomisasi klaster idempotent
- Memastikan ketersediaan arsitektur klaster yang tinggi
- Mengonfigurasi komponen kustom untuk menggunakan penyimpanan Azure Blob
- Menulis informasi ke STDOUT dan STDERR
- Menyimpan file sebagai ASCII dengan akhiran baris LF
- Menggunakan logika coba ulang untuk memulihkan dari eror sementara
Penting
Tindakan skrip harus selesai dalam waktu 60 menit atau proses gagal. Selama penyediaan node, skrip berjalan bersamaan dengan proses penyiapan dan konfigurasi lainnya. Persaingan untuk sumber daya seperti waktu CPU atau bandwidth jaringan dapat menyebabkan skrip membutuhkan waktu lebih lama untuk menyelesaikan daripada jika berada di lingkungan pengembangan Anda.
Menargetkan versi Apache Hadoop
Versi HDInsight yang berbeda memiliki versi layanan dan komponen Hadoop yang berbeda yang diinstal. Jika skrip Anda mengharapkan versi tertentu dari layanan atau komponen, Anda hanya boleh menggunakan skrip dengan versi HDInsight yang menyertakan komponen yang diperlukan. Anda dapat menemukan informasi tentang versi komponen yang disertakan dengan HDInsight menggunakan Dokumen penerapan versi komponen HDInsight.
Pemeriksaan versi sistem operasi
Versi HDInsight yang berbeda mengandalkan versi Ubuntu tertentu. Mungkin ada perbedaan antar versi OS yang harus Anda periksa di skrip Anda. Misalnya, Anda mungkin harus menginstal biner yang terkait dengan versi Ubuntu.
Untuk memeriksa versi OS, gunakan lsb_release
. Contohnya, skrip berikut menunjukkan cara mereferensikan file tar tertentu tergantung dari versi OS-nya:
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
Menargetkan versi sistem operasi
HDInsight didasarkan pada distribusi Linux Ubuntu. Versi HDInsight yang berbeda mengandalkan versi Ubuntu yang berbeda, yang dapat mengubah cara skrip Anda berperilaku. Misalnya, HDInsight 3.4 dan yang lebih lama didasarkan pada versi Ubuntu yang menggunakan Upstart. Versi 3.5 dan yang lebih tinggi didasarkan pada Ubuntu 16.04, yang menggunakan Systemd
. Systemd
dan Upstart mengandalkan perintah yang berbeda, sehingga skrip Anda harus ditulis untuk bekerja dengan keduanya.
Perbedaan penting lainnya antara HDInsight 3.4 dan 3.5 adalah JAVA_HOME
sekarang menunjuk ke Java 8. Kode berikut menunjukkan cara menentukan apakah skrip berjalan pada Ubuntu 14 atau 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
Anda dapat menemukan skrip lengkap yang berisi cuplikan ini di https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh.
Untuk versi Ubuntu yang digunakan oleh HDInsight, lihat dokumen Versi komponen HDInsight.
Untuk memahami perbedaan antara Systemd
dan Upstart, lihat Systemd
untuk Pengguna upstart.
Menyediakan tautan yang stabil ke sumber daya skrip
Skrip dan sumber daya terkait harus tetap tersedia selama masa pakai klaster. Sumber daya ini diperlukan jika node baru ditambahkan ke klaster selama operasi penyekalaan.
Praktik terbaik adalah mengunduh dan mengarsipkan semuanya di akun Azure Storage pada langganan Anda.
Penting
Akun penyimpanan yang digunakan harus merupakan akun penyimpanan default untuk klaster atau kontainer publik khusus baca pada akun penyimpanan lainnya.
Contohnya, sampel yang disediakan oleh Microsoft disimpan di akun penyimpanan https://hdiconfigactions.blob.core.windows.net/
. Lokasi ini adalah kontainer publik khusus baca yang dikelola oleh tim HDInsight.
Menggunakan sumber daya pra-kompilasi
Untuk mengurangi waktu yang diperlukan untuk menjalankan skrip, hindari operasi yang mengompilasi sumber daya dari kode sumber. Misalnya, melakukan pra-kompilasi sumber daya dan menyimpannya di blob akun Azure Storage di pusat data yang sama dengan HDInsight.
Pastikan skrip kustomisasi klaster idempotent
Skrip harus idempotent. Jika skrip berjalan beberapa kali, skrip harus mengembalikan klaster ke keadaan yang sama setiap saat.
Jika skrip berjalan beberapa kali, skrip yang memodifikasi file konfigurasi tidak boleh menambahkan entri duplikat.
Memastikan ketersediaan arsitektur klaster yang tinggi
Klaster HDInsight berbasis Linux menyediakan dua node kepala yang aktif dalam klaster, dan tindakan skrip berjalan pada kedua node. Jika komponen yang Anda pasang hanya mengharapkan satu node kepala, jangan menginstal komponen pada kedua node kepala.
Penting
Layanan yang disediakan sebagai bagian dari HDInsight dirancang untuk gagal di antara dua node kepala sesuai kebutuhan. Fungsionalitas ini tidak diperluas ke komponen kustom yang diinstal melalui tindakan skrip. Jika Anda membutuhkan ketersediaan tinggi untuk komponen kustom, Anda harus menerapkan mekanisme kegagalan Anda sendiri.
Mengonfigurasi komponen kustom untuk menggunakan penyimpanan Azure Blob
Komponen yang Anda instal pada klaster mungkin memiliki konfigurasi default yang menggunakan penyimpanan Sistem File Terdistribusi Apache Hadoop (HDFS). HDInsight menggunakan Azure Storage atau Data Lake Storage sebagai penyimpanan default. Keduanya menyediakan sistem file kompatibel HDFS yang mempertahankan data meski jika klaster dihapus. Anda mungkin perlu mengonfigurasi komponen yang Anda instal untuk menggunakan WASB atau ADL dan bukan HDFS.
Untuk sebagian besar operasi, Anda tidak perlu menentukan sistem file. Contohnya, tindakan berikut menyalin file hadoop-common.jar dari sistem file lokal ke penyimpanan klaster:
hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/
Dalam contoh ini, perintah hdfs
secara transparan menggunakan penyimpanan klaster default. Untuk beberapa operasi, Anda mungkin perlu menentukan URI. Contohnya, adl:///example/jars
untuk Azure Data Lake Storage Gen1, abfs:///example/jars
untuk Data Lake Storage Gen2 atau wasb:///example/jars
untuk Azure Storage.
Menulis informasi ke STDOUT dan STDERR
HDInsight mencatat output skrip yang ditulis ke STDOUT dan STDERR. Anda bisa melihat informasi ini menggunakan UI web Ambari.
Catatan
Apache Ambari hanya tersedia jika klaster berhasil dibuat. Jika Anda menggunakan tindakan skrip selama pembuatan klaster, dan pembuatan gagal, lihat Memecahkan masalah tindakan skrip untuk cara lain mengakses informasi yang dicatat.
Sebagian besar utilitas dan paket instalasi sudah menulis informasi ke STDOUT dan STDERR, namun Anda mungkin ingin menambahkan pencatatan tambahan. Untuk mengirim teks ke STDOUT, gunakan echo
. Contohnya:
echo "Getting ready to install Foo"
Secara default, echo
mengirim string ke STDOUT. Untuk mengarahkannya ke STDERR, tambahkan >&2
sebelum echo
. Contohnya:
>&2 echo "An error occurred installing Foo"
Tindakan ini mengalihkan informasi yang ditulis ke STDOUT ke STDERR (2) sebagai gantinya. Untuk informasi selengkapnya tentang pengalihan IO, lihat https://www.tldp.org/LDP/abs/html/io-redirection.html.
Untuk informasi selengkapnya tentang melihat informasi yang dicatat oleh tindakan skrip, lihat Memecahkan masalah tindakan skrip.
Menyimpan file sebagai ASCII dengan akhiran baris LF
Skrip bash harus disimpan sebagai format ASCII, dengan garis dihentikan oleh LF. File yang disimpan sebagai UTF-8, atau menggunakan CRLF sebagai akhir baris mungkin gagal dengan eror berikut:
$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory
Menggunakan logika coba ulang untuk memulihkan dari eror sementara
Saat Anda mengunduh file, menginstal paket menggunakan apt-get, atau tindakan lain yang mengirimkan data melalui internet, tindakan mungkin gagal karena kesalahan jaringan sementara. Contohnya, sumber daya jarak jauh yang Anda komunikasikan mungkin sedang dalam proses gagal ke node cadangan.
Untuk membuat skrip Anda tangguh terhadap eror sementara, Anda dapat menerapkan logika coba ulang. Fungsi berikut menunjukkan cara menerapkan logika coba ulang. Tindakan ini mencoba ulang operasi tiga kali sebelum gagal.
#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
}
Contoh berikut menunjukkan cara menggunakan fungsi ini.
retry ls -ltr foo
retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh
Metode penolong untuk skrip kustom
Metode penolong tindakan skrip adalah utilitas yang dapat Anda gunakan saat menulis skrip kustom. Metode ini terkandung dalam skrip https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh. Gunakan yang berikut ini untuk mengunduh dan menggunakannya sebagai bagian dari skrip Anda:
# 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
Penolong berikut ini tersedia untuk digunakan dalam skrip Anda:
Penggunaan penolong | Deskripsi |
---|---|
download_file SOURCEURL DESTFILEPATH [OVERWRITE] |
Mengunduh berkas dari URI sumber ke jalur file yang ditentukan. Secara default, ia tidak menimpa file yang ada. |
untar_file TARFILE DESTDIR |
Mengekstrak file tar (menggunakan -xf ) ke direktori tujuan. |
test_is_headnode |
Jika skrip berjalan pada node kepala klaster, 1 ditampilkan; jika tidak, 0. |
test_is_datanode |
Jika node saat ini adalah node data (pekerja), 1 ditampilkan; jika tidak, 0. |
test_is_first_datanode |
Jika node saat ini adalah node data (pekerja) pertama (bernama workernode0) 1 ditampilkan; jika tidak, 0. |
get_headnodes |
Menampilkan nama domain headnode yang sepenuhnya memenuhi syarat dalam klaster. Nama dibatasi koma. String kosong ditampilkan dalam bentuk eror. |
get_primary_headnode |
Mendapatkan nama domain yang sepenuhnya memenuhi syarat dari headnode primer. String kosong ditampilkan dalam bentuk eror. |
get_secondary_headnode |
Mendapatkan nama domain yang sepenuhnya memenuhi syarat dari headnode sekunder. String kosong ditampilkan dalam bentuk eror. |
get_primary_headnode_number |
Mendapatkan akhiran numerik dari headnode primer. String kosong ditampilkan dalam bentuk eror. |
get_secondary_headnode_number |
Mendapatkan akhiran numerik dari headnode sekunder. String kosong ditampilkan dalam bentuk eror. |
Pola penggunaan umum
Bagian ini menyediakan panduan tentang penerapan beberapa pola penggunaan umum yang mungkin Anda jalankan saat menulis skrip kustom Anda sendiri.
Penerusan parameter ke skrip
Dalam beberapa kasus, skrip Anda mungkin memerlukan parameter. Contohnya, Anda mungkin memerlukan kata sandi admin untuk klaster saat menggunakan Ambari REST API.
Parameter yang diteruskan ke skrip dikenal sebagai parameter posisi, dan ditetapkan ke $1
untuk parameter pertama, $2
untuk yang kedua, dan seterusnya. $0
berisi nama skrip itu sendiri.
Nilai yang diteruskan ke skrip sebagai parameter harus diapit oleh tanda kutip tunggal ('). Melakukannya memastikan nilai yang dilewatkan diperlakukan sebagai literal.
Pengaturan variabel lingkungan
Pengaturan variabel lingkungan dilakukan dengan pernyataan berikut:
VARIABLENAME=value
Dalam contoh sebelumnya, VARIABLENAME
adalah nama variabel. Untuk mengakses variabel, gunakan $VARIABLENAME
. Contohnya, untuk menetapkan nilai yang disediakan oleh parameter posisi sebagai variabel lingkungan bernama PASSWORD, Anda akan menggunakan pernyataan berikut:
PASSWORD=$1
Akses berikutnya ke informasi kemudian dapat menggunakan $PASSWORD
.
Variabel lingkungan yang diatur dalam skrip hanya ada dalam lingkup skrip. Dalam beberapa kasus, Anda mungkin perlu menambahkan variabel lingkungan seluruh sistem yang akan bertahan setelah skrip selesai. Untuk menambahkan variabel lingkungan seluruh sistem, tambahkan variabel ke /etc/environment
. Contohnya, pernyataan berikut menambahkan HADOOP_CONF_DIR
:
echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment
Akses ke lokasi tempat skrip kustom disimpan
Skrip yang digunakan untuk kustomisasi klaster harus disimpan di salah satu lokasi berikut:
Akun Azure Storage yang terkait dengan klaster.
Akun penyimpanan tambahan yang terkait dengan klaster.
URI yang dapat dibaca secara publik. Contohnya, URL ke data yang disimpan di OneDrive, Dropbox, atau layanan hosting file lainnya.
Akun Azure Data Lake Storage yang terkait dengan klaster HDInsight. Untuk informasi selengkapnya tentang penggunaan Azure Data Lake Storage dengan HDInsight, lihat Mulai Cepat: Menyiapkan klaster di HDInsight.
Catatan
Layanan utama HDInsight digunakan untuk mengakses Data Lake Storage harus memiliki akses baca ke skrip.
Sumber daya yang digunakan oleh skrip juga harus tersedia untuk umum.
Penyimpanan file di akun Azure Storage atau Azure Data Lake Storage menyediakan akses cepat, karena keduanya berada dalam jaringan Azure.
Catatan
Format URI yang digunakan untuk mereferensikan skrip berbeda tergantung dari layanan yang digunakan. Untuk akun penyimpanan yang terkait dengan klaster HDInsight, gunakan wasb://
atau wasbs://
. Untuk URI yang dapat dibaca secara publik, gunakan http://
atau https://
. Untuk Data Lake Storage, gunakan adl://
.
Daftar periksa untuk menggunakan tindakan skrip
Berikut adalah langkah-langkah yang diambil saat mempersiapkan untuk menyebarkan skrip:
- Letakkan file yang berisi skrip kustom di tempat yang dapat diakses oleh node klaster selama penyebaran. Contohnya, penyimpanan default untuk klaster. File juga dapat disimpan di layanan hosting yang dapat dibaca secara publik.
- Pastikan skrip tersebut idempoten. Melakukan hal ini memungkinkan skrip dieksekusi beberapa kali pada node yang sama.
- Gunakan direktori file sementara/tmp untuk menyimpan unduhan file yang digunakan oleh skrip lalu bersihkan setelah skrip dijalankan.
- Jika pengaturan tingkat OS atau file konfigurasi layanan Hadoop diubah, Anda mungkin ingin memulai ulang layanan HDInsight.
Cara menjalankan tindakan skrip
Anda dapat menggunakan tindakan skrip untuk kustomisasi klaster HDInsight menggunakan metode berikut:
- portal Microsoft Azure
- Azure PowerShell
- Templat Azure Resource Manager
- HDInsight .NET SDK.
Untuk informasi selengkapnya tentang penggunaan setiap metode, lihat Cara menggunakan tindakan skrip.
Sampel skrip kustom
Microsoft menyediakan contoh skrip untuk menginstal komponen pada klaster HDInsight. Lihat Menginstal dan menggunakan Hue pada klaster HDInsight sebagai contoh tindakan skrip.
Pemecahan Masalah
Berikut ini adalah eror yang mungkin Anda temui saat menggunakan skrip yang telah Anda kembangkan:
Eror: $'\r': command not found
. Kadang-kadang diikuti oleh syntax error: unexpected end of file
.
Penyebab: Eror ini disebabkan ketika baris dalam skrip berakhir dengan CRLF. Sistem Unix hanya mengharapkan LF sebagai garis berakhir.
Masalah ini paling sering terjadi ketika skrip ditulis pada lingkungan Windows, karena CRLF adalah garis akhir umum untuk banyak editor teks pada Windows.
Resolusi: Jika itu adalah opsi di editor teks Anda, pilih Format Unix atau LF untuk akhiran baris. Anda juga dapat menggunakan perintah berikut pada sistem Unix untuk mengubah CRLF menjadi LF:
Catatan
Perintah berikut cukup mirip dalam hal caranya mengubah akhir baris CRLF ke LF. Pilih satu berdasarkan utilitas yang tersedia di sistem Anda.
Perintah | Catatan |
---|---|
unix2dos -b INFILE |
File asli dicadangkan dengan file berekstensi .BAK |
tr -d '\r' < INFILE > OUTFILE |
OUTFILE berisi versi dengan akhiran LF saja |
perl -pi -e 's/\r\n/\n/g' INFILE |
Memodifikasi file secara langsung |
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE |
OUTFILE berisi versi dengan akhiran LF saja. |
Eror: line 1: #!/usr/bin/env: No such file or directory
.
Penyebab: Kesalahan ini terjadi ketika skrip disimpan sebagai UTF-8 dengan Tanda Pesanan Byte (BOM).
Resolusi: Simpan file baik sebagai ASCII, atau sebagai UTF-8 tanpa BOM. Anda juga dapat menggunakan perintah berikut pada sistem Linux atau Unix untuk membuat file tanpa BOM:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Ganti INFILE
dengan file yang berisi BOM. OUTFILE
akan menjadi nama file baru, yang berisi skrip tanpa BOM.
Langkah berikutnya
- Pelajari cara Kustomisasi klaster HDInsight menggunakan tindakan skrip
- Gunakan Referensi HDInsight .NET SDK untuk mempelajari selengkapnya tentang pembuatan aplikasi .NET yang mengelola HDInsight
- Gunakan HDInsight REST API untuk mempelajari cara menggunakan REST untuk melakukan tindakan manajemen pada klaster HDInsight.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk