استخدام دوال Python المعرّفة من قبل المستخدم (UDF) مع Apache Hive وApache Pig في HDInsight

تعلم كيفية استخدام دوال Python المعرّفة من قبل المستخدم (UDF) مع Apache Hive وApache Pig في HDInsight.

Python على HDInsight

Python2.7 يتم تثبيته بشكل افتراضي على HDInsight 3.0 والإصدارات الأحدث. يمكن استخدام Apache Hive مع هذا الإصدار من Python لمعالجة دفق البيانات. معالجة دفق البيانات تستخدم STDOUT وSTDIN لتمرير البيانات بين Apache Hive وUDF.

HDInsight يشمل كذلك Jython، وهو تنفيذ Python مكتوب بلغة برمجة Java. يعمل Jython مباشرة على جهاز Java ظاهري ولا يستخدم الدفق. Jython هو مترجم Python المُوصى به عند استخدام Python مع Pig.

المتطلبات الأساسية

ملاحظة

حساب التخزين المستخدم في هذه المقالة كان تخزين Azure مع تمكين النقل الآمن وبالتالي يُستخدم wasbs في كافة المقالة.

تكوين التخزين

لا يلزم اتخاذ أي إجراء إذا كان حساب التخزين المستخدم من النوع Storage (general purpose v1) أو StorageV2 (general purpose v2). تنتج العملية في هذه المقالة إخراجا إلى على الأقل /tezstaging. يحتوي /tezstaging تكوين hadoop الافتراضي على fs.azure.page.blob.dir في متغير التكوين في core-site.xml للخدمة HDFS. يتسبب هذا التكوين في أن يكون الإخراج إلى الدليل كائنات ثنائية كبيرة الحجم للصفحة، وهي غير مدعومة لنوع BlobStorageحساب التخزين . لاستخدام BlobStorage في هذه المقالة، أزل /tezstaging من متغير التكوين fs.azure.page.blob.dir. يمكن الوصول إلى التكوين من واجهة المستخدم Ambari. وإلا، فستتلقى رسالة الخطأ: Page blob is not supported for this account type.

تحذير

توضح الخطوات الواردة في هذا المستند الافتراضات التالية:

  • إنشاء برامج Python النصية على بيئة التطوير المحلي الخاصة بك.
  • تحميل البرامج النصية إلى HDInsight باستخدام الأمر scp أو برنامج PowerShell النصي المتوفرة.

إذا كنت ترغب في استخدام Azure Cloud Shell (bash) للعمل مع HDInsight، فيجب عليك:

  • إنشاء البرامج النصية داخل بيئة shell سحابية.
  • استخدام scp لتحميل الملفات من shell السحابية إلى HDInsight.
  • استخدام ssh من shell السحابية للاتصال بـ HDInsight وتشغيل الأمثلة.

Apache Hive UDF

يمكن استخدام Python كـ UDF من Apache Hive من خلال بيان HiveQL TRANSFORM. على سبيل المثال، يستدعي HiveQL التالي ملف hiveudf.py المُخزن في حساب تخزين Azure الافتراضي للمجموعة.

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;

إليك ما يفعله هذا المثال:

  1. العبارة add file في بداية الملف تضيف الملف hiveudf.py إلى ذاكرة التخزين المؤقت الموزعة، بحيث يمكن لكافة العقد في المجموعة الوصول إليها.
  2. تحدد العبارة SELECT TRANSFORM ... USING البيانات من hivesampletable. كما أنها تمرر قيم معرف العميل وصنع الجهاز ونموذج الجهاز إلى البرنامج النصي hiveudf.py.
  3. تصف العبارة AS الحقول التي تم إرجاعها من hiveudf.py.

إنشاء ملف

في بيئة التطوير الخاصة بك، قم بإنشاء ملف نصي باسم hiveudf.py. استخدم التعليمات البرمجية التالية كمحتويات هذا الملف:

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

