HDInsight'ta Apache Hive ve Apache Pig ile Python Kullanıcı Tanımlı İşlevleri (UDF) kullanma
Azure HDInsight üzerinde Apache Hadoop'ta Apache Hive ve Apache Pig ile Python kullanıcı tanımlı işlevleri (UDF) kullanmayı öğrenin.
HDInsight üzerinde Python
Python2.7
, HDInsight 3.0 ve sonraki sürümlerde varsayılan olarak yüklenir. Apache Hive, akış işleme için Python'ın bu sürümüyle kullanılabilir. Akış işleme, Hive ile UDF arasında veri geçirmek için STDOUT ve STDIN kullanır.
HDInsight, Java dilinde yazılmış bir Python uygulaması olan Jython'u da içerir. Jython doğrudan Java Sanal Makinesi üzerinde çalışır ve akış kullanmaz. Python'u Pig ile kullanırken önerilen Python yorumlayıcısı Jython'dır.
Önkoşullar
- HDInsight üzerinde hadoop kümesi. Bkz . Linux'ta HDInsight'ı kullanmaya başlama.
- Bir SSH istemcisi. Daha fazla bilgi için bkz. SSH kullanarak HDInsight'a (Apache Hadoop) bağlanma.
- Kümelerinizin birincil depolama alanı için URI şeması.
wasb://
Bu, Azure Depolama için,abfs://
Azure Data Lake Storage 1. Nesil için Azure Data Lake Storage 2. Nesil veya adl:// içindir. Azure Depolama için güvenli aktarım etkinleştirilirse URI wasbs://. Ayrıca bkz. güvenli aktarım. - Depolama yapılandırmasında olası değişiklik. Depolama hesabı türünü kullanıyorsanız bkz. Depolama yapılandırması.
BlobStorage
- isteğe bağlı. PowerShell kullanmayı planlıyorsanız AZ modülünün yüklü olması gerekir.
Not
Bu makalede kullanılan depolama hesabı, güvenli aktarımın etkinleştirildiği Azure Depolama'dır ve bu nedenle wasbs
makale boyunca kullanılır.
Depolama yapılandırması
Kullanılan depolama hesabı veya StorageV2 (general purpose v2)
türündeyse Storage (general purpose v1)
herhangi bir eylem gerekmez. Bu makaledeki işlem en az /tezstaging
için çıkış oluşturur. Varsayılan hadoop yapılandırması, hizmeti için içindeki yapılandırma değişkeninde core-site.xml
bulunur /tezstaging
fs.azure.page.blob.dir
.HDFS
Bu yapılandırma, dizinin çıktısının depolama hesabı türü BlobStorage
için desteklenmeyen sayfa blobları olmasını sağlar. Bu makalede kullanmak BlobStorage
için yapılandırma değişkeninden fs.azure.page.blob.dir
kaldırın/tezstaging
. Yapılandırmaya Ambari kullanıcı arabiriminden erişilebilir. Aksi takdirde şu hata iletisini alırsınız: Page blob is not supported for this account type.
Uyarı
Bu belgedeki adımlar aşağıdaki varsayımları yapar:
- Python betiklerini yerel geliştirme ortamınızda oluşturursunuz.
- Komut dosyalarını HDInsight'a yüklemek için komutunu veya sağlanan PowerShell betiğini kullanın
scp
.
HDInsight ile çalışmak için Azure Cloud Shell'i (bash) kullanmak istiyorsanız şunları gerçekleştirmelisiniz:
- Betikleri cloud shell ortamında oluşturun.
- Dosyaları cloud shell'den HDInsight'a yüklemek için kullanın
scp
. - HDInsight'a bağlanmak ve örnekleri çalıştırmak için cloud shell'den kullanın
ssh
.
Apache Hive UDF
Python, HiveQL TRANSFORM
deyimi aracılığıyla Hive'dan UDF olarak kullanılabilir. Örneğin, aşağıdaki HiveQL küme için varsayılan Azure Depolama hesabında depolanan dosyayı çağırır hiveudf.py
.
add file wasbs:///hiveudf.py;
SELECT TRANSFORM (clientid, devicemake, devicemodel)
USING 'python hiveudf.py' AS
(clientid string, phoneLabel string, phoneHash string)
FROM hivesampletable
ORDER BY clientid LIMIT 50;
Bu örnek şunları yapar:
- Dosyanın
add file
başındaki deyimi, dosyayı dağıtılmış önbelleğe eklerhiveudf.py
, böylece kümedeki tüm düğümler tarafından erişilebilir. SELECT TRANSFORM ... USING
deyimi, içindenhivesampletable
veri seçer. Ayrıca clientid, devicemake ve devicemodel değerlerini betikehiveudf.py
geçirir.AS
yan tümcesi, 'denhiveudf.py
döndürülen alanları açıklar.
Dosya oluşturma
Geliştirme ortamınızda adlı hiveudf.py
bir metin dosyası oluşturun. Dosyanın içeriği olarak aşağıdaki kodu kullanın:
#!/usr/bin/env python
import sys
import string
import hashlib
while True:
line = sys.stdin.readline()
if not line:
break
line = string.strip(line, "\n ")
clientid, devicemake, devicemodel = string.split(line, "\t")
phone_label = devicemake + ' ' + devicemodel
print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])
Bu betik aşağıdaki eylemleri gerçekleştirir:
- STDIN'den bir veri satırı okur.
- Sondaki yeni satır karakteri kullanılarak
string.strip(line, "\n ")
kaldırılır. - Akış işleme yaparken tek bir satır, her değer arasında sekme karakteri olan tüm değerleri içerir. Bu nedenle
string.split(line, "\t")
, her sekmedeki girişi bölmek ve yalnızca alanları döndürmek için kullanılabilir. - İşleme tamamlandığında, çıktının stdout'a tek bir satır olarak yazılması ve her alanın arasında bir sekme olması gerekir. Örneğin,
print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])
. - Döngü
while
, hayırline
okunana kadar yineleniyor.
Betik çıktısı ve devicemodel
için devicemake
giriş değerlerinin birleştirilmiş bir sonucudur ve birleştirilmiş değerin karmasıdır.
Karşıya dosya yükleme (kabuk)
Aşağıdaki komutun sshuser
yerine farklıysa gerçek kullanıcı adı yer alır. değerini gerçek küme adıyla değiştirin mycluster
. Çalışma dizininizin dosyanın bulunduğu yerde olduğundan emin olun.
Dosyaları HDInsight kümenize kopyalamak için kullanın
scp
. Komutunu düzenleyin ve girin:scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Kümeye bağlanmak için SSH kullanın. Komutunu düzenleyin ve girin:
ssh sshuser@mycluster-ssh.azurehdinsight.net
SSH oturumundan, daha önce karşıya yüklenen Python dosyalarını kümenin depolama alanına ekleyin.
hdfs dfs -put hiveudf.py /hiveudf.py
Hive UDF (kabuk) kullanma
Hive'a bağlanmak için açık SSH oturumunuzdan aşağıdaki komutu kullanın:
beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
Bu komut Beeline istemcisini başlatır.
İstemde aşağıdaki sorguyu
0: jdbc:hive2://headnodehost:10001/>
girin:add file wasbs:///hiveudf.py; SELECT TRANSFORM (clientid, devicemake, devicemodel) USING 'python hiveudf.py' AS (clientid string, phoneLabel string, phoneHash string) FROM hivesampletable ORDER BY clientid LIMIT 50;
Son satır girildikten sonra işin başlaması gerekir. İş tamamlandıktan sonra aşağıdaki örneğe benzer bir çıkış döndürür:
100041 RIM 9650 d476f3687700442549a83fac4560c51c 100041 RIM 9650 d476f3687700442549a83fac4560c51c 100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9 100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9 100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9
Beeline'dan çıkmak için aşağıdaki komutu girin:
!q
Dosyayı karşıya yükleme (PowerShell)
PowerShell, Hive sorgularını uzaktan çalıştırmak için de kullanılabilir. Çalışma dizininizin bulunduğu yerde hiveudf.py
olduğundan emin olun. Betiği kullanan hiveudf.py
bir Hive sorgusu çalıştırmak için aşağıdaki PowerShell betiğini kullanın:
# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
Connect-AzAccount
}
# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"
# Revise file path as needed
$pathToStreamingFile = ".\hiveudf.py"
# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
$resourceGroup = $clusterInfo.ResourceGroup
$storageAccountName=$clusterInfo.DefaultStorageAccount.split('.')[0]
$container=$clusterInfo.DefaultStorageContainer
$storageAccountKey=(Get-AzStorageAccountKey `
-ResourceGroupName $resourceGroup `
-Name $storageAccountName)[0].Value
# Create an Azure Storage context
$context = New-AzStorageContext `
-StorageAccountName $storageAccountName `
-StorageAccountKey $storageAccountKey
# Upload local files to an Azure Storage blob
Set-AzStorageBlobContent `
-File $pathToStreamingFile `
-Blob "hiveudf.py" `
-Container $container `
-Context $context
Not
Dosyaları karşıya yükleme hakkında daha fazla bilgi için HDInsight'ta Apache Hadoop işleri için verileri karşıya yükleme belgesine bakın.
Hive UDF kullanma
# Script should stop on failures
$ErrorActionPreference = "Stop"
# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
Connect-AzAccount
}
# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"
# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$creds=Get-Credential -UserName "admin" -Message "Enter the login for the cluster"
$HiveQuery = "add file wasbs:///hiveudf.py;" +
"SELECT TRANSFORM (clientid, devicemake, devicemodel) " +
"USING 'python hiveudf.py' AS " +
"(clientid string, phoneLabel string, phoneHash string) " +
"FROM hivesampletable " +
"ORDER BY clientid LIMIT 50;"
# Create Hive job object
$jobDefinition = New-AzHDInsightHiveJobDefinition `
-Query $HiveQuery
# For status bar updates
$activity="Hive query"
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting query..."
# Start defined Azure HDInsight job on specified cluster.
$job = Start-AzHDInsightJob `
-ClusterName $clusterName `
-JobDefinition $jobDefinition `
-HttpCredential $creds
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Waiting on query to complete..."
# Wait for completion or failure of specified job
Wait-AzHDInsightJob `
-JobId $job.JobId `
-ClusterName $clusterName `
-HttpCredential $creds
# Uncomment the following to see stderr output
<#
Get-AzHDInsightJobOutput `
-Clustername $clusterName `
-JobId $job.JobId `
-HttpCredential $creds `
-DisplayOutputType StandardError
#>
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Retrieving output..."
# Gets the log output
Get-AzHDInsightJobOutput `
-Clustername $clusterName `
-JobId $job.JobId `
-HttpCredential $creds
Hive işinin çıktısı aşağıdaki örneğe benzer şekilde görünmelidir:
100041 RIM 9650 d476f3687700442549a83fac4560c51c
100041 RIM 9650 d476f3687700442549a83fac4560c51c
100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9
100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9
100042 Apple iPhone 4.2.x 375ad9a0ddc4351536804f1d5d0ea9b9
Apache Pig UDF
Python betiği, deyimi aracılığıyla GENERATE
Pig'den UDF olarak kullanılabilir. Betiği Jython veya C Python kullanarak çalıştırabilirsiniz.
- Jython, JVM üzerinde çalışır ve pig'den yerel olarak çağrılabilir.
- C Python bir dış işlemdir, bu nedenle JVM'deki Pig verileri python işleminde çalıştırılan betike gönderilir. Python betiğinin çıkışı Pig'e geri gönderilir.
Python yorumlayıcısını belirtmek için Python betiğine başvururken kullanın register
. Aşağıdaki örnekler Pig ile betikleri olarak myfuncs
kaydeder:
- Jython kullanmak için:
register '/path/to/pigudf.py' using jython as myfuncs;
- C Python kullanmak için:
register '/path/to/pigudf.py' using streaming_python as myfuncs;
Önemli
Jython kullanırken, pig_jython dosyasının yolu yerel bir yol veya WASBS:// yolu olabilir. Ancak, C Python kullanırken Pig işini göndermek için kullandığınız düğümün yerel dosya sistemindeki bir dosyaya başvurmanız gerekir.
Kaydı geçtikten sonra, bu örneğin Pig Latin'i her ikisi için de aynıdır:
LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray);
LOG = FILTER LOGS by LINE is not null;
DETAILS = FOREACH LOG GENERATE myfuncs.create_structure(LINE);
DUMP DETAILS;
Bu örnek şunları yapar:
- İlk satır,
sample.log
örnek veri dosyasını içineLOGS
yükler. Ayrıca her kaydı olarakchararray
tanımlar. - Sonraki satır, tüm null değerleri filtreler ve işlemin sonucunu içine
LOG
depolar. - Ardından içindeki kayıtları
LOG
yineler ve olarakmyfuncs
yüklenen Python/Jython betiğinde bulunan yöntemi çağırmakcreate_structure
için kullanırGENERATE
.LINE
geçerli kaydı işleve geçirmek için kullanılır. - Son olarak, çıkışlar komutu kullanılarak STDOUT'a
DUMP
atılır. Bu komut, işlem tamamlandıktan sonra sonuçları görüntüler.
Dosya oluşturma
Geliştirme ortamınızda adlı pigudf.py
bir metin dosyası oluşturun. Dosyanın içeriği olarak aşağıdaki kodu kullanın:
# Uncomment the following if using C Python
#from pig_util import outputSchema
@outputSchema("log: {(date:chararray, time:chararray, classname:chararray, level:chararray, detail:chararray)}")
def create_structure(input):
if (input.startswith('java.lang.Exception')):
input = input[21:len(input)] + ' - java.lang.Exception'
date, time, classname, level, detail = input.split(' ', 4)
return date, time, classname, level, detail
Pig Latin örneğinde giriş, LINE
giriş için tutarlı bir şema olmadığından chararray olarak tanımlanır. Python betiği verileri çıktı için tutarlı bir şemaya dönüştürür.
deyimi Pig'e
@outputSchema
döndürülen verilerin biçimini tanımlar. Bu durumda, bu bir Pig veri türü olan bir veri paketidir. Çanta, tümü chararray (dizeler) olan aşağıdaki alanları içerir:- date - Günlük girişinin oluşturulduğu tarih
- time - Günlük girişinin oluşturulduğu saat
- classname - girdinin oluşturulduğu sınıf adı
- level - günlük düzeyi
- detail - Günlük girdisinin ayrıntılı ayrıntıları
Ardından, Pig'in
def create_structure(input)
satır öğelerini geçirdiği işlevi tanımlar.Örnek veriler,
sample.log
çoğunlukla tarih, saat, sınıf adı, düzey ve ayrıntı şemasına uygundur. Ancak, ile*java.lang.Exception*
başlayan birkaç satır içerir. Bu satırlar şemayla eşleşecek şekilde değiştirilmelidir. deyimiif
bunları denetler, ardından dizeyi sonuna taşımak*java.lang.Exception*
için giriş verilerine masaj gerçekleştirir ve verileri beklenen çıkış şemasıyla uyumlu bir şekilde getirir.Ardından,
split
ilk dört boşluk karakterindeki verileri bölmek için komutu kullanılır. Çıkış , ,time
,classname
level
vedetail
içinedate
atanır.Son olarak, değerler Pig'e döndürülür.
Veriler Pig'e döndürülürken, deyiminde tanımlandığı gibi tutarlı bir şemaya @outputSchema
sahiptir.
Karşıya dosya yükleme (kabuk)
Aşağıdaki komutlarda değerini farklıysa gerçek kullanıcı adıyla değiştirin sshuser
. değerini gerçek küme adıyla değiştirin mycluster
. Çalışma dizininizin dosyanın bulunduğu yerde olduğundan emin olun.
Dosyaları HDInsight kümenize kopyalamak için kullanın
scp
. Komutunu düzenleyin ve girin:scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Kümeye bağlanmak için SSH kullanın. Komutunu düzenleyin ve girin:
ssh sshuser@mycluster-ssh.azurehdinsight.net
SSH oturumundan, daha önce karşıya yüklenen Python dosyalarını kümenin depolama alanına ekleyin.
hdfs dfs -put pigudf.py /pigudf.py
Pig UDF kullanma (kabuk)
Pig'e bağlanmak için açık SSH oturumunuzdan aşağıdaki komutu kullanın:
pig
İstemde aşağıdaki deyimleri
grunt>
girin:Register wasbs:///pigudf.py using jython as myfuncs; LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray); LOG = FILTER LOGS by LINE is not null; DETAILS = foreach LOG generate myfuncs.create_structure(LINE); DUMP DETAILS;
Aşağıdaki satırı girdikten sonra işin başlaması gerekir. İş tamamlandıktan sonra aşağıdaki verilere benzer bir çıktı döndürür:
((2012-02-03,20:11:56,SampleClass5,[TRACE],verbose detail for id 990982084)) ((2012-02-03,20:11:56,SampleClass7,[TRACE],verbose detail for id 1560323914)) ((2012-02-03,20:11:56,SampleClass8,[DEBUG],detail for id 2083681507)) ((2012-02-03,20:11:56,SampleClass3,[TRACE],verbose detail for id 1718828806)) ((2012-02-03,20:11:56,SampleClass3,[INFO],everything normal for id 530537821))
quit
Grunt kabuğundan çıkmak için kullanın ve ardından yerel dosya sistemindeki pigudf.py dosyasını düzenlemek için aşağıdakileri kullanın:nano pigudf.py
Düzenleyiciye girdikten sonra, karakteri satırın başından kaldırarak
#
aşağıdaki satırın açıklamalarını kaldırın:#from pig_util import outputSchema
Bu satır, Python betiğini Jython yerine C Python ile çalışacak şekilde değiştirir. Değişiklik yapıldıktan sonra düzenleyiciden çıkmak için Ctrl+X tuşlarını kullanın. Değişiklikleri kaydetmek için Y'yi ve ardından Enter tuşuna basın.
pig
Kabuğu yeniden başlatmak için komutunu kullanın. İstemde olduğunuzdagrunt>
, C Python yorumlayıcısını kullanarak Python betiğini çalıştırmak için aşağıdakileri kullanın.Register 'pigudf.py' using streaming_python as myfuncs; LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray); LOG = FILTER LOGS by LINE is not null; DETAILS = foreach LOG generate myfuncs.create_structure(LINE); DUMP DETAILS;
Bu iş tamamlandıktan sonra, daha önce Jython kullanarak betiği çalıştırdığınızla aynı çıkışı görmeniz gerekir.
Dosyayı karşıya yükleme (PowerShell)
PowerShell, Hive sorgularını uzaktan çalıştırmak için de kullanılabilir. Çalışma dizininizin bulunduğu yerde pigudf.py
olduğundan emin olun. Betiği kullanan pigudf.py
bir Hive sorgusu çalıştırmak için aşağıdaki PowerShell betiğini kullanın:
# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
Connect-AzAccount
}
# If you have multiple subscriptions, set the one to use
# Select-AzSubscription -SubscriptionId "<SUBSCRIPTIONID>"
# Revise file path as needed
$pathToJythonFile = ".\pigudf.py"
# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
$resourceGroup = $clusterInfo.ResourceGroup
$storageAccountName=$clusterInfo.DefaultStorageAccount.split('.')[0]
$container=$clusterInfo.DefaultStorageContainer
$storageAccountKey=(Get-AzStorageAccountKey `
-ResourceGroupName $resourceGroup `
-Name $storageAccountName)[0].Value
# Create an Azure Storage context
$context = New-AzStorageContext `
-StorageAccountName $storageAccountName `
-StorageAccountKey $storageAccountKey
# Upload local files to an Azure Storage blob
Set-AzStorageBlobContent `
-File $pathToJythonFile `
-Blob "pigudf.py" `
-Container $container `
-Context $context
Pig UDF (PowerShell) kullanma
Not
PowerShell kullanarak bir işi uzaktan gönderirken, yorumlayıcı olarak C Python kullanmak mümkün değildir.
PowerShell, Pig Latin işlerini çalıştırmak için de kullanılabilir. Betiği kullanan pigudf.py
bir Pig Latin işi çalıştırmak için aşağıdaki PowerShell betiğini kullanın:
# Script should stop on failures
$ErrorActionPreference = "Stop"
# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
Connect-AzAccount
}
# Get cluster info
$clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
$creds=Get-Credential -UserName "admin" -Message "Enter the login for the cluster"
$PigQuery = "Register wasbs:///pigudf.py using jython as myfuncs;" +
"LOGS = LOAD 'wasbs:///example/data/sample.log' as (LINE:chararray);" +
"LOG = FILTER LOGS by LINE is not null;" +
"DETAILS = foreach LOG generate myfuncs.create_structure(LINE);" +
"DUMP DETAILS;"
# Create Pig job object
$jobDefinition = New-AzHDInsightPigJobDefinition -Query $PigQuery
# For status bar updates
$activity="Pig job"
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."
# Start defined Azure HDInsight job on specified cluster.
$job = Start-AzHDInsightJob `
-ClusterName $clusterName `
-JobDefinition $jobDefinition `
-HttpCredential $creds
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."
# Wait for completion or failure of specified job
Wait-AzHDInsightJob `
-Job $job.JobId `
-ClusterName $clusterName `
-HttpCredential $creds
# Uncomment the following to see stderr output
<#
Get-AzHDInsightJobOutput `
-Clustername $clusterName `
-JobId $job.JobId `
-HttpCredential $creds `
-DisplayOutputType StandardError
#>
# Progress bar (optional)
Write-Progress -Activity $activity "Retrieving output..."
# Gets the log output
Get-AzHDInsightJobOutput `
-Clustername $clusterName `
-JobId $job.JobId `
-HttpCredential $creds
Pig işinin çıktısı aşağıdaki verilere benzer şekilde görünmelidir:
((2012-02-03,20:11:56,SampleClass5,[TRACE],verbose detail for id 990982084))
((2012-02-03,20:11:56,SampleClass7,[TRACE],verbose detail for id 1560323914))
((2012-02-03,20:11:56,SampleClass8,[DEBUG],detail for id 2083681507))
((2012-02-03,20:11:56,SampleClass3,[TRACE],verbose detail for id 1718828806))
((2012-02-03,20:11:56,SampleClass3,[INFO],everything normal for id 530537821))
Sorun giderme
İşleri çalıştırırken oluşan hatalar
Hive işini çalıştırırken aşağıdaki metne benzer bir hatayla karşılaşabilirsiniz:
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: [Error 20001]: An error occurred while reading or writing to your custom script. It may have crashed with an error.
Bu sorun Python dosyasındaki satır sonlarından kaynaklanıyor olabilir. Birçok Windows düzenleyicisi, satır sonu olarak CRLF'yi varsayılan olarak kullanır, ancak Linux uygulamaları genellikle LF bekler.
Dosyayı HDInsight'a yüklemeden önce CR karakterlerini kaldırmak için aşağıdaki PowerShell deyimlerini kullanabilirsiniz:
Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."
# Wait for completion or failure of specified job
PowerShell komut dosyaları
Örnekleri çalıştırmak için kullanılan örnek PowerShell betiklerinin her ikisi de işin hata çıkışını görüntüleyen bir açıklama satırı içerir. İş için beklenen çıkışı görmüyorsanız aşağıdaki satırın açıklamasını kaldırın ve hata bilgilerinin bir sorun olup olmadığını görün.
$activity="Pig job"
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."
Hata bilgileri (STDERR) ve işin sonucu da (STDOUT) HDInsight depolama alanınıza kaydedilir.
Bu iş için... | Blob kapsayıcısında bu dosyalara bakın |
---|---|
Hive | /HivePython/stderr /HivePython/stdout |
Pig | /PigPython/stderr /PigPython/stdout |
Sonraki adımlar
Varsayılan olarak sağlanmayan Python modüllerini yüklemeniz gerekiyorsa bkz . Azure HDInsight'a modül dağıtma.
Pig, Hive kullanmanın diğer yolları ve MapReduce kullanma hakkında bilgi edinmek için aşağıdaki belgelere bakın: