Udostępnij za pośrednictwem


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 program jest instalowany domyślnie w usłudze HDInsight 3.0 i nowszych wersjach. Apache Hive może być używany z tą wersją języka Python do przetwarzania strumieniowego. Przetwarzanie strumienia używa funkcji STDOUT i STDIN do przekazywania danych między usługą Hive i 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 języka Python podczas korzystania z języka Python z językiem Pig.

Wymagania wstępne

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 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 usługi Hadoop zawiera /tezstaging zmienną fs.azure.page.blob.dir konfiguracji w core-site.xml programie dla usługi HDFS. Ta konfiguracja powoduje, że dane wyjściowe katalogu będą stronicowymi obiektami blob, które nie są obsługiwane w przypadku typu BlobStoragekonta magazynu. Aby użyć BlobStorage tego artykułu, usuń /tezstaging ze 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ć 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 ssh Cloud Shell, aby nawiązać połączenie z usługą HDInsight i uruchomić przykłady.

Funkcja zdefiniowana przez użytkownika usługi 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:

  1. Instrukcja add file na początku pliku dodaje hiveudf.py plik do rozproszonej pamięci podręcznej, dzięki czemu jest dostępny dla wszystkich węzłów w klastrze.
  2. Instrukcja SELECT TRANSFORM ... USING wybiera dane z elementu hivesampletable. Przekazuje również wartości clientid, devicemake i devicemodel do skryptu hiveudf.py .
  3. Klauzula AS opisuje pola zwrócone z hiveudf.pyelementu .

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:

  1. Odczytuje wiersz danych ze stDIN.
  2. Końcowy znak nowego wiersza jest usuwany przy użyciu polecenia string.strip(line, "\n ").
  3. Podczas przetwarzania strumienia pojedynczy wiersz zawiera wszystkie wartości z znakiem tabulacji między każdą wartością. Dzięki temu string.split(line, "\t") można podzielić dane wejściowe na każdej karcie, zwracając tylko pola.
  4. 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()]).
  5. Pętla while powtarza się, dopóki nie line zostanie odczytany.

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 ciąg rzeczywistą nazwą klastra. Upewnij się, że katalog roboczy znajduje się w miejscu, w którym znajduje się plik.

  1. Użyj polecenia scp , aby skopiować pliki do klastra usługi HDInsight. Edytuj i wprowadź polecenie:

    scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Nawiązywanie połączenia z klastrem przy użyciu protokołu SSH. Edytuj i wprowadź polecenie:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Z sesji SSH dodaj pliki języka Python przekazane wcześniej do magazynu dla klastra.

    hdfs dfs -put hiveudf.py /hiveudf.py
    

Korzystanie z funkcji zdefiniowanej przez użytkownika programu Hive (powłoka)

  1. 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.

  2. 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;
    
  3. 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
    
  4. Aby 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 hiveudf.py się w miejscu. 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 zdefiniowanej przez użytkownika 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 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 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 ś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:

  1. Pierwszy wiersz ładuje przykładowy plik sample.log danych do pliku LOGS. Definiuje również każdy rekord jako chararray.
  2. Następny wiersz filtruje wszystkie wartości null, przechowując wynik operacji w pliku LOG.
  3. Następnie iteruje rekordy w LOG pliku i używa GENERATE metody do wywoływania create_structure metody zawartej w skryptycie Python/Jython załadowanym jako myfuncs. LINE służy do przekazywania bieżącego rekordu do funkcji.
  4. 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.

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.

  1. Instrukcja @outputSchema definiuje format danych zwracanych do pig. W takim przypadku jest to torba danych, która jest typem danych Pig. Worek 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órej utworzono wpis
    • poziom — poziom dziennika
    • detail — pełne szczegóły wpisu dziennika
  2. Następnie definiuje funkcję, def create_structure(input) do którą pig przekazuje elementy wiersza.

  3. 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. Instrukcja if 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.

  4. split Następnie polecenie służy do dzielenia danych na pierwsze cztery znaki spacji. Dane wyjściowe są przypisywane do date, , timeclassname, leveli detail.

  5. Na koniec wartości są zwracane do pig.

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 sshuser rzeczywistą nazwą użytkownika, jeśli jest inna. Zastąp mycluster ciąg rzeczywistą nazwą klastra. Upewnij się, że katalog roboczy znajduje się w miejscu, w którym znajduje się plik.

  1. Użyj polecenia scp , aby skopiować pliki do klastra usługi HDInsight. Edytuj i wprowadź polecenie:

    scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Nawiązywanie połączenia z klastrem przy użyciu protokołu SSH. Edytuj i wprowadź polecenie:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Z sesji SSH dodaj pliki języka Python przekazane wcześniej do magazynu dla klastra.

    hdfs dfs -put pigudf.py /pigudf.py
    

Korzystanie z funkcji zdefiniowanej przez użytkownika pig (powłoka)

  1. Aby nawiązać połączenie z usługą Pig, użyj następującego polecenia z otwartej sesji SSH:

    pig
    
  2. 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;
    
  3. 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))
    
  4. Użyj quit polecenia , aby zamknąć powłokę Grunt, a następnie użyj następującego polecenia, aby edytować plik pigudf.py w lokalnym systemie plików:

    nano pigudf.py
    
  5. Po przejściu do edytora 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 Ctrl+X , aby zakończyć działanie edytora. Wybierz pozycję Y, a następnie wprowadź, aby zapisać zmiany.

  6. pig Użyj polecenia , aby ponownie uruchomić powłokę. Po wyświetleniu monitu użyj następującego grunt> 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 znajduje pigudf.py się w miejscu. 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. 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 programu 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ą 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: