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:
- Apache Hadoop sürümünü hedefleme
- İşletim Sistemi Sürümünü Hedefleme
- Betik kaynaklarına kararlı bağlantılar sağlama
- Önceden derlenmiş kaynakları kullanma
- Küme özelleştirme betiğinin bir kez etkili olduğundan emin olun
- Küme mimarisinin yüksek kullanılabilirliğini sağlama
- Azure Blob depolamayı kullanmak için özel bileşenleri yapılandırma
- STDOUT ve STDERR'ye bilgi yazma
- LF satır sonlarıyla dosyaları ASCII olarak kaydetme
- Geçici hatalardan kurtarmak için yeniden deneme mantığını kullanma
Önemli
Betik eylemlerinin 60 dakika içinde tamamlanması gerekir 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ızdakinden 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 farklılıklar olabilir. Örneğin, Ubuntu sürümüne bağlı bir ikili dosya 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 önceki sürümleri Upstart kullanan Ubuntu sürümlerini temel alır. 3.5 ve üzeri sürümler, kullanan Systemd
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ı belirlemeyi 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.
ile Upstart arasındaki Systemd
farkları anlamak için bkz Systemd
. Upstart kullanıcıları.
Betik kaynaklarına kararlı bağlantılar sağlama
Betiğin ve ilişkili kaynakların kümenin ömrü boyunca kullanılabilir durumda kalması gerekir. Ö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ırma süresini azaltmak için kaynak koddan kaynak derleyen işlemlerden kaçının. Örneğin, kaynakları önceden derleyin ve HDInsight ile aynı veri merkezinde bir Azure Depolama hesap 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.
Betik birden çok kez çalışıyorsa, yapılandırma dosyalarını değiştiren betik 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üğümüne de yüklemeyin.
Önemli
HDInsight kapsamında sağlanan hizmetler, gerektiğinde iki baş düğüm arasında yük devretme yapmak üzere tasarlanmıştır. Bu işlev, 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 Depolama 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ğıdaki 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, abfs:///example/jars
Data Lake Storage 2. Nesil 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 bkz . Betik eylemlerinde sorun giderme.
Ç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
. Örneğin:
echo "Getting ready to install Foo"
Varsayılan olarak, echo
dizeyi STDOUT'a gönderir. STDERR'ye yönlendirmek için önce echo
öğesini ekleyin>&2
. Örneğin:
>&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, SATıRLAR LF tarafından sonlandırılan 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ı indirdiğinizde, 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ğinizi geçici hatalara dayanıklı hale getirmek 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
Betiğinizde aşağıdaki yardımcılar 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ı) 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. Hatada boş bir dize döndürülür. |
get_primary_headnode |
Birincil baş düğümün tam etki alanı adını alır. Hatada boş bir dize döndürülür. |
get_secondary_headnode |
İkincil baş düğümün tam etki alanı adını alır. Hatada boş bir dize döndürülür. |
get_primary_headnode_number |
Birincil baş düğümün sayısal son ekini alır. Hatada boş bir dize döndürülür. |
get_secondary_headnode_number |
İkincil baş düğümün sayısal son ekini alır. Hatada boş bir dize döndürülür. |
Yaygın kullanım desenleri
Bu bölüm, kendi özel betiğinizi yazarken karşılaşabileceğiniz bazı yaygın kullanım desenlerini uygulama konusunda rehberlik sağlar.
Betiklere parametre geçirme
Bazı durumlarda, betiğiniz parametre gerektirebilir. Örneğin Ambari REST API'sini kullanırken küme için yönetici parolası gerekebilir.
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.
Betiklere 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şkeni ayarlama işlemi aşağıdaki deyimle gerçekleştirilir:
VARIABLENAME=value
Yukarıdaki örnekte değişkenin VARIABLENAME
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
Daha sonra bilgilere erişim için kullanabilirsiniz $PASSWORD
.
Betik içinde ayarlanan ortam değişkenleri yalnızca betik 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/environment
ekleyin. Ö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
Bir kümeyi özelleştirmek için kullanılan betiklerin aşağıdaki konumlardan birinde depolanması gerekir:
Kümeyle ilişkilendirilmiş bir Azure Depolama hesabı.
Kümeyle ilişkilendirilmiş 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şkilendirilmiş bir Azure Data Lake Depolama hesabı. HDInsight ile Azure Data Lake Depolama kullanma hakkında daha fazla bilgi için bkz. Hızlı Başlangıç: HDInsight'ta kümeleri ayarlama.
Not
HDInsight'ın Data Lake'e erişmek için kullandığı hizmet sorumlusu Depolama 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 Depolama depolamak, her ikisi de Azure ağı içinde 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 değişir. 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 Depolama için kullanınadl://
.
Betik eylemi dağıtma denetim listesi
Betik 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 için geçici bir dosya dizini /tmp kullanın ve betikler yürütüldükten sonra bunları temizleyin.
- İş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
Aşağıdaki yöntemleri kullanarak HDInsight kümelerini özelleştirmek için 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 file
ardından .
Neden: Bu hata, bir betikteki satırlar CRLF ile sona erdiğinde oluşur. Unix sistemleri, satır sonu olarak yalnızca LF'yi bekler.
Bu sorun genellikle betik bir Windows ortamında yazıldığında ortaya çıkar. CRLF, Windows'da birçok metin düzenleyicisi için yaygın olarak biten bir satırdır.
Çö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 bulunan yardımcı programları temel alarak birini seçin.
Command | 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: Betik Bayt Sipariş İşareti (BOM) ile UTF-8 olarak kaydedildiğinde bu hata oluşur.
Çözüm: Dosyayı ASCII olarak veya ürün reçetesi olmadan UTF-8 olarak kaydedin. Ayrıca, BIR Linux veya Unix sisteminde aşağıdaki komutu kullanarak BOM olmadan bir dosya oluşturabilirsiniz:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
değerini, ürün reçetesini içeren dosyayla değiştirin INFILE
. OUTFILE
, bom içermeyen betiği içeren yeni bir dosya adı olmalıdır.
Sonraki adımlar
- Betik eylemini kullanarak HDInsight kümelerini özelleştirmeyi öğrenin
- HDInsight'ı yöneten .NET uygulamaları oluşturma hakkında daha fazla bilgi edinmek için HDInsight .NET SDK başvurularını kullanın
- HDInsight kümelerinde yönetim eylemleri gerçekleştirmek için REST kullanmayı öğrenmek için HDInsight REST API'sini kullanın.