Używanie funkcji zdefiniowanych przez użytkownika języka Python (UDF) z usługami Apache Hive i Apache Pig w usłudze HDInsight
Dowiedz się, jak używać funkcji zdefiniowanych przez użytkownika w języku Python z usługami Apache Hive i Apache Pig w usłudze Apache Hadoop w usłudze Azure HDInsight.
Język Python w usłudze HDInsight
Python2.7
jest instalowany domyślnie w usłudze HDInsight 3.0 lub nowszym. Apache Hive można używać z tą wersją języka Python do przetwarzania strumieniowego. Przetwarzanie strumienia używa stDOUT i STDIN do przekazywania danych między hive i UDF.
Usługa HDInsight obejmuje również Jython, czyli implementację języka Python napisaną w języku Java. Program Jython działa bezpośrednio na maszynie wirtualnej Java i nie używa przesyłania strumieniowego. Jython jest zalecanym interpreterem języka Python podczas korzystania z języka Python z językiem Pig.
Wymagania wstępne
- Klaster Hadoop w usłudze HDInsight. Zobacz Wprowadzenie do usługi HDInsight w systemie Linux.
- Klient SSH. Aby uzyskać więcej informacji, zobacz Łączenie się z usługą HDInsight (Apache Hadoop) przy użyciu protokołu SSH.
-
Schemat identyfikatora URI dla magazynu podstawowego klastrów. Dotyczyłoby
wasb://
to usługi Azure Storage,abfs://
Azure Data Lake Storage Gen2 lub adl:// dla Azure Data Lake Storage Gen1. Jeśli bezpieczny transfer jest włączony dla usługi Azure Storage, identyfikator URI będzie wasbs://. Zobacz również bezpieczny transfer. - Możliwa zmiana konfiguracji magazynu. Zobacz Konfiguracja magazynu , jeśli używasz typu
BlobStorage
konta magazynu. - Opcjonalny. Jeśli planujesz użyć programu PowerShell, potrzebny jest moduł AZ .
Uwaga
Konto magazynu używane w tym artykule było usługą Azure Storage z włączonym bezpiecznym transferem , a tym samym wasbs
jest używane w całym artykule.
Konfiguracja usługi Storage
Nie jest wymagana żadna akcja, jeśli używane konto magazynu jest rodzajem Storage (general purpose v1)
lub StorageV2 (general purpose v2)
. Proces w tym artykule generuje dane wyjściowe co najmniej /tezstaging
. Domyślna konfiguracja hadoop zawiera /tezstaging
zmienną konfiguracji w core-site.xml
zmiennej fs.azure.page.blob.dir
dla usługi HDFS
. Ta konfiguracja powoduje, że dane wyjściowe katalogu mają być stronicowymi obiektami blob, które nie są obsługiwane w przypadku typu BlobStorage
konta magazynu. Aby użyć BlobStorage
tego artykułu, usuń /tezstaging
z zmiennej fs.azure.page.blob.dir
konfiguracji. Dostęp do konfiguracji można uzyskać z poziomu interfejsu użytkownika systemu Ambari. W przeciwnym razie zostanie wyświetlony komunikat o błędzie: Page blob is not supported for this account type.
Ostrzeżenie
Kroki opisane w tym dokumencie obejmują następujące założenia:
- Skrypty języka Python są tworzone w lokalnym środowisku projektowym.
- Skrypty są przekazywane do usługi HDInsight przy użyciu
scp
polecenia lub dostarczonego skryptu programu PowerShell.
Jeśli chcesz użyć usługi Azure Cloud Shell (bash) do pracy z usługą HDInsight, musisz:
- Utwórz skrypty w środowisku usługi Cloud Shell.
- Służy
scp
do przekazywania plików z usługi Cloud Shell do usługi HDInsight. - Użyj usługi
ssh
Cloud Shell, aby nawiązać połączenie z usługą HDInsight i uruchomić przykłady.
Apache Hive UDF
Język Python może być używany jako funkcja UDF z programu Hive za pośrednictwem instrukcji HiveQL TRANSFORM
. Na przykład następująca biblioteka HiveQL wywołuje hiveudf.py
plik przechowywany na domyślnym koncie usługi Azure Storage dla klastra.
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;
Oto co robi ten przykład:
- Instrukcja
add file
na początku pliku dodajehiveudf.py
plik do rozproszonej pamięci podręcznej, aby był dostępny dla wszystkich węzłów w klastrze. - Instrukcja
SELECT TRANSFORM ... USING
wybiera dane z elementuhivesampletable
. Przekazuje również wartości clientid, devicemake i devicemodel do skryptuhiveudf.py
. - Klauzula
AS
opisuje pola zwracane zhiveudf.py
elementu .
Tworzenie pliku
W środowisku projektowym utwórz plik tekstowy o nazwie hiveudf.py
. Użyj następującego kodu jako zawartości pliku:
#!/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()])
Ten skrypt wykonuje następujące akcje:
- Odczytuje wiersz danych z narzędzia STDIN.
- Końcowy znak nowego wiersza jest usuwany przy użyciu polecenia
string.strip(line, "\n ")
. - Podczas przetwarzania strumienia pojedynczy wiersz zawiera wszystkie wartości z znakiem tabulacji między poszczególnymi wartościami. Można więc
string.split(line, "\t")
użyć do podzielenia danych wejściowych na każdej karcie, zwracając tylko pola. - Po zakończeniu przetwarzania dane wyjściowe muszą być zapisywane w stDOUT jako pojedynczy wiersz z kartą między poszczególnymi polami. Na przykład
print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])
. - Pętla
while
powtarza się, dopóki nieline
zostanie odczytany.
Dane wyjściowe skryptu to łączenie wartości wejściowych dla devicemake
i devicemodel
, a skrót wartości połączonych.
Przekazywanie pliku (powłoka)
Poniższe polecenie zastępuje sshuser
rzeczywistą nazwę użytkownika, jeśli jest inna. Zastąp mycluster
wartość rzeczywistą nazwą klastra. Upewnij się, że katalog roboczy jest miejscem, w którym znajduje się plik.
Służy
scp
do kopiowania plików do klastra usługi HDInsight. Edytuj i wprowadź polecenie:scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Użyj protokołu SSH, aby nawiązać połączenie z klastrem. Edytuj i wprowadź polecenie:
ssh sshuser@mycluster-ssh.azurehdinsight.net
W sesji SSH dodaj pliki języka Python przekazane wcześniej do magazynu klastra.
hdfs dfs -put hiveudf.py /hiveudf.py
Korzystanie z funkcji UDF programu Hive (powłoka)
Aby nawiązać połączenie z programem Hive, użyj następującego polecenia z otwartej sesji SSH:
beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
To polecenie uruchamia klienta Beeline.
Wprowadź następujące zapytanie w
0: jdbc:hive2://headnodehost:10001/>
wierszu polecenia: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;
Po wprowadzeniu ostatniego wiersza zadanie powinno zostać uruchomione. Po zakończeniu zadania zwraca dane wyjściowe podobne do następującego przykładu:
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
Aby zamknąć platformę Beeline, wprowadź następujące polecenie:
!q
Przekazywanie pliku (PowerShell)
Program PowerShell może również służyć do zdalnego uruchamiania zapytań programu Hive. Upewnij się, że katalog roboczy znajduje się w miejscu hiveudf.py
. Użyj następującego skryptu programu PowerShell, aby uruchomić zapytanie programu Hive korzystające ze skryptu hiveudf.py
:
# 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
Uwaga
Aby uzyskać więcej informacji na temat przekazywania plików, zobacz dokument Przekazywanie danych dla zadań apache Hadoop w usłudze HDInsight .
Korzystanie z funkcji UDF programu Hive
# 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
Dane wyjściowe zadania Hive powinny wyglądać podobnie do następującego przykładu:
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
Skrypt języka Python może być używany jako funkcja UDF z usługi Pig za pomocą instrukcji GENERATE
. Skrypt można uruchomić przy użyciu języka Jython lub C Python.
- Jython działa na maszynie JVM i może być wywoływany natywnie z pig.
- Język C Python jest procesem zewnętrznym, więc dane z usługi Pig na maszynie JVM są wysyłane do skryptu uruchomionego w procesie języka Python. Dane wyjściowe skryptu języka Python są wysyłane z powrotem do języka Pig.
Aby określić interpreter języka Python, użyj polecenia podczas register
odwoływania się do skryptu języka Python. W poniższych przykładach zarejestrowano skrypty w języku Pig jako myfuncs
:
-
Aby użyć Jython:
register '/path/to/pigudf.py' using jython as myfuncs;
-
Aby użyć języka C Python:
register '/path/to/pigudf.py' using streaming_python as myfuncs;
Ważne
W przypadku korzystania z Jython ścieżka do pliku pig_jython może być ścieżką lokalną lub ścieżką WASBS://. Jednak w przypadku korzystania z języka C Python należy odwołać się do pliku w lokalnym systemie plików węzła, którego używasz do przesyłania zadania pig.
Po wcześniejszej rejestracji język Pig Latin dla tego przykładu jest taki sam dla obu:
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;
Oto co robi ten przykład:
- Pierwszy wiersz ładuje przykładowy plik
sample.log
danych doLOGS
pliku . Definiuje również każdy rekord jakochararray
. - Następny wiersz filtruje wszystkie wartości null, przechowując wynik operacji na
LOG
. - Następnie wykonuje iterację rekordów w pliku
LOG
i używaGENERATE
metody do wywołaniacreate_structure
metody zawartej w skryptycie języka Python/Jython załadowanym jakomyfuncs
.LINE
służy do przekazywania bieżącego rekordu do funkcji. - Na koniec dane wyjściowe są po cenach dumpingowych do STDOUT przy użyciu
DUMP
polecenia . To polecenie wyświetla wyniki po zakończeniu operacji.
Tworzenie pliku
W środowisku projektowym utwórz plik tekstowy o nazwie pigudf.py
. Użyj następującego kodu jako zawartości pliku:
# 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
W przykładzie Pig Latin dane wejściowe są definiowane jako chararray, LINE
ponieważ nie ma spójnego schematu dla danych wejściowych. Skrypt języka Python przekształca dane w spójny schemat danych wyjściowych.
Instrukcja
@outputSchema
definiuje format danych zwracanych do pig. W tym przypadku jest to torba danych, która jest typem danych pig. Torba zawiera następujące pola, z których wszystkie są chararray (ciągi):- date — data utworzenia wpisu dziennika
- time — czas utworzenia wpisu dziennika
- classname — nazwa klasy, dla którego utworzono wpis
- poziom — poziom dziennika
- szczegóły — pełne szczegóły wpisu dziennika
Następnie definiuje
def create_structure(input)
funkcję, do którą pig przekazuje elementy liniowe.Przykładowe dane, ,
sample.log
głównie są zgodne ze schematem daty, godziny, klasy, poziomu i szczegółów. Zawiera jednak kilka wierszy, które zaczynają się od*java.lang.Exception*
. Te wiersze muszą zostać zmodyfikowane, aby były zgodne ze schematem. Instrukcjaif
sprawdza te dane, a następnie masuje dane wejściowe, aby przenieść*java.lang.Exception*
ciąg na koniec, przenosząc dane zgodnie z oczekiwanym schematem danych wyjściowych.split
Następnie polecenie służy do dzielenia danych na pierwsze cztery znaki spacji. Dane wyjściowe są przypisywane dodate
, ,time
,classname
level
idetail
.Na koniec wartości są zwracane do świni.
Gdy dane są zwracane do usługi Pig, ma spójny schemat zdefiniowany w instrukcji @outputSchema
.
Przekazywanie pliku (powłoka)
W poniższych poleceniach zastąp wartość sshuser
rzeczywistą nazwą użytkownika, jeśli jest inna. Zastąp mycluster
wartość rzeczywistą nazwą klastra. Upewnij się, że katalog roboczy jest miejscem, w którym znajduje się plik.
Służy
scp
do kopiowania plików do klastra usługi HDInsight. Edytuj i wprowadź polecenie:scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Użyj protokołu SSH, aby nawiązać połączenie z klastrem. Edytuj i wprowadź polecenie:
ssh sshuser@mycluster-ssh.azurehdinsight.net
W sesji SSH dodaj pliki języka Python przekazane wcześniej do magazynu klastra.
hdfs dfs -put pigudf.py /pigudf.py
Używanie funkcji Pig UDF (powłoka)
Aby nawiązać połączenie z świnią, użyj następującego polecenia z otwartej sesji SSH:
pig
Wprowadź następujące instrukcje w
grunt>
wierszu polecenia: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;
Po wprowadzeniu następującego wiersza zadanie powinno zostać uruchomione. Po zakończeniu zadania zwraca dane wyjściowe podobne do następujących danych:
((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))
Użyj
quit
polecenia , aby zamknąć powłokę Grunt, a następnie użyć następującej opcji, aby edytować plik pigudf.py w lokalnym systemie plików:nano pigudf.py
W edytorze usuń komentarz z następującego wiersza, usuwając
#
znak od początku wiersza:#from pig_util import outputSchema
Ten wiersz modyfikuje skrypt języka Python do pracy z językiem C Python zamiast Jython. Po wprowadzeniu zmiany użyj klawiszy Ctrl+X , aby zamknąć edytor. Wybierz pozycję Y, a następnie wprowadź, aby zapisać zmiany.
Użyj polecenia ,
pig
aby ponownie uruchomić powłokę. Po wyświetleniu monitu użyj następującegogrunt>
polecenia, aby uruchomić skrypt języka Python przy użyciu interpretera języka Python języka C.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;
Po zakończeniu tego zadania powinny zostać wyświetlone te same dane wyjściowe co w przypadku wcześniejszego uruchomienia skryptu przy użyciu środowiska Jython.
Przekazywanie pliku (PowerShell)
Program PowerShell może również służyć do zdalnego uruchamiania zapytań programu Hive. Upewnij się, że katalog roboczy znajduje się w miejscu pigudf.py
. Użyj następującego skryptu programu PowerShell, aby uruchomić zapytanie programu Hive korzystające ze skryptu pigudf.py
:
# 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
Korzystanie z funkcji Pig UDF (PowerShell)
Uwaga
Podczas zdalnego przesyłania zadania przy użyciu programu PowerShell nie można użyć języka C Python jako interpretera.
Program PowerShell może również służyć do uruchamiania zadań Pig Latin. Aby uruchomić zadanie Pig Latin używające skryptu, użyj następującego skryptu pigudf.py
programu PowerShell:
# 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
Dane wyjściowe zadania Pig powinny wyglądać podobnie do następujących danych:
((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))
Rozwiązywanie problemów
Błędy podczas uruchamiania zadań
Podczas uruchamiania zadania hive może wystąpić błąd podobny do następującego tekstu:
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.
Ten problem może być spowodowany przez zakończenie wiersza w pliku języka Python. Wiele edytorów systemu Windows domyślnie używa crLF jako zakończenia wiersza, ale aplikacje systemu Linux zwykle oczekują LF.
Następujące instrukcje programu PowerShell umożliwiają usunięcie znaków CR przed przekazaniem pliku do usługi HDInsight:
Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."
# Wait for completion or failure of specified job
Skrypty środowiska PowerShell
Oba przykładowe skrypty programu PowerShell używane do uruchamiania przykładów zawierają wiersz komentarza, który wyświetla dane wyjściowe błędu dla zadania. Jeśli nie widzisz oczekiwanych danych wyjściowych zadania, usuń komentarz z następującego wiersza i sprawdź, czy informacje o błędzie wskazują problem.
$activity="Pig job"
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."
Informacje o błędzie (STDERR) i wynik zadania (STDOUT) są również rejestrowane w magazynie usługi HDInsight.
Dla tego zadania... | Przyjrzyj się tym plikom w kontenerze obiektów blob |
---|---|
Hive | /HivePython/stderr /HivePython/stdout |
Pig | /PigPython/stderr /PigPython/stdout |
Następne kroki
Jeśli musisz załadować moduły języka Python, które nie są domyślnie udostępniane, zobacz How to deploy a module to Azure HDInsight (Jak wdrożyć moduł w usłudze Azure HDInsight).
Aby dowiedzieć się więcej na temat korzystania z technologii Pig, Hive i korzystania z usługi MapReduce, zobacz następujące dokumenty:
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla