Udostępnij przez


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 (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

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 scp polecenia 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 ssh Cloud 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:

  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 elementu hiveudf.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:

  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ą. W ten sposób string.split(line, "\t") można podzielić dane wejściowe na każdym tabulatorze, 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 line nie 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.

  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 wcześniej przesłane pliki Python do pamięci masowej klastra.

    hdfs dfs -put hiveudf.py /hiveudf.py
    

Użycie funkcji UDF Hive (shell)

  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 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:

  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 i używa GENERATE do wywołania metody create_structure, zawartej w skrypcie Python/Jython, który został załadowany jako myfuncs. LINE służy do przekazywania bieżącego rekordu do funkcji.
  4. Na koniec dane wyjściowe są zrzucane przy użyciu polecenia DUMP do 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.

  1. Instrukcja @outputSchema definiuje 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
  2. Następnie def create_structure(input) definiuje funkcję, do której Pig przekazuje elementy wiersza.

  3. Przykładowe dane sample.log zwykle 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 dostosowuje dane wejściowe, aby przenieść *java.lang.Exception* ciąg na koniec, dopasowując dane do oczekiwanego schematu 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 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.

  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
    

Użyj Pig UDF (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, aby zamknąć powłokę Grunt, a następnie edytuj 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. Użyj polecenia pig, 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 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: