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:

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/jarsuntuk 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