HDInsight ile betik eylemi geliştirme

Bash betiklerini kullanarak HDInsight kümenizi özelleştirmeyi öğrenin. Betik eylemleri, küme oluşturma sırasında veya sonrasında HDInsight'ı özelleştirmenin bir yoludur.

Betik eylemleri nedir?

Betik eylemleri, Azure'ın yapılandırma değişiklikleri yapmak veya yazılım yüklemek için küme düğümlerinde çalıştırdığını Bash betikleridir. Bir betik eylemi kök olarak yürütülür ve küme düğümlerine tam erişim hakları sağlar.

Betik eylemleri aşağıdaki yöntemlerle uygulanabilir:

Betik uygulamak için bu yöntemi kullanın... Küme oluşturma sırasında... Çalışan bir kümede...
Azure portal
Azure PowerShell
Azure Klasik CLI  
HDInsight .NET SDK'sı
Azure Resource Manager Şablonu  

Betik eylemlerini uygulamak için bu yöntemleri kullanma hakkında daha fazla bilgi için bkz. Betik eylemlerini kullanarak HDInsight kümelerini özelleştirme.

Betik geliştirme için en iyi yöntemler

HDInsight kümesi için özel betik geliştirirken aklınızda bulundurmanız gereken birkaç en iyi yöntem vardır:

Önemli

Betik eylemleri 60 dakika içinde tamamlanmalıdır veya işlem başarısız olur. Düğüm sağlama sırasında betik diğer kurulum ve yapılandırma işlemleriyle eşzamanlı olarak çalışır. CPU süresi veya ağ bant genişliği gibi kaynakların rekabeti, betiğin tamamlanmasının geliştirme ortamınızda olduğundan daha uzun sürmesine neden olabilir.

Apache Hadoop sürümünü hedefleme

HDInsight'ın farklı sürümlerinde Hadoop hizmetlerinin ve bileşenlerinin farklı sürümleri yüklüdür. Betiğiniz bir hizmet veya bileşenin belirli bir sürümünü bekliyorsa, betiği yalnızca gerekli bileşenleri içeren HDInsight sürümüyle kullanmanız gerekir. HDInsight bileşeni sürüm oluşturma belgesini kullanarak HDInsight'a dahil edilen bileşen sürümleri hakkında bilgi bulabilirsiniz.

İşletim sistemi sürümünü denetleme

HDInsight'ın farklı sürümleri Ubuntu'nun belirli sürümlerine dayanır. Betiğinizde denetlemeniz gereken işletim sistemi sürümleri arasında farklar olabilir. Örneğin, Ubuntu sürümüne bağlı bir ikili yüklemeniz gerekebilir.

İşletim sistemi sürümünü denetlemek için kullanın lsb_release. Örneğin, aşağıdaki betik işletim sistemi sürümüne bağlı olarak belirli bir tar dosyasına nasıl başvurduğunu gösterir:

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

İşletim sistemi sürümünü hedefleme

HDInsight, Ubuntu Linux dağıtımını temel alır. HDInsight'ın farklı sürümleri, betiğinizin davranışını değiştirebilecek farklı Ubuntu sürümlerine dayanır. Örneğin, HDInsight 3.4 ve öncesi, Upstart kullanan Ubuntu sürümlerini temel alır. 3.5 ve üzeri sürümler, Systemd kullanan Ubuntu 16.04'ü temel alır. Systemd ve Upstart farklı komutlara dayanır, bu nedenle betiğinizin her ikisiyle de çalışacak şekilde yazılması gerekir.

HDInsight 3.4 ve 3.5 arasındaki bir diğer önemli fark da artık Java 8'e işaret ediyor olmasıdır JAVA_HOME . Aşağıdaki kod, betiğin Ubuntu 14 veya 16'da çalışıp çalışmadığının nasıl belirleneceğini gösterir:

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

Bu kod parçacıklarını içeren tam betiği adresinde https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.shbulabilirsiniz.

HDInsight tarafından kullanılan Ubuntu sürümü için HDInsight bileşen sürümü belgesine bakın.

Systemd ve Upstart arasındaki farkları anlamak için bkz. Upstart kullanıcıları için Systemd.

Betik kaynaklarına kararlı bağlantılar sağlama

Betik ve ilişkili kaynaklar kümenin ömrü boyunca kullanılabilir durumda kalmalıdır. Ölçeklendirme işlemleri sırasında kümeye yeni düğümler eklenirse bu kaynaklar gereklidir.

En iyi yöntem, aboneliğinizdeki bir Azure Depolama hesabındaki her şeyi indirmek ve arşivlemektir.

Önemli

Kullanılan depolama hesabı, küme için varsayılan depolama hesabı veya diğer depolama hesaplarında genel, salt okunur bir kapsayıcı olmalıdır.

Örneğin, Microsoft tarafından sağlanan örnekler depolama hesabında depolanır https://hdiconfigactions.blob.core.windows.net/ . Bu konum, HDInsight ekibi tarafından tutulan genel, salt okunur bir kapsayıcıdır.

Önceden derlenmiş kaynakları kullanma

Betiği çalıştırmak için gereken süreyi azaltmak için kaynakları kaynak koddan derleyen işlemlerden kaçının. Örneğin, kaynakları önceden derleyin ve HDInsight ile aynı veri merkezinde bir Azure Depolama hesabı blobunda depolayın.

Küme özelleştirme betiğinin bir kez etkili olduğundan emin olun

Betikler bir kez etkili olmalıdır. Betik birden çok kez çalışıyorsa, kümeyi her seferinde aynı duruma döndürmelidir.

Örneğin, yapılandırma dosyalarını değiştiren bir betik, birden çok kez çalıştırılırsa yinelenen girdiler eklememelidir.

Küme mimarisinin yüksek kullanılabilirliğini sağlama

Linux tabanlı HDInsight kümeleri, küme içinde etkin olan iki baş düğüm sağlar ve betik eylemleri her iki düğümde de çalışır. Yüklediğiniz bileşenler yalnızca bir baş düğüm bekliyorsa, bileşenleri her iki baş düğüme de yüklemeyin.

Önemli

HDInsight kapsamında sağlanan hizmetler, gerektiğinde iki baş düğüm arasında yük devretme gerçekleştirecek şekilde tasarlanmıştır. Bu işlevsellik, betik eylemleri aracılığıyla yüklenen özel bileşenlere genişletilmemiştir. Özel bileşenler için yüksek kullanılabilirliğe ihtiyacınız varsa, kendi yük devretme mekanizmanızı uygulamanız gerekir.

Azure Blob depolamayı kullanmak için özel bileşenleri yapılandırma

Kümeye yüklediğiniz bileşenler, Apache Hadoop Dağıtılmış Dosya Sistemi (HDFS) depolaması kullanan varsayılan bir yapılandırmaya sahip olabilir. HDInsight, varsayılan depolama alanı olarak Azure Depolama veya Data Lake Storage kullanır. Her ikisi de küme silinse bile verileri kalıcı hale getiren HDFS uyumlu bir dosya sistemi sağlar. Yüklediğiniz bileşenleri HDFS yerine WASB veya ADL kullanacak şekilde yapılandırmanız gerekebilir.

Çoğu işlem için dosya sistemini belirtmeniz gerekmez. Örneğin, aşağıdakiler hadoop-common.jar dosyasını yerel dosya sisteminden küme depolama alanına kopyalar:

hdfs dfs -put /usr/hdp/current/hadoop-client/hadoop-common.jar /example/jars/

Bu örnekte, hdfs komut saydam olarak varsayılan küme depolama alanını kullanır. Bazı işlemler için URI'yi belirtmeniz gerekebilir. Örneğin, adl:///example/jars Azure Data Lake Storage 1. Nesil için, abfs:///example/jars Data Lake Storage 2. Nesil için veya wasb:///example/jars Azure Depolama için.

STDOUT ve STDERR'ye bilgi yazma

HDInsight, STDOUT ve STDERR'ye yazılan betik çıkışını günlüğe kaydeder. Ambari web kullanıcı arabirimini kullanarak bu bilgileri görüntüleyebilirsiniz.

Not

Apache Ambari yalnızca küme başarıyla oluşturulduysa kullanılabilir. Küme oluşturma sırasında bir betik eylemi kullanırsanız ve oluşturma başarısız olursa günlüğe kaydedilen bilgilere erişmenin diğer yolları için betik eylemlerinde sorun giderme bölümüne bakın.

Çoğu yardımcı program ve yükleme paketi zaten STDOUT ve STDERR'ye bilgi yazar, ancak ek günlük kaydı eklemek isteyebilirsiniz. STDOUT'a metin göndermek için kullanın echo. Örnek:

echo "Getting ready to install Foo"

Varsayılan olarak, echo dizeyi STDOUT'a gönderir. Bunu STDERR'ye yönlendirmek için önce echoöğesini ekleyin>&2. Örnek:

>&2 echo "An error occurred installing Foo"

Bunun yerine STDOUT'a yazılan bilgileri STDERR'ye (2) yönlendirir. GÇ yeniden yönlendirmesi hakkında daha fazla bilgi için bkz https://www.tldp.org/LDP/abs/html/io-redirection.html. .

Betik eylemleri tarafından günlüğe kaydedilen bilgileri görüntüleme hakkında daha fazla bilgi için bkz. Betik eylemleriyle ilgili sorunları giderme.

LF satır sonlarıyla dosyaları ASCII olarak kaydetme

Bash betikleri, LF tarafından sonlandırılan satırlarla birlikte ASCII biçiminde depolanmalıdır. UTF-8 olarak depolanan veya satır sonu olarak CRLF kullanan dosyalar aşağıdaki hatayla başarısız olabilir:

$'\r': command not found
line 1: #!/usr/bin/env: No such file or directory

Geçici hatalardan kurtarmak için yeniden deneme mantığını kullanma

Dosyaları indirirken, apt-get kullanarak paketleri yüklerken veya İnternet üzerinden veri aktaran diğer eylemlerde, geçici ağ hataları nedeniyle eylem başarısız olabilir. Örneğin, iletişimde olduğunuz uzak kaynak bir yedekleme düğümüne yük devretme sürecinde olabilir.

Betiğinizin geçici hatalara dayanıklı olmasını sağlamak için yeniden deneme mantığını uygulayabilirsiniz. Aşağıdaki işlev, yeniden deneme mantığının nasıl uygulanduğunu gösterir. Başarısız olmadan önce işlemi üç kez yeniden dener.

#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
}

Aşağıdaki örneklerde bu işlevin nasıl kullanılacağı gösterilmektedir.

retry ls -ltr foo

retry wget -O ./tmpfile.sh https://hdiconfigactions.blob.core.windows.net/linuxhueconfigactionv02/install-hue-uber-v02.sh

Özel betikler için yardımcı yöntemler

Betik eylemi yardımcı yöntemleri, özel betikler yazarken kullanabileceğiniz yardımcı programlardır. Bu yöntemler betikte https://hdiconfigactions.blob.core.windows.net/linuxconfigactionmodulev01/HDInsightUtilities-v01.sh yer alır. Bunları betiğinizin bir parçası olarak indirmek ve kullanmak için aşağıdakileri kullanın:

# 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

Aşağıdaki yardımcılar betiğinizde kullanılabilir:

Yardımcı kullanım Açıklama
download_file SOURCEURL DESTFILEPATH [OVERWRITE] Kaynak URI'den belirtilen dosya yoluna bir dosya indirir. Varsayılan olarak, var olan bir dosyanın üzerine yazmaz.
untar_file TARFILE DESTDIR Hedef dizine bir tar dosyası (kullanarak -xf) ayıklar.
test_is_headnode Betik bir küme baş düğümünde çalıştırdıysa 1 döndürür; aksi takdirde, 0.
test_is_datanode Geçerli düğüm bir veri (çalışan) düğümüyse 1 döndürür; aksi takdirde, 0.
test_is_first_datanode Geçerli düğüm ilk veri (çalışan) düğümüyse (workernode0 adlı) bir 1 döndürür; aksi takdirde, 0.
get_headnodes Kümedeki baş düğümlerin tam etki alanı adını döndürür. Adlar virgülle ayrılmıştır. Hata olduğunda boş bir dize döndürülür.
get_primary_headnode Birincil baş düğümün tam etki alanı adını alır. Hata olduğunda boş bir dize döndürülür.
get_secondary_headnode İkincil baş düğümün tam etki alanı adını alır. Hata olduğunda boş bir dize döndürülür.
get_primary_headnode_number Birincil baş düğümün sayısal sonekini alır. Hata olduğunda boş bir dize döndürülür.
get_secondary_headnode_number İkincil baş düğümün sayısal sonekini alır. Hata olduğunda boş bir dize döndürülür.

Yaygın kullanım desenleri

Bu bölümde, kendi özel betiğinizi yazarken karşılaşabileceğiniz bazı yaygın kullanım desenlerini uygulama konusunda rehberlik sağlanır.

Betiklere parametre geçirme

Bazı durumlarda betiğiniz parametre gerektirebilir. Örneğin, Ambari REST API'sini kullanırken kümenin yönetici parolasına ihtiyacınız olabilir.

Betike geçirilen parametreler konumsal parametreler olarak bilinir ve ilk parametre için, $2 ikinci ve benzeri için atanır$1. $0 betiğin adını içerir.

Betikte parametre olarak geçirilen değerler tek tırnak (') içine alınmalıdır. Bunun yapılması, geçirilen değerin değişmez değer olarak kabul edilmesini sağlar.

Ortam değişkenlerini ayarlama

Ortam değişkenini ayarlama işlemi aşağıdaki deyimle gerçekleştirilir:

VARIABLENAME=value

Yukarıdaki örnekte VARIABLENAME değişkenin adı verilmiştir. değişkenine erişmek için kullanın $VARIABLENAME. Örneğin, konumsal parametre tarafından sağlanan bir değeri PASSWORD adlı bir ortam değişkeni olarak atamak için aşağıdaki deyimi kullanabilirsiniz:

PASSWORD=$1

Bilgilere daha sonra erişim daha sonra kullanabilir $PASSWORD.

Betik içinde ayarlanan ortam değişkenleri yalnızca betiğin kapsamında bulunur. Bazı durumlarda, betik tamamlandıktan sonra kalıcı olacak sistem genelinde ortam değişkenleri eklemeniz gerekebilir. Sistem genelinde ortam değişkenleri eklemek için değişkenine /etc/environmentekleyin. Örneğin, aşağıdaki deyim şunu ekler HADOOP_CONF_DIR:

echo "HADOOP_CONF_DIR=/etc/hadoop/conf" | sudo tee -a /etc/environment

Özel betiklerin depolandığı konumlara erişim

Kümeyi özelleştirmek için kullanılan betiklerin aşağıdaki konumlardan birinde depolanması gerekir:

  • Kümeyle ilişkili bir Azure Depolama hesabı .

  • Kümeyle ilişkili ek bir depolama hesabı .

  • Genel olarak okunabilir bir URI. Örneğin, OneDrive, Dropbox veya diğer dosya barındırma hizmetinde depolanan verilerin URL'si.

  • HDInsight kümesiyle ilişkili bir Azure Data Lake Storage hesabı. HDInsight ile Azure Data Lake Storage kullanma hakkında daha fazla bilgi için bkz. Hızlı Başlangıç: HDInsight'ta kümeleri ayarlama.

    Not

    HDInsight'ın erişmek için kullandığı hizmet sorumlusu Data Lake Storage betikte okuma erişimi olmalıdır.

Betik tarafından kullanılan kaynakların da genel kullanıma açık olması gerekir.

Dosyaları bir Azure Depolama hesabında veya Azure Data Lake Storage depolamak, her ikisi de Azure ağında olduğu gibi hızlı erişim sağlar.

Not

Betiği başvurmak için kullanılan URI biçimi, kullanılan hizmete bağlı olarak farklılık gösterir. HDInsight kümesiyle ilişkili depolama hesapları için veya wasbs://kullanınwasb://. Genel olarak okunabilir URI'ler için veya https://kullanınhttp://. Data Lake Storage için kullanınadl://.

Betik eylemi dağıtmak için denetim listesi

Betiği dağıtmaya hazırlanırken aşağıdaki adımları uygulayın:

  • Özel betikleri içeren dosyaları dağıtım sırasında küme düğümleri tarafından erişilebilen bir yere yerleştirin. Örneğin, küme için varsayılan depolama alanı. Dosyalar genel olarak okunabilir barındırma hizmetlerinde de depolanabilir.
  • Betiğin bir kez etkili olduğunu doğrulayın. Bunun yapılması betiğin aynı düğümde birden çok kez yürütülmesini sağlar.
  • Betikler tarafından kullanılan indirilen dosyaları tutmak ve betikler yürütüldükten sonra temizlemek için geçici bir dosya dizini /tmp kullanın.
  • İşletim sistemi düzeyi ayarları veya Hadoop hizmet yapılandırma dosyaları değiştirilirse HDInsight hizmetlerini yeniden başlatmak isteyebilirsiniz.

Betik eylemi çalıştırma

HdInsight kümelerini özelleştirmek için aşağıdaki yöntemleri kullanarak betik eylemlerini kullanabilirsiniz:

  • Azure portal
  • Azure PowerShell
  • Azure Resource Manager şablonları
  • HDInsight .NET SDK'sı.

Her yöntemi kullanma hakkında daha fazla bilgi için bkz. Betik eylemini kullanma.

Özel betik örnekleri

Microsoft, HDInsight kümesine bileşenleri yüklemek için örnek betikler sağlar. Örnek betik eylemi olarak bkz . HDInsight kümelerine Hue yükleme ve kullanma .

Sorun giderme

Geliştirdiğiniz betikleri kullanırken karşılaşabileceğiniz hatalar şunlardır:

Hata: $'\r': command not found. Bazen ve syntax error: unexpected end of fileardından .

Neden: Bu hata, bir betikteki satırlar CRLF ile sona erdiğinde oluşur. Unix sistemleri satır sonu olarak yalnızca LF bekler.

CrLF, Windows'da birçok metin düzenleyicisi için ortak bir satır sonu olduğundan, bu sorun en çok betik bir Windows ortamında yazıldığında oluşur.

Çözünürlük: Metin düzenleyicinizde bir seçenek varsa, satır sonu için Unix biçimi'ni veya LF'yi seçin. CRLF'yi lf olarak değiştirmek için unix sisteminde aşağıdaki komutları da kullanabilirsiniz:

Not

Aşağıdaki komutlar CRLF satır sonlarını LF olarak değiştirmeleri gerektiği için kabaca eşdeğerdir. Sisteminizde sağlanan yardımcı programları temel alarak birini seçin.

Komut Notlar
unix2dos -b INFILE Özgün dosya ile yedeklenmiştir. BAK uzantısı
tr -d '\r' < INFILE > OUTFILE OUTFILE yalnızca LF sonlarına sahip bir sürüm içeriyor
perl -pi -e 's/\r\n/\n/g' INFILE Dosyayı doğrudan değiştirir
sed 's/$'"/`echo \\\r`/" INFILE > OUTFILE OUTFILE yalnızca LF sonlarına sahip bir sürüm içerir.

Hata: line 1: #!/usr/bin/env: No such file or directory.

Neden: Bu hata, betik Bayt Sipariş İşareti (BOM) ile UTF-8 olarak kaydedildiğinde oluşur.

Çözüm: Dosyayı ürün reçetesi olmadan ASCII veya UTF-8 olarak kaydedin. Ayrıca, BOM olmadan bir dosya oluşturmak için Linux veya Unix sisteminde aşağıdaki komutu da kullanabilirsiniz:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

öğesini ÜRÜN REÇETESIni içeren dosyayla değiştirin INFILE . OUTFILE ürün reçetesi olmayan betiği içeren yeni bir dosya adı olmalıdır.

Sonraki adımlar