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

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

  1. Instrukcja add file na początku pliku dodaje hiveudf.py plik do rozproszonej pamięci podręcznej, aby był 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 zwracane z hiveudf.pyelementu .

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:

  1. Odczytuje wiersz danych z narzędzia 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 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.
  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, 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.

  1. 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:
    
  2. Użyj protokołu SSH, aby nawiązać połączenie z klastrem. Edytuj i wprowadź polecenie:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. 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)

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

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

  1. Pierwszy wiersz ładuje przykładowy plik sample.log danych do LOGSpliku . Definiuje również każdy rekord jako chararray.
  2. Następny wiersz filtruje wszystkie wartości null, przechowując wynik operacji na LOG.
  3. Następnie wykonuje iterację rekordów w pliku LOG i używa GENERATE metody do wywołania create_structure metody zawartej w skryptycie języka 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.

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.

  1. 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
  2. Następnie definiuje def create_structure(input) funkcję, do którą pig przekazuje elementy liniowe.

  3. Przykładowe dane, , sample.loggłó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. 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, , time, classnameleveli detail.

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

  1. 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:
    
  2. Użyj protokołu SSH, aby nawiązać połączenie z klastrem. Edytuj i wprowadź polecenie:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. 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)

  1. Aby nawiązać połączenie z świnią, 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 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))
    
  4. 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
    
  5. 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.

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