Python User Defined Functions (UDF) gebruiken met Apache Hive en Apache Pig in HDInsight
Meer informatie over het gebruik van door de gebruiker gedefinieerde Python-functies (UDF) met Apache Hive en Apache Pig in Apache Hadoop in Azure HDInsight.
Python in HDInsight
Python2.7
wordt standaard geïnstalleerd in HDInsight 3.0 en hoger. Apache Hive kan worden gebruikt met deze versie van Python voor stroomverwerking. Stroomverwerking maakt gebruik van STDOUT en STDIN om gegevens door te geven tussen Hive en de UDF.
HDInsight bevat ook Jython, een Python-implementatie die is geschreven in Java. Jython wordt rechtstreeks uitgevoerd op de virtuele Java-machine en maakt geen gebruik van streaming. Jython is de aanbevolen Python-interpreter bij het gebruik van Python met Pig.
Vereisten
- Een Hadoop-cluster in HDInsight. Zie Aan de slag met HDInsight in Linux.
- Een SSH-client. Zie voor meer informatie Verbinding maken met HDInsight (Apache Hadoop) via SSH.
- Het URI-schema voor de primaire opslag voor uw clusters. Dit is
wasb://
voor Azure Storage,abfs://
voor Azure Data Lake Storage Gen2 of adl:// voor Azure Data Lake Storage Gen1. Als beveiligde overdracht is ingeschakeld voor Azure Storage, wordt de URI wasbs://. Zie ook beveiligde overdracht. - Mogelijke wijziging in de opslagconfiguratie. Zie Opslagconfiguratie als u het type
BlobStorage
opslagaccount gebruikt. - Optioneel. Als u PowerShell wilt gebruiken, moet de AZ-module zijn geïnstalleerd.
Notitie
Het opslagaccount dat in dit artikel wordt gebruikt, was Azure Storage met beveiligde overdracht ingeschakeld en wordt daarom wasbs
in het hele artikel gebruikt.
Opslagconfiguratie
Er is geen actie vereist als het gebruikte opslagaccount van het type Storage (general purpose v1)
of StorageV2 (general purpose v2)
is. Het proces in dit artikel produceert uitvoer naar ten minste /tezstaging
. Een standaard hadoop-configuratie bevat /tezstaging
in de fs.azure.page.blob.dir
configuratievariabele in core-site.xml
voor service HDFS
. Deze configuratie zorgt ervoor dat uitvoer naar de map pagina-blobs is, die niet worden ondersteund voor opslagaccounts BlobStorage
. Als u voor dit artikel wilt gebruiken BlobStorage
, verwijdert /tezstaging
u uit de fs.azure.page.blob.dir
configuratievariabele. De configuratie kan worden geopend vanuit de Ambari-gebruikersinterface. Anders wordt het foutbericht weergegeven: Page blob is not supported for this account type.
Waarschuwing
In de stappen in dit document wordt uitgegaan van de volgende veronderstellingen:
- U maakt de Python-scripts in uw lokale ontwikkelomgeving.
- U uploadt de scripts naar HDInsight met behulp van de
scp
opdracht of het opgegeven PowerShell-script.
Als u de Azure Cloud Shell (bash) wilt gebruiken om met HDInsight te werken, moet u het volgende doen:
- Maak de scripts in de Cloud Shell-omgeving.
- Gebruik
scp
om de bestanden van de Cloud Shell te uploaden naar HDInsight. - Gebruik
ssh
vanuit de Cloud Shell om verbinding te maken met HDInsight en voer de voorbeelden uit.
Apache Hive UDF
Python kan worden gebruikt als een UDF van Hive via de HiveQL-instructie TRANSFORM
. Met de volgende HiveQL wordt bijvoorbeeld het hiveudf.py
bestand aangeroepen dat is opgeslagen in het standaard Azure Storage-account voor het 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;
Dit voorbeeld doet het volgende:
- Met
add file
de instructie aan het begin van het bestand wordt hethiveudf.py
bestand toegevoegd aan de gedistribueerde cache, zodat het toegankelijk is voor alle knooppunten in het cluster. - De
SELECT TRANSFORM ... USING
-instructie selecteert gegevens uit dehivesampletable
. Ook worden de waarden clientid, devicemake en devicemodel doorgegeven aan hethiveudf.py
script. - De
AS
-component beschrijft de velden die worden geretourneerd doorhiveudf.py
.
Bestand maken
Maak in uw ontwikkelomgeving een tekstbestand met de naam hiveudf.py
. Gebruik de volgende code als de inhoud van het bestand:
#!/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()])
Met dit script worden de volgende acties uitgevoerd:
- Leest een regel met gegevens uit STDIN.
- Het afsluitende teken voor de nieuwe regel wordt verwijderd met behulp van
string.strip(line, "\n ")
. - Bij het verwerken van stromen bevat één regel alle waarden met een tabteken tussen elke waarde. Kan dus
string.split(line, "\t")
worden gebruikt om de invoer op elk tabblad te splitsen en alleen de velden te retourneren. - Wanneer de verwerking is voltooid, moet de uitvoer als één regel naar STDOUT worden geschreven, met een tabblad tussen elk veld. Bijvoorbeeld
print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])
. - De
while
lus wordt herhaald totdat neeline
wordt gelezen.
De scriptuitvoer is een samenvoeging van de invoerwaarden voor devicemake
en devicemodel
, en een hash van de samengevoegde waarde.
Bestand uploaden (shell)
De volgende opdracht vervangt sshuser
door de werkelijke gebruikersnaam, indien anders. Vervang door mycluster
de werkelijke clusternaam. Zorg ervoor dat de werkmap is waar het bestand zich bevindt.
Gebruik
scp
om de bestanden naar uw HDInsight-cluster te kopiëren. Bewerk en voer de opdracht in:scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Gebruik SSH om verbinding te maken met het cluster. Bewerk en voer de opdracht in:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Voeg vanuit de SSH-sessie de Python-bestanden toe die u eerder hebt geüpload naar de opslag voor het cluster.
hdfs dfs -put hiveudf.py /hiveudf.py
Hive UDF (shell) gebruiken
Als u verbinding wilt maken met Hive, gebruikt u de volgende opdracht vanuit uw geopende SSH-sessie:
beeline -u 'jdbc:hive2://headnodehost:10001/;transportMode=http'
Met deze opdracht wordt de Beeline-client gestart.
Voer de volgende query in bij de
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;
Zodra de laatste regel is ingevoerd, moet de taak beginnen. Zodra de taak is voltooid, wordt uitvoer geretourneerd die vergelijkbaar is met het volgende voorbeeld:
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
Voer de volgende opdracht in om Beeline af te sluiten:
!q
Bestand uploaden (PowerShell)
PowerShell kan ook worden gebruikt om Hive-query's op afstand uit te voeren. Zorg ervoor dat uw werkmap zich bevindt waar hiveudf.py
zich bevindt. Gebruik het volgende PowerShell-script om een Hive-query uit te voeren die gebruikmaakt van het hiveudf.py
script:
# 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
Notitie
Zie het document Gegevens uploaden voor Apache Hadoop-taken in HDInsight voor meer informatie over het uploaden van bestanden.
Hive UDF gebruiken
# 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
De uitvoer voor de Hive-taak moet er ongeveer uitzien als in het volgende voorbeeld:
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
Een Python-script kan worden gebruikt als een UDF van Pig via de GENERATE
-instructie. U kunt het script uitvoeren met Jython of C Python.
- Jython wordt uitgevoerd op de JVM en kan systeemeigen worden aangeroepen vanuit Pig.
- C Python is een extern proces, dus de gegevens van Pig op de JVM worden verzonden naar het script dat wordt uitgevoerd in een Python-proces. De uitvoer van het Python-script wordt teruggestuurd naar Pig.
Als u de Python-interpreter wilt opgeven, gebruikt register
u wanneer u verwijst naar het Python-script. In de volgende voorbeelden worden scripts met Pig geregistreerd als myfuncs
:
-
Jython gebruiken:
register '/path/to/pigudf.py' using jython as myfuncs;
-
C Python gebruiken:
register '/path/to/pigudf.py' using streaming_python as myfuncs;
Belangrijk
Wanneer u Jython gebruikt, kan het pad naar het pig_jython-bestand een lokaal pad of een WASBS:// pad zijn. Wanneer u C Python gebruikt, moet u echter verwijzen naar een bestand in het lokale bestandssysteem van het knooppunt dat u gebruikt om de Pig-taak te verzenden.
Zodra de registratie is verstreken, is de Pig Latin voor dit voorbeeld hetzelfde voor beide:
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;
Dit voorbeeld doet het volgende:
- Met de eerste regel wordt het voorbeeldgegevensbestand
sample.log
inLOGS
geladen. Ook wordt elke record gedefinieerd als eenchararray
. - De volgende regel filtert eventuele null-waarden uit en slaat het resultaat van de bewerking op in
LOG
. - Vervolgens worden de records in
LOG
herhaald en wordtGENERATE
de methode in hetcreate_structure
Python/Jython-script aangeroepen dat is geladen alsmyfuncs
.LINE
wordt gebruikt om de huidige record door te geven aan de functie. - Ten slotte worden de uitvoer naar STDOUT gedumpt met behulp van de
DUMP
opdracht . Met deze opdracht worden de resultaten weergegeven nadat de bewerking is voltooid.
Bestand maken
Maak in uw ontwikkelomgeving een tekstbestand met de naam pigudf.py
. Gebruik de volgende code als de inhoud van het bestand:
# 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
In het voorbeeld Pig Latin wordt de LINE
invoer gedefinieerd als een tekenmaarray, omdat er geen consistent schema voor de invoer is. Het Python-script transformeert de gegevens in een consistent schema voor uitvoer.
De
@outputSchema
instructie definieert de indeling van de gegevens die worden geretourneerd naar Pig. In dit geval is het een gegevensverzameling, wat een gegevenstype Pig is. De bag bevat de volgende velden, die allemaal chararray (tekenreeksen) zijn:- date: de datum waarop de logboekvermelding is gemaakt
- time: het tijdstip waarop de logboekvermelding is gemaakt
- classname- de klassenaam waarvoor de vermelding is gemaakt
- level - het logboekniveau
- detail - uitgebreide details voor de logboekvermelding
Vervolgens definieert de
def create_structure(input)
de functie waaraan Pig regelitems doorgeeft.De voorbeeldgegevens, ,
sample.log
voldoen meestal aan het datum-, tijd-, klassenaam-, niveau- en detailschema. Het bevat echter enkele regels die beginnen met*java.lang.Exception*
. Deze regels moeten worden aangepast aan het schema. Deif
instructie controleert deze en masseren vervolgens de invoergegevens om de*java.lang.Exception*
tekenreeks naar het einde te verplaatsen, zodat de gegevens in overeenstemming zijn met het verwachte uitvoerschema.Vervolgens wordt de
split
opdracht gebruikt om de gegevens te splitsen op de eerste vier spatietekens. De uitvoer wordt toegewezen indate
,time
,classname
,level
endetail
.Ten slotte worden de waarden geretourneerd naar Pig.
Wanneer de gegevens worden geretourneerd naar Pig, heeft deze een consistent schema zoals gedefinieerd in de @outputSchema
-instructie.
Bestand uploaden (shell)
Vervang in de onderstaande opdrachten door sshuser
de werkelijke gebruikersnaam, indien verschillend. Vervang door mycluster
de werkelijke clusternaam. Zorg ervoor dat het bestand zich in de werkmap bevindt.
Gebruik
scp
om de bestanden naar uw HDInsight-cluster te kopiëren. Bewerk en voer de opdracht in:scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
Gebruik SSH om verbinding te maken met het cluster. Bewerk en voer de opdracht in:
ssh sshuser@mycluster-ssh.azurehdinsight.net
Voeg vanuit de SSH-sessie de Python-bestanden toe die u eerder hebt geüpload naar de opslag voor het cluster.
hdfs dfs -put pigudf.py /pigudf.py
Pig UDF (shell) gebruiken
Als u verbinding wilt maken met pig, gebruikt u de volgende opdracht vanuit uw geopende SSH-sessie:
pig
Voer de volgende instructies in bij de
grunt>
prompt: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;
Nadat u de volgende regel hebt ingevoerd, moet de taak beginnen. Zodra de taak is voltooid, retourneert deze uitvoer die vergelijkbaar is met de volgende gegevens:
((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))
Gebruik
quit
om de Grunt-shell af te sluiten en gebruik vervolgens het volgende om het pigudf.py-bestand in het lokale bestandssysteem te bewerken:nano pigudf.py
Verwijder in de editor de opmerking op de volgende regel door het
#
teken aan het begin van de regel te verwijderen:#from pig_util import outputSchema
Met deze regel wijzigt u het Python-script zodat het werkt met C Python in plaats van met Jython. Zodra de wijziging is aangebracht, gebruikt u Ctrl+X om de editor af te sluiten. Selecteer J en vervolgens Enter om de wijzigingen op te slaan.
Gebruik de
pig
opdracht om de shell opnieuw te starten. Zodra u zich bij degrunt>
prompt bevindt, gebruikt u het volgende om het Python-script uit te voeren met behulp van de 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;
Zodra deze taak is voltooid, ziet u dezelfde uitvoer als toen u het script eerder uitvoerde met behulp van Jython.
Bestand uploaden (PowerShell)
PowerShell kan ook worden gebruikt om Op afstand Hive-query's uit te voeren. Zorg ervoor dat uw werkmap zich bevindt op pigudf.py
de locatie. Gebruik het volgende PowerShell-script om een Hive-query uit te voeren die gebruikmaakt van het pigudf.py
script:
# 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
Pig UDF gebruiken (PowerShell)
Notitie
Wanneer u een taak extern verzendt met behulp van PowerShell, is het niet mogelijk om C Python als interpreter te gebruiken.
PowerShell kan ook worden gebruikt om Pig Latin-taken uit te voeren. Als u een Pig Latin-taak wilt uitvoeren die gebruikmaakt van het pigudf.py
script, gebruikt u het volgende 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
De uitvoer voor de taak Pig moet er ongeveer uitzien als de volgende gegevens:
((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))
Problemen oplossen
Fouten bij het uitvoeren van taken
Wanneer u de Hive-taak uitvoert, kan er een fout optreden die vergelijkbaar is met de volgende tekst:
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.
Dit probleem kan worden veroorzaakt door de regeleinden in het Python-bestand. Veel Windows-editors gebruiken crlf standaard als het einde van de regel, maar Linux-toepassingen verwachten meestal LF.
U kunt de volgende PowerShell-instructies gebruiken om de CR-tekens te verwijderen voordat u het bestand uploadt naar HDInsight:
Write-Progress -Activity $activity -Status "Waiting for the Pig job to complete..."
# Wait for completion or failure of specified job
PowerShell-scripts
Beide PowerShell-voorbeeldscripts die worden gebruikt om de voorbeelden uit te voeren, bevatten een regel met opmerkingen die de foutuitvoer voor de taak weergeeft. Als u de verwachte uitvoer voor de taak niet ziet, verwijder dan de opmerking bij de volgende regel en kijk of de foutinformatie wijst op een probleem.
$activity="Pig job"
# Progress bar (optional)
Write-Progress -Activity $activity -Status "Starting job..."
De foutinformatie (STDERR) en het resultaat van de taak (STDOUT) worden ook geregistreerd in uw HDInsight-opslag.
Voor deze taak... | Bekijk deze bestanden in de blobcontainer |
---|---|
Hive | /HivePython/stderr /HivePython/stdout |
Pig | /PigPython/stderr /PigPython/stdout |
Volgende stappen
Zie How to deploy a module to Azure HDInsight (Een module implementeren in Azure HDInsight) als u Python-modules wilt laden die niet standaard worden geleverd.
Zie de volgende documenten voor andere manieren om Pig en Hive te gebruiken en voor meer informatie over het gebruik van MapReduce:
Feedback
https://aka.ms/ContentUserFeedback.
Binnenkort beschikbaar: In de loop van 2024 zullen we GitHub-problemen geleidelijk uitfaseren als het feedbackmechanisme voor inhoud en deze vervangen door een nieuw feedbacksysteem. Zie voor meer informatie:Feedback verzenden en weergeven voor