ينفذ النص الإجراءات التالية:

  1. يقرأ سطر بيانات من STDIN.
  2. يُزال حرف السطر الجديد الزائدة باستخدام string.strip(line, "\n ").
  3. عند القيام بمعالجة دفق البيانات، يحتوي سطر واحد على كافة القيم ذات حرف الجدولة بين كل قيمة. لذلك يمكن استخدام string.split(line, "\t") لتقسيم الإدخال في كل علامة تبويب وإعادة الحقول فقط.
  4. عند اكتمال المعالجة، يجب كتابة الناتج إلى STDOUT كخط مفرد، مع علامة تبويب بين كل حقل. على سبيل المثال، ⁧print "\t".join([clientid, phone_label, hashlib.md5(phone_label).hexdigest()])⁩.
  5. يتكرر التكرار الحلقي while حتى لا يُقرأ line.

إخراج البرنامج النصي هو سلسلة من قيم الإدخال لـ devicemake وdevicemodel، و تجزئة القيمة المتسلسلة.

تحميل ملف (shell)

يستبدل sshuser الأمر التالي باسم المستخدم الفعلي إذا كان مختلفا. استبدل mycluster باسم المجموعة الفعلي. تأكد من أن الدليل المشغَّل هو مكان تواجد الملف.

  1. استخدم scp لنسخ الملفات إلى مجموعة HDInsight. تحرير الأمر وإدخاله:

    scp hiveudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. استخدم SSH للاتصال بالمجموعة. تحرير الأمر وإدخاله:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. من جلسة SSH، أضف ملفات Python التي تم تحميلها مسبقًا إلى تخزين المجموعة.

    hdfs dfs -put hiveudf.py /hiveudf.py
    

استخدام Apache Hive المعرّف من قبل المستخدم (shell)

  1. للاتصال بـ Apache Hive، استخدم الأمر التالي من جلسة SSH المفتوحة:

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

    يشغل هذا الأمر عميل Beeline.

  2. في موجه 0: jdbc:hive2://headnodehost:10001/>، أدخل الاستعلام التالي:

    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. بمجرد إدخال السطر الأخير، يجب أن تبدأ المهمة. بمُجرد اكتمال الوظيفة، يرجع ناتج مشابهًا للمثال التالي:

    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. أدخل الأمر التالي لإغلاق Beeline:

    !q
    

تحميل ملف (PowerShell)

يمكن كذلك استخدام PowerShell لتشغيل استعلامات Apache Hive عن بعد. تأكد من أن الدليل المشغَّل هو مكان تواجد hiveudf.py. استخدم برنامج PowerShell النصي التالي لتشغيل استعلام Apache Hive الذي يستخدم البرنامج النصي 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

ملاحظة

لمزيد من المعلومات حول تحميل الملفات، راجع مستند تحميل البيانات لوظائف Apache Hadoop في HDInsight.

استخدام Apache 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

يجب أن يظهر ناتج وظيفة Apache Hive مشابهًا للمثال التالي:

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 خنزير UDF

يمكن استخدام برنامج Python النصي كـ UDF من Apache Pig من خلال البيان GENERATE. يمكنك تشغيل البرنامج النصي باستخدام Jython أو C Python.

  • Jython يعمل على جهاز Java ظاهري، ويمكن استدعاؤه أصلًا من Apache Pig.
  • C Python هي عملية خارجية، لذلك تُرسل البيانات من Apache Pig على جهاز Java ظاهري إلى البرنامج النصي قيد التشغيل في عملية Python. يتم إرسال ناتج سيناريو Python مُجددًا إلى Apache Pig.

لتحديد مترجم Python استخدم register عند الرجوع إلى برنامج Python النصي. الأمثلة التالية تسجل البرامج النصية مع Apache Pig كـ myfuncs:

  • لاستخدام Jython: register '/path/to/pigudf.py' using jython as myfuncs;
  • لاستخدام C Python: register '/path/to/pigudf.py' using streaming_python as myfuncs;

هام

عند استخدام Jython، يمكن أن يكون المسار إلى ملف pig_jython مسار محلي أو مسار //:WASBS. ومع ذلك، عند استخدام C Python، يجب الرجوع إلى ملف على نظام الملفات المحلي للعقدة التي تستخدمها لإرسال وظيفة Apache Pig.

بمجرد التسجيل السابق، يكون Apache Pig Latin لهذا المثال هو نفسه لكليهما:

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;

إليك ما يفعله هذا المثال:

  1. السطر الأول يُحمل عينة ملف البيانات sample.log إلى LOGS. كما يُعرف كل سجل على أنه chararray.
  2. يقوم السطر التالي بتصفية أي قيم خالية، وتخزين نتيجة العملية في LOG.
  3. ثم يكرر ذلك عبر السجلات في LOG ويستخدم GENERATE لاستدعاء الأسلوب create_structure الموجود في البرنامج النصي Python/Jython المُحمل كـ myfuncs. يُستخدم LINE لتمرير السجل الحالي إلى الدالة.
  4. وأخيرًا، يتم تفريغ الناتج إلى STDOUT باستخدام الأمر DUMP. يعرض هذا الأمر النتائج بعد اكتمال العملية.

إنشاء ملف

في بيئة التطوير الخاصة بك، قم بإنشاء ملف نصي باسم pigudf.py. استخدم التعليمات البرمجية التالية كمحتويات هذا الملف:

# 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

في مثال Pig Latin، يُعرف الإدخال LINE كمصفوفة أحرف لأنه لا يوجد مخطط متناسق للإدخال. البرنامج النصي Python يحول البيانات إلى مخطط متناسقة للناتج.

  1. تُعرف العبارة @outputSchema تنسيق البيانات التي يتم إرجاعها إلى Apache Pig. في هذه الحالة، إنها حقيبة بيانات، وهو نوع بيانات Apache Pig. تحتوي الحقيبة على الحقول التالية، وكلها مصفوفة أحرف (سلاسل):

    • التاريخ - تاريخ إنشاء إدخال السجل
    • الوقت - وقت إنشاء إدخال السجل
    • اسم الفئة - اسم الفئة الذي تم إنشاء الإدخال له
    • المستوى - مستوى السجل
    • التفاصيل - تفاصيل مطولة لإدخال السجل
  2. بعد ذلك، يُعرف def create_structure(input) الدالة التي يمرر Apache Pig عناصر السطر إليها.

  3. بيانات المثال، sample.log، تتوافق في الغالب مع التاريخ والوقت واسم الفئة والمستوى ومخطط التفاصيل. ومع ذلك، فإنها تحتوي على بضعة أسطر تبدأ بـ *java.lang.Exception*. يجب تعديل هذه الأسطر لمطابقة المخطط. تتحقق العبارة if من ذلك، ثم ترسل بيانات الإدخال لنقل السلسلة *java.lang.Exception* إلى النهاية، ما يجعل البيانات متوافقة مع مخطط الناتج المتوقع.

  4. بعد ذلك، يُستخدم الأمر split لتقسيم البيانات في الأحرف الأربعة الأولى من المسافة. يتم تعيين الإخراج إلى date، وtime، وclassname، وlevel، وdetail.

  5. وأخيرًا، يتم إرجاع القيم إلى Apache Pig.

عند إرجاع البيانات إلى Apache Pig، يكون لها مخطط متناسق كما هو محدد في العبارة @outputSchema.

تحميل ملف (shell)

في الأوامر أدناه، استبدل sshuser باسم المستخدم الفعلي إذا كان مختلفًا. استبدل mycluster باسم المجموعة الفعلي. تأكد من أن الدليل المشغَّل هو مكان تواجد الملف.

  1. استخدم scp لنسخ الملفات إلى مجموعة HDInsight. تحرير الأمر وإدخاله:

    scp pigudf.py sshuser@mycluster-ssh.azurehdinsight.net:
    
  2. استخدم SSH للاتصال بالمجموعة. تحرير الأمر وإدخاله:

    ssh sshuser@mycluster-ssh.azurehdinsight.net
    
  3. من جلسة SSH، أضف ملفات Python التي تم تحميلها مسبقًا إلى تخزين المجموعة.

    hdfs dfs -put pigudf.py /pigudf.py
    

استخدام Apache Pig المعرّف من قبل المستخدم (shell)

  1. للاتصال بـ Apache Pig، استخدم الأمر التالي من جلسة SSH المفتوحة:

    pig
    
  2. أدخل العبارات التالية في موجه grunt>:

    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. يجب أن تبدأ الوظيفة بعد إدخال السطر التالي. بمُجرد اكتمال الوظيفة، يرجع ناتج مشابهًا للبيانات التالية:

    ((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. استخدم quit لإغلاق Grunt shell، ثم استخدم ما يلي لتحرير ملف pigudf.py على نظام الملفات المحلي:

    nano pigudf.py
    
  5. بمجرد دخولك للمحرر، أزل التعليق من السطر التالي عن طريق إزالة الحرف # من بداية السطر:

    #from pig_util import outputSchema
    

    يعدل هذا الخط برنامج Python النصي للعمل مع C Python بدلًا من Jython. بمجرد إجراء التغيير، استخدم الاختصار Ctrl+X للخروج من المحرر. حدد Y، ثم Enter لحفظ التغييرات.

  6. استخدم الأمر pig لبدء shell مرة أخرى. بمجرد أن تكون في موجه grunt>، استخدم ما يلي لتشغيل برنامج Python النصي باستخدام مترجم 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;
    

    بمجرد إكمال هذه الوظيفة، يجب أن تشاهد نفس النتاج كما هو الحال عندما قمت بتشغيل البرنامج النصي باستخدام Jython.

تحميل ملف (PowerShell)

يمكن كذلك استخدام PowerShell لتشغيل استعلامات Apache Hive عن بعد. تأكد من أن الدليل المشغَّل هو مكان تواجد pigudf.py. استخدم برنامج PowerShell النصي التالي لتشغيل استعلام Apache Hive الذي يستخدم البرنامج النصي 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

استخدم Apache Pig المعرّف من قبل المستخدم (PowerShell)

ملاحظة

عند إرسال وظيفة عن بعد باستخدام PowerShell، لا يمكن استخدام C Python كمترجم فوري.

كما يمكن أن يُستخدم PowerShell لتشغيل وظائف Apache Pig Latin. استخدم برنامج PowerShell النصي التالي لتشغيل وظيفة Apache Pig الذي يستخدم البرنامج النصي pigudf.py:

# 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

يجب أن يظهر ناتج وظيفة Apache Pig مشابهًا للبيانات التالية:

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

استكشاف الأخطاء وإصلاحها

أخطاء عند تشغيل الوظائف

عند تشغيل وظيفة Apache Hive، قد تواجه خطأ مشابهًا للنص التالي:

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.

قد تحدث هذه المشكلة بسبب نهايات الأسطر في ملف Python. العديد من محرري Windows يستخدمون CRLF بصورة افتراضية كنهاية الخط، ولكن تطبيقات Linux عادة ما تتوقع LF.

يمكنك استخدام عبارات PowerShell التالية لإزالة أحرف CR قبل تحميل الملف إلى HDInsight:

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

# Wait for completion or failure of specified job

برامج PowerShell النصية

يحتوي كلا المثالين من برامج PowerShell النصية المستخدمة لتشغيل الأمثلة على سطر التعليق الذي يعرض ناتج الخطأ للمهمة. إذا لم تشاهد الإخراج المتوقع للوظيفة، فقم بإلغاء تعليق السطر التالي وانظر إذا كانت معلومات الخطأ تشير إلى وجود مشكلة.

$activity="Pig job"

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

يتم كذلك تسجيل معلومات الخطأ (STDERR) ونتيجة المهمة (STDOUT) إلى تخزين HDInsight.

لوظيفة... انظر إلى هذه الملفات في حاوية الكائن الثنائي كبير الحجم
Apache Hive /HivePython/stderr

/HivePython/stdout

Apache Pig /PigPython/stderr

/PigPython/stdout

الخطوات التالية

إذا كنت بحاجة إلى تحميل وحدات Python التي لا تتوفر بشكل افتراضي، فشاهد كيفية توزيع وحدة نمطية إلى Azure HDInsight.

لطرق أخرى لاستخدام Apache Pig وApache Hive والتعرف على استخدام MapReduce، راجع المستندات التالية: