Verwenden benutzerdefinierter Python-Funktionen mit Apache Hive und Apache Pig in HDInsightUse Python User Defined Functions (UDF) with Apache Hive and Apache Pig in HDInsight

Erfahren Sie, wie Sie benutzerdefinierte Python-Funktionen (User-Defined Functions, UDFs) mit Apache Hive und Apache Pig in Apache Hadoop in Azure HDInsight verwenden.Learn how to use Python user-defined functions (UDF) with Apache Hive and Apache Pig in Apache Hadoop on Azure HDInsight.

Python in HDInsightPython on HDInsight

Python 2.7 wird in der Version HDInsight 3.0 und höher standardmäßig installiert.Python2.7 is installed by default on HDInsight 3.0 and later. Apache Hive kann mit dieser Version von Python zur Streamverarbeitung verwendet werden.Apache Hive can be used with this version of Python for stream processing. Die Streamverarbeitung nutzt STDOUT und STDIN, um Daten zwischen Hive und der benutzerdefinierten Funktion zu übergeben.Stream processing uses STDOUT and STDIN to pass data between Hive and the UDF.

HDInsight enthält außerdem Jython, eine in Java geschriebene Python-Implementierung.HDInsight also includes Jython, which is a Python implementation written in Java. Jython wird direkt auf der Java Virtual Machine ausgeführt und verwendet kein Streaming.Jython runs directly on the Java Virtual Machine and does not use streaming. Jython wird bei Verwendung von Python mit Pig als Python-Interpreter empfohlen.Jython is the recommended Python interpreter when using Python with Pig.

VoraussetzungenPrerequisites

Hinweis

Das in diesem Artikel verwendete Speicherkonto war vom Typ „Azure Storage mit aktivierter sicherer Übertragung“, und deshalb wird im gesamten Artikel wasbs verwendet.The storage account used in this article was Azure Storage with secure transfer enabled and thus wasbs is used throughout the article.

SpeicherkonfigurationStorage configuration

Es ist keine Aktion erforderlich, wenn das verwendete Speicherkonto vom Typ Storage (general purpose v1) oder StorageV2 (general purpose v2) ist.No action is required if the storage account used is of kind Storage (general purpose v1) or StorageV2 (general purpose v2). Der Prozess in diesem Artikel wird mindestens zu einer Ausgabe in /tezstaging führen.The process in this article will produce output to at least /tezstaging. In einer Hadoop-Standardkonfiguration ist /tezstaging in der Konfigurationsvariablen fs.azure.page.blob.dir in der Datei core-site.xml des HDFS-Diensts enthalten.A default hadoop configuration will contain /tezstaging in the fs.azure.page.blob.dir configuration variable in core-site.xml for service HDFS. Diese Konfiguration bewirkt, dass es sich bei der Ausgabe im Verzeichnis um Seitenblobs handelt. Diese werden für Speicherkonten vom Typ BlobStorage aber nicht unterstützt.This configuration will cause output to the directory to be page blobs, which are not supported for storage account kind BlobStorage. Entfernen Sie /tezstaging aus der Konfigurationsvariablen fs.azure.page.blob.dir, damit Sie BlobStorage im Rahmen dieses Artikels verwenden können.To use BlobStorage for this article, remove /tezstaging from the fs.azure.page.blob.dir configuration variable. Zugriff auf die Konfiguration besteht über die Ambari-Benutzeroberfläche.The configuration can be accessed from the Ambari UI. Andernfalls erhalten Sie diese Fehlermeldung: Page blob is not supported for this account type.Otherwise, you will receive the error message: Page blob is not supported for this account type.

Warnung

Für die Schritte in diesem Dokument gelten die folgenden Annahmen:The steps in this document make the following assumptions:

  • Sie erstellen die Python-Skripts in der lokalen Entwicklungsumgebung.You create the Python scripts on your local development environment.
  • Sie laden die Skripts entweder mit dem scp-Befehl oder dem bereitgestellten PowerShell-Skript in HDInsight hoch.You upload the scripts to HDInsight using either the scp command or the provided PowerShell script.

Gehen Sie wie folgt vor, wenn Sie die Azure Cloud Shell (Bash) für die Verwendung von HDInsight verwenden möchten:If you want to use the Azure Cloud Shell (bash) to work with HDInsight, then you must:

  • die Skripts in der Cloud Shell-Umgebung erstellen.Create the scripts inside the cloud shell environment.
  • scp zum Hochladen der Dateien aus Cloud Shell in HDInsight verwenden.Use scp to upload the files from the cloud shell to HDInsight.
  • ssh aus Cloud Shell zum Herstellen einer Verbindung mit HDInsight verwenden und die Beispiele ausführen.Use ssh from the cloud shell to connect to HDInsight and run the examples.

Benutzerdefinierte Apache Hive-FunktionApache Hive UDF

Python kann mittels der Hive QL-TRANSFORM-Anweisung als UDF von Hive aus verwendet werden.Python can be used as a UDF from Hive through the HiveQL TRANSFORM statement. Beispielsweise ruft die folgende HiveQL-Anweisung die im standardmäßigen Azure Storage-Konto für den Cluster gespeicherte hiveudf.py-Datei auf.For example, the following HiveQL invokes the hiveudf.py file stored in the default Azure Storage account for the cluster.

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;

Das Beispiel bewirkt Folgendes:Here's what this example does:

  1. Die add file-Anweisung am Anfang der Datei fügt die hiveudf.py-Datei dem verteilten Cache hinzu, sodass sie von allen Knoten im Cluster aus zugänglich ist.The add file statement at the beginning of the file adds the hiveudf.py file to the distributed cache, so it's accessible by all nodes in the cluster.
  2. Die SELECT TRANSFORM ... USING-Anweisung wählt Daten aus der hivesampletable aus.The SELECT TRANSFORM ... USING statement selects data from the hivesampletable. Sie übergibt außerdem die Werte „clientid“, „devicemake“ und „devicemodel“ an das hiveudf.py-Skript .It also passes the clientid, devicemake, and devicemodel values to the hiveudf.py script.
  3. Die AS-Klausel beschreibt die von hiveudf.py zurückgegebenen Felder.The AS clause describes the fields returned from hiveudf.py.

Datei erstellenCreate file

Erstellen Sie in Ihrer Entwicklungsumgebung eine Textdatei namens hiveudf.py.On your development environment, create a text file named hiveudf.py. Fügen Sie der Datei den folgenden Code als Inhalt hinzu:Use the following code as the contents of the file:

#!/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()])

Dieses Skript führt folgende Aktionen aus:This script performs the following actions:

  1. Eine Datenzeile wird aus STDIN gelesen.Reads a line of data from STDIN.
  2. Das nachfolgende Zeilenumbruchzeichen wird mit string.strip(line, "\n ") entfernt.The trailing newline character is removed using string.strip(line, "\n ").
  3. Bei der Streamverarbeitung enthält eine einzelne Zeile alle Werte, jeweils getrennt durch ein Tabulatorzeichen.When doing stream processing, a single line contains all the values with a tab character between each value. Deshalb kann string.split(line, "\t") zum Unterteilen der Eingabe bei jedem Tabstopp verwendet werden, sodass nur die Felder zurückgeben werden.So string.split(line, "\t") can be used to split the input at each tab, returning just the fields.
  4. Wenn die Verarbeitung abgeschlossen ist, muss die Ausgabe als eine Zeile nach STDOUT geschrieben werden mit einem Tabulator zwischen jedem Feld.When processing is complete, the output must be written to STDOUT as a single line, with a tab between each field. Beispiel: print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()]).For example, print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()]).
  5. Die while-Schleife wird wiederholt, bis keine line mehr gelesen wird.The while loop repeats until no line is read.

Die Skriptausgabe ist eine Verkettung der Eingabewerte für devicemake und devicemodel und ein Hash der verketteten Werte.The script output is a concatenation of the input values for devicemake and devicemodel, and a hash of the concatenated value.

Hochladen einer Datei (Shell)Upload file (shell)

Ersetzen Sie sshuser in den folgenden Befehlen durch den tatsächlichen Benutzernamen, falls dieser abweicht.In the commands below, replace sshuser with the actual username if different. Ersetzen Sie mycluster durch den tatsächlichen Clusternamen.Replace mycluster with the actual cluster name. Stellen Sie sicher, dass das Arbeitsverzeichnis das Verzeichnis ist, in dem sich die Datei befindet.Ensure your working directory is where the file is located.

  1. Verwenden Sie scp , um die Dateien in Ihren HDInsight-Cluster zu kopieren.Use scp to copy the files to your HDInsight cluster. Bearbeiten Sie den folgenden Befehl, und geben Sie ihn ein:Edit and enter the command below:

    scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Verwenden Sie SSH zum Herstellen einer Verbindung mit dem Cluster.Use SSH to connect to the cluster. Bearbeiten Sie den folgenden Befehl, und geben Sie ihn ein:Edit and enter the command below:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Fügen Sie die Python-Dateien, die zuvor hochgeladen wurden, in der SSH-Sitzung dem Speicher für den Cluster hinzu.From the SSH session, add the python files uploaded previously to the storage for the cluster.

    hdfs dfs -put hiveudf.py /hiveudf.py
    

Verwenden der Hive-UDF (Shell)Use Hive UDF (shell)

  1. Verwenden Sie den folgenden Befehl in Ihrer geöffneten SSH-Sitzung, um eine Verbindung mit Hive herzustellen:To connect to Hive, use the following command from your open SSH session:

    beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
    

    Dieser Befehl startet den Beeline-Client.This command starts the Beeline client.

  2. Geben Sie bei der Eingabeaufforderung 0: jdbc:hive2://headnodehost:10001/> folgende Abfrage ein:Enter the following query at the 0: jdbc:hive2://headnodehost:10001/> prompt:

    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. Nach Eingabe der letzten Zeile sollte der Auftrag gestartet werden.After entering the last line, the job should start. Nach Abschluss des Auftrags wird eine Ausgabe ähnlich der folgenden zurückgegeben:Once the job completes, it returns output similar to the following example:

     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. Geben Sie zum Beenden von Beeline den folgenden Befehl ein:To exit Beeline, enter the following command:

    !q
    

Hochladen einer Datei (PowerShell)Upload file (PowerShell)

PowerShell kann auch zur Remoteausführung von Hive-Abfragen verwendet werden.PowerShell can also be used to remotely run Hive queries. Stellen Sie sicher, dass das Arbeitsverzeichnis das Verzeichnis ist, in dem sich die Datei hiveudf.py befindet.Ensure your working directory is where hiveudf.py is located. Verwenden Sie das folgende PowerShell-Skript zum Ausführen einer Hive-Abfrage, für die das hiveudf.py-Skript verwendet wird:Use the following PowerShell script to run a Hive query that uses the hiveudf.py script:

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# 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

Hinweis

Weitere Informationen zum Hochladen von Dateien finden Sie im Dokument Hochladen von Daten für Apache Hadoop-Aufträge in HDInsight.For more information on uploading files, see the Upload data for Apache Hadoop jobs in HDInsight document.

Verwenden der Hive-UDFUse Hive UDF

# 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"

$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

Die Ausgabe für den Hive-Auftrag sollte ungefähr folgendem Beispiel entsprechen:The output for the Hive job should appear similar to the following example:

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

Benutzerdefinierte Apache Pig-FunktionApache Pig UDF

Ein Python-Skript kann mit der GENERATE-Anweisung von Pig aus als UDF verwendet werden.A Python script can be used as a UDF from Pig through the GENERATE statement. Sie können das Skript entweder mit Jython oder C-Python ausführen.You can run the script using either Jython or C Python.

  • Jython wird auf der JVM ausgeführt und kann nativ von Pig aufgerufen werden.Jython runs on the JVM, and can natively be called from Pig.
  • C-Python ist ein externer Prozess, sodass die Daten aus Pig auf der JVM an das Skript gesendet werden, das in einem Python-Prozess ausgeführt wird.C Python is an external process, so the data from Pig on the JVM is sent out to the script running in a Python process. Die Ausgabe des Python-Skripts wird wieder an Pig gesendet.The output of the Python script is sent back into Pig.

Verwenden Sie zum Angeben des Python-Interpreters register, wenn Sie auf das Python-Skript verweisen.To specify the Python interpreter, use register when referencing the Python script. In den folgenden Beispielen werden Skripts mit Pig als myfuncs registriert:The following examples register scripts with Pig as myfuncs:

  • Verwendung von Jython: register '/path/to/pigudf.py' using jython as myfuncs;To use Jython: register '/path/to/pigudf.py' using jython as myfuncs;
  • Verwendung von C Python: register '/path/to/pigudf.py' using streaming_python as myfuncs;To use C Python: register '/path/to/pigudf.py' using streaming_python as myfuncs;

Wichtig

Bei Verwendung von Jython kann der Pfad zur Datei „pig_jython“ entweder ein lokaler oder ein „WASBS://“-Pfad sein.When using Jython, the path to the pig_jython file can be either a local path or a WASBS:// path. Jedoch müssen Sie bei der Verwendung von C-Python auf eine Datei auf dem lokalen Dateisystem des Knotens verweisen, den Sie verwenden, um den Pig-Job zu übermitteln.However, when using C Python, you must reference a file on the local file system of the node that you are using to submit the Pig job.

Nach der Registrierung ist Pig Latin in diesem Beispiel für beides identisch:Once past registration, the Pig Latin for this example is the same for both:

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;

Das Beispiel bewirkt Folgendes:Here's what this example does:

  1. Die erste Zeile lädt die Datei mit den Beispieldaten sample.log in LOGS.The first line loads the sample data file, sample.log into LOGS. Sie definiert außerdem jeden Datensatz als ein chararray.It also defines each record as a chararray.
  2. Die nächste Zeile filtert etwaige NULL-Werte heraus und speichert das Ergebnis des Vorgangs in LOG.The next line filters out any null values, storing the result of the operation into LOG.
  3. Dann folgt eine Iteration über die Datensätze in LOG, und mit GENERATE wird die Methode create_structure aufgerufen, die im Python/Jython-Skript enthalten ist, das als myfuncs geladen wird.Next, it iterates over the records in LOG and uses GENERATE to invoke the create_structure method contained in the Python/Jython script loaded as myfuncs. LINE wird für die Übergabe des aktuellen Datensatzes an die Funktion verwendet.LINE is used to pass the current record to the function.
  4. Schließlich werden die ausgegebenen Daten mit dem Befehl DUMP in STDOUT geschrieben.Finally, the outputs are dumped to STDOUT using the DUMP command. Dieser Befehl zeigt die Ergebnisse nach Abschluss des Vorgangs.This command displays the results after the operation completes.

Datei erstellenCreate file

Erstellen Sie in Ihrer Entwicklungsumgebung eine Textdatei namens pigudf.py.On your development environment, create a text file named pigudf.py. Fügen Sie der Datei den folgenden Code als Inhalt hinzu:Use the following code as the contents of the file:

# 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

Im Pig Latin-Beispiel wird die LINE-Eingabe als Chararray definiert, da es kein gleichbleibendes Schema für die Eingabe gibt.In the Pig Latin example, the LINE input is defined as a chararray because there is no consistent schema for the input. Das Python-Skript transformiert die Daten für die Ausgabe in ein gleichbleibendes Schema.The Python script transforms the data into a consistent schema for output.

  1. Die @outputSchema-Anweisung definiert das Format der Daten, die an Pig zurückgegeben werden.The @outputSchema statement defines the format of the data that is returned to Pig. In diesem Fall ist das ein Datenbehälter, also ein Pig-Datentyp.In this case, it's a data bag, which is a Pig data type. Der Behälter enthält folgende Felder, die alle Chararray (Zeichenfolgen) sind:The bag contains the following fields, all of which are chararray (strings):

    • date – das Datum, an dem der Protokolleintrag erstellt wurdedate - the date the log entry was created
    • time – die Zeit, zu der der Protokolleintrag erstellt wurdetime - the time the log entry was created
    • classname – der Klassenname, für den der Eintrag erstellt wurdeclassname - the class name the entry was created for
    • level – die Protokollierungsebenelevel - the log level
    • detail – ausführliche Details des Protokolleintragsdetail - verbose details for the log entry
  2. Dann definiert def create_structure(input) die Funktion, an die Pig Positionen übergibt.Next, the def create_structure(input) defines the function that Pig passes line items to.

  3. Die Beispieldatei sample.log entspricht weitgehend dem Schema für Datum, Uhrzeit, Klassenname, Ebene und Detail.The example data, sample.log, mostly conforms to the date, time, classname, level, and detail schema. Sie enthält jedoch ein paar Zeilen, die mit *java.lang.Exception* beginnen.However, it contains a few lines that begin with *java.lang.Exception*. Diese Zeilen müssen geändert werden, um dem Schema zu entsprechen.These lines must be modified to match the schema. Die Anweisung if überprüft deren Vorhandensein, weist dann die Eingabedaten an, die Zeichenfolge *java.lang.Exception* ans Ende zu stellen, sodass die Daten dem erwarteten Ausgabeschema entsprechen.The if statement checks for those, then massages the input data to move the *java.lang.Exception* string to the end, bringing the data in-line with the expected output schema.

  4. Als Nächstes wird der Befehl split zum Aufteilen der Daten bei den ersten vier Leerzeichen verwendet.Next, the split command is used to split the data at the first four space characters. Die Ausgabe wird in date, time, classname, level und detail zugewiesen.The output is assigned into date, time, classname, level, and detail.

  5. Zuletzt werden die Werte an Pig zurückgegeben.Finally, the values are returned to Pig.

Wenn die Daten an Pig zurückgegeben werden, haben sie ein gleichbleibendes Schema gemäß Definition in der @outputSchema-Anweisung.When the data is returned to Pig, it has a consistent schema as defined in the @outputSchema statement.

Hochladen einer Datei (Shell)Upload file (shell)

Ersetzen Sie sshuser in den folgenden Befehlen durch den tatsächlichen Benutzernamen, falls dieser abweicht.In the commands below, replace sshuser with the actual username if different. Ersetzen Sie mycluster durch den tatsächlichen Clusternamen.Replace mycluster with the actual cluster name. Stellen Sie sicher, dass das Arbeitsverzeichnis das Verzeichnis ist, in dem sich die Datei befindet.Ensure your working directory is where the file is located.

  1. Verwenden Sie scp , um die Dateien in Ihren HDInsight-Cluster zu kopieren.Use scp to copy the files to your HDInsight cluster. Bearbeiten Sie den folgenden Befehl, und geben Sie ihn ein:Edit and enter the command below:

    scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. Verwenden Sie SSH zum Herstellen einer Verbindung mit dem Cluster.Use SSH to connect to the cluster. Bearbeiten Sie den folgenden Befehl, und geben Sie ihn ein:Edit and enter the command below:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. Fügen Sie die Python-Dateien, die zuvor hochgeladen wurden, in der SSH-Sitzung dem Speicher für den Cluster hinzu.From the SSH session, add the python files uploaded previously to the storage for the cluster.

    hdfs dfs -put pigudf.py /pigudf.py
    

Verwenden von Pig-UDF (Shell)Use Pig UDF (shell)

  1. Verwenden Sie den folgenden Befehl aus Ihrer geöffneten SSH-Sitzung, um eine Verbindung mit Pig herzustellen:To connect to pig, use the following command from your open SSH session:

    pig
    
  2. Geben Sie in der grunt>-Befehlszeile die folgenden Anweisungen ein:Enter the following statements at the grunt> prompt:

    Register wasbs:///pigudf.py using jython as myfuncs;
    LOGS = LOAD 'wasb:///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. Nach Eingabe der folgenden Zeile sollte der Auftrag gestartet werden.After entering the following line, the job should start. Nach Abschluss des Auftrags wird eine Ausgabe zurückgegeben, die folgenden Daten ähnelt:Once the job completes, it returns output similar to the following data:

     ((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. Verwenden Sie quit zum Beenden der Grunt-Shell und dann Folgendes zum Bearbeiten der Datei „pigudf.py“ auf dem lokalen Dateisystem:Use quit to exit the Grunt shell, and then use the following to edit the pigudf.py file on the local file system:

    nano pigudf.py
    
  5. Heben Sie die Kommentierung der folgenden Zeilen auf, indem Sie das Zeichen # vom Zeilenanfang entfernen:Once in the editor, uncomment the following line by removing the # character from the beginning of the line:

    #from pig_util import outputSchema
    

    Mit dieser Zeile wird das Python-Skript so angepasst, dass es mit C Python (anstelle von Jython) verwendet werden kann.This line modifies the Python script to work with C Python instead of Jython. Nachdem die Änderung vorgenommen wurde, beenden Sie den Editor mit STRG+X.Once the change has been made, use Ctrl+X to exit the editor. Wählen Sie Y und dann EINGABE, um die Änderungen zu speichern.Select Y, and then Enter to save the changes.

  6. Verwenden Sie den pig -Befehl, um die Shell neu zu starten.Use the pig command to start the shell again. Geben Sie Folgendes an der grunt> -Eingabeaufforderung ein, um das Python-Skript mit dem C-Python-Interpreter auszuführen.Once you are at the grunt> prompt, use the following to run the Python script using the C Python interpreter.

    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;
    

    Wenn dieser Auftrag abgeschlossen ist, sollte die Ausgabe derjenigen bei der vorherigen Skriptausführung mit Jython entsprechen.Once this job completes, you should see the same output as when you previously ran the script using Jython.

Hochladen einer Datei (PowerShell)Upload file (PowerShell)

PowerShell kann auch zur Remoteausführung von Hive-Abfragen verwendet werden.PowerShell can also be used to remotely run Hive queries. Stellen Sie sicher, dass das Arbeitsverzeichnis das Verzeichnis ist, in dem sich die Datei pigudf.py befindet.Ensure your working directory is where pigudf.py is located. Verwenden Sie das folgende PowerShell-Skript zum Ausführen einer Hive-Abfrage, für die das pigudf.py-Skript verwendet wird:Use the following PowerShell script to run a Hive query that uses the pigudf.py script:

# Login to your Azure subscription
# Is there an active Azure subscription?
$sub = Get-AzSubscription -ErrorAction SilentlyContinue
if(-not($sub))
{
    Connect-AzAccount
}

# 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

Verwenden der Pig-UDF (PowerShell)Use Pig UDF (PowerShell)

Hinweis

Wenn Sie einen Auftrag mithilfe von PowerShell remote übermitteln, können Sie C-Python nicht als Interpreter verwenden.When remotely submitting a job using PowerShell, it is not possible to use C Python as the interpreter.

PowerShell kann auch zum Ausführen von Pig Latin-Aufträgen verwendet werden.PowerShell can also be used to run Pig Latin jobs. Verwenden Sie das folgende PowerShell-Skript, um einen Pig-Latin-Auftrag mit dem pigudf.py-Skript auszuführen:To run a Pig Latin job that uses the pigudf.py script, use the following PowerShell script:

# 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

Die Ausgabe für den Pig-Job sollte ungefähr folgenden Daten entsprechen:The output for the Pig job should appear similar to the following data:

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

ProblembehandlungTroubleshooting

Fehler beim Ausführen von AufträgenErrors when running jobs

Bei der Ausführung des Hive-Auftrags kann ein ähnlicher Fehler wie der folgende Text auftreten:When running the hive job, you may encounter an error similar to the following text:

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.

Dieses Problem kann durch die Zeilenenden in der Python-Datei verursacht werden.This problem may be caused by the line endings in the Python file. Viele Windows-Editoren verwenden als Zeilenende standardmäßig CRLF, Linux-Anwendung erwarten jedoch i. d. R. LF.Many Windows editors default to using CRLF as the line ending, but Linux applications usually expect LF.

Sie können die folgenden PowerShell-Anweisungen verwenden, um die CR-Zeichen zu entfernen, bevor Sie die Datei in HDInsight hochladen:You can use the following PowerShell statements to remove the CR characters before uploading the file to HDInsight:

Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."

# Wait for completion or failure of specified job

PowerShell-SkriptsPowerShell scripts

Beide für das Ausführen der Beispiele verwendeten PowerShell-Beispielskripts enthalten eine Kommentarzeile, die Fehler bei der Ausgabe des Jobs anzeigt.Both of the example PowerShell scripts used to run the examples contain a commented line that displays error output for the job. Wenn Sie nicht die erwartete Ausgabe für den Job sehen, kommentieren Sie die folgende Zeile aus und sehen Sie nach, ob die Fehlerinformation auf ein Problem hinweist.If you are not seeing the expected output for the job, uncomment the following line and see if the error information indicates a problem.

$activity="Pig job"

# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."

Die Fehlerinformationen (STDERR) und das Ergebnis des Auftrags (STDOUT) werden auch in Ihrem HDInsight-Speicher protokolliert.The error information (STDERR) and the result of the job (STDOUT) are also logged to your HDInsight storage.

Für diesen Job...For this job... Sehen Sie sich diese Dateien im BLOB-Container anLook at these files in the blob container
HiveHive /HivePython/stderr/HivePython/stderr

/HivePython/stdout/HivePython/stdout

PigPig /PigPython/stderr/PigPython/stderr

/PigPython/stdout/PigPython/stdout

Nächste SchritteNext steps

Wenn Sie Python-Module laden müssen, die standardmäßig nicht bereitgestellt werden, lesen Sie Bereitstellen eines Moduls für Azure HDInsight.If you need to load Python modules that aren't provided by default, see How to deploy a module to Azure HDInsight.

Informationen zu anderen Möglichkeiten der Verwendung von Pig und Hive sowie Informationen zur Verwendung von MapReduce finden Sie in diesen Dokumenten:For other ways to use Pig, Hive, and to learn about using MapReduce, see the following documents: