Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dowiedz się, jak używać funkcji zdefiniowanych przez użytkownika (UDF) Pythona z Apache Hive i Apache Pig w ramach Apache Hadoop na platformie Azure HDInsight.
Język Python w usłudze HDInsight
Python2.7 jest instalowane domyślnie na platformie HDInsight 3.0 i nowszych. Apache Hive może być używany z tą wersją języka Python do przetwarzania strumieniowego. Przetwarzanie strumieniowe używa STDOUT i STDIN do przekazywania danych między Hive a UDF (funkcją zdefiniowaną przez użytkownika).
Usługa HDInsight obejmuje również Jython, czyli implementację języka Python napisaną w języku Java. Jython działa bezpośrednio na maszynie wirtualnej Java i nie używa przesyłania strumieniowego. Jython jest zalecanym interpreterem Pythona przy używaniu go z 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 URI dla podstawowego magazynu klastrów. To byłoby
wasb://dla Azure Storage,abfs://dla 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 magazynowania, jeśli używasz rodzaju konta magazynu
BlobStorage. - Opcjonalny. Jeśli planujesz używać programu PowerShell, potrzebny jest zainstalowany moduł AZ.
Uwaga
Konto magazynu używane w tym artykule było usługą Azure Storage z włączonym bezpiecznym transferem i w ten sposób wasbs jest używane w całym artykule.
Konfiguracja usługi Storage
Nie jest wymagane żadne działanie, jeśli używane konto magazynu jest typu Storage (general purpose v1) lub StorageV2 (general purpose v2). Proces opisany w tym artykule generuje wynik co najmniej /tezstaging. Domyślna konfiguracja Hadoop zawiera /tezstaging w zmiennej fs.azure.page.blob.dir konfiguracji wewnątrz core-site.xml dla usługi HDFS. Ta konfiguracja powoduje, że dane wyjściowe do katalogu będą mieć formę stronicowych obiektów blob, które nie są obsługiwane w przypadku rodzaju konta magazynu BlobStorage. Aby użyć BlobStorage w tym artykule, usuń /tezstaging z konfiguracji zmiennej fs.azure.page.blob.dir. 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
scppolecenia lub dostarczonego skryptu programu PowerShell.
Jeśli chcesz korzystać z powłoki Azure Cloud Shell (bash) do pracy z usługą HDInsight, musisz:
- Utwórz skrypty w środowisku usługi Cloud Shell.
- Użyj polecenia
scp, aby przekazać pliki z usługi Cloud Shell do usługi HDInsight. - Użyj usługi
sshCloud Shell, aby nawiązać połączenie z usługą HDInsight i uruchomić przykłady.
UDF Apache Hive
Język Python może służyć jako funkcja UDF z programu Hive za pośrednictwem instrukcji HiveQL TRANSFORM . Na przykład następujący kod 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 filena początku pliku dodajehiveudf.pyplik do rozproszonej pamięci podręcznej, dzięki czemu jest dostępny dla wszystkich węzłów w klastrze. - Instrukcja
SELECT TRANSFORM ... USINGwybiera dane z elementuhivesampletable. Przekazuje również wartości clientid, devicemake i devicemodel do skryptuhiveudf.py. - Klauzula
ASopisuje pola zwrócone z elementuhiveudf.py.
Utwórz plik
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 ze 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 każdą wartością. W ten sposób
string.split(line, "\t")można podzielić dane wejściowe na każdym tabulatorze, 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
whilepowtarza się, dopókilinenie zostanie odczytane.
Dane wyjściowe skryptu to łączenie wartości wejściowych dla devicemake i devicemodel, oraz skrót wartości połączonych.
Przekazywanie pliku (powłoka)
Następujące polecenie zastępuje sshuser rzeczywistą nazwą użytkownika, jeśli jest inna. Zastąp mycluster nazwą klastra. Upewnij się, że katalog roboczy znajduje się w miejscu, w którym znajduje się plik.
Użyj polecenia
scp, aby skopiować pliki do klastra usługi HDInsight. Edytuj i wprowadź polecenie:scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:Nawiązywanie połączenia z klastrem przy użyciu protokołu SSH. Edytuj i wprowadź polecenie:
ssh sshuser@mycluster-ssh.azurehdinsight.netZ sesji SSH dodaj wcześniej przesłane pliki Python do pamięci masowej klastra.
hdfs dfs -put hiveudf.py /hiveudf.py
Użycie funkcji UDF Hive (shell)
Aby nawiązać połączenie z usługą 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 375ad9a0ddc4351536804f1d5d0ea9b9Aby zamknąć usługę 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ę tam, gdzie znajduje się 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 .
Użycie funkcji UDF w 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 jak w poniższym przykładzie:
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 służyć jako funkcja UDF w Pig za pomocą polecenia 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.
- Python jest procesem zewnętrznym, więc dane z systemu Pig w środowisku JVM są wysyłane do skryptu uruchomionego w procesie Pythona. Dane wyjściowe skryptu języka Python są wysyłane z powrotem do środowiska Pig.
Aby określić interpreter języka Python, użyj polecenia register podczas odwoływania się do skryptu języka Python. Poniższe przykłady rejestrują skrypty za pomocą języka Pig jako myfuncs:
-
Aby użyć programu 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 programu 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.logdanych do plikuLOGS. Definiuje również każdy rekord jakochararray. - Następny wiersz filtruje wszystkie wartości null, przechowując wynik operacji w pliku
LOG. - Następnie iteruje rekordy w
LOGi używaGENERATEdo wywołania metodycreate_structure, zawartej w skrypcie Python/Jython, który został załadowany jakomyfuncs.LINEsłuży do przekazywania bieżącego rekordu do funkcji. - Na koniec dane wyjściowe są zrzucane przy użyciu polecenia
DUMPdo STDOUT. To polecenie wyświetla wyniki po zakończeniu operacji.
Utwórz plik
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
@outputSchemadefiniuje format danych zwracanych do Pig. W takim przypadku jest to data bag, która jest typem danych w Pig. Worek zawiera następujące pola, wszystkie w formacie chararray (ciągi znaków):- date — data utworzenia wpisu dziennika
- time — czas utworzenia wpisu dziennika
- classname — nazwa klasy, dla której utworzono wpis
- poziom — poziom logowania
- detail — pełne szczegóły wpisu dziennika
Następnie
def create_structure(input)definiuje funkcję, do której Pig przekazuje elementy wiersza.Przykładowe dane
sample.logzwykle są zgodne ze schematem daty, godziny, klasy, poziomu i szczegółów. Zawiera jednak kilka wierszy rozpoczynających się od*java.lang.Exception*. Te wiersze muszą zostać zmodyfikowane, aby były zgodne ze schematem. Instrukcjaifsprawdza te dane, a następnie dostosowuje dane wejściowe, aby przenieść*java.lang.Exception*ciąg na koniec, dopasowując dane do oczekiwanego schematu danych wyjściowych.splitNastępnie polecenie służy do dzielenia danych na pierwsze cztery znaki spacji. Dane wyjściowe są przypisywane dodate, ,timeclassname,levelidetail.Na koniec wartości są zwracane do Pig.
Gdy dane są zwracane do Pig, mają spójny schemat zdefiniowany w instrukcji @outputSchema.
Przekazywanie pliku (powłoka)
W poniższych poleceniach zastąp sshuser rzeczywistą nazwą użytkownika, jeśli jest inna. Zastąp mycluster rzeczywistą nazwą klastra. Upewnij się, że katalog roboczy znajduje się w miejscu, w którym znajduje się plik.
Użyj polecenia
scp, aby skopiować pliki do klastra usługi HDInsight. Edytuj i wprowadź polecenie:scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:Nawiązywanie połączenia z klastrem przy użyciu protokołu SSH. Edytuj i wprowadź polecenie:
ssh sshuser@mycluster-ssh.azurehdinsight.netZ sesji SSH dodaj pliki języka Python przekazane wcześniej do magazynu dla klastra.
hdfs dfs -put pigudf.py /pigudf.py
Użyj Pig UDF (powłoka)
Aby nawiązać połączenie z usługą Pig, użyj następującego polecenia z otwartej sesji SSH:
pigWprowadź 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:
((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, aby zamknąć powłokę Grunt, a następnie edytuj plik pigudf.py w lokalnym systemie plików.nano pigudf.pyPo przejściu do edytora usuń komentarz z następującego wiersza, usuwając
#znak od początku wiersza:#from pig_util import outputSchemaTen wiersz modyfikuje skrypt języka Python do pracy z językiem C Python zamiast Jython. Po wprowadzeniu zmiany użyj Ctrl+X , aby zakończyć działanie edytora. 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 C Python.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 to miejsce, w którym znajduje się 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 UDF w języku Pig (PowerShell)
Uwaga
W przypadku 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 pigudf.py , użyj następującego skryptu 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.
Przyczyną tego problemu może być zakończenie wiersza w pliku języka Python. Wielu edytorów w systemie 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 programu PowerShell
Oba przykładowe skrypty PowerShell używane do uruchamiania przykładów zawierają komentowaną linię wyświetlającą wynik błędów zadania. Jeśli nie widzisz oczekiwanych danych wyjściowych dla zadania, odkomentuj poniższą linię i sprawdź, czy informacje o błędzie wskazują na 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ż zapisywane w pamięci przechowywania HDInsight.
| Dla tego zadania... | Przyjrzyj się tym plikom w kontenerze blob |
|---|---|
| Hive | /HivePython/stderr /HivePython/stdout |
| Świnia | /PigPython/stderr /PigPython/stdout |
Następne kroki
Jeśli musisz załadować moduły języka Python, które nie są dostarczane domyślnie, zobacz Jak wdrożyć moduł w usłudze Azure HDInsight.
Aby uzyskać informacje na temat korzystania z technologii Pig, Hive i korzystania z usługi MapReduce, zobacz następujące dokumenty: