استكشاف أخطاء Apache Hadoop HDFS وإصلاحها باستخدام Azure HDInsight

تعرف على أهم المشكلات والحلول عند العمل مع نظام الملفات الموزعة Hadoop (HDFS). للحصول على قائمة كاملة بالأوامر، راجع دليل أوامر HDFS ودليل Shell System Shell.

كيف يمكنني الوصول إلى HDFS المحلي من داخل نظام مجموعة؟

المشكلة

قم بالوصول إلى HDFS المحلي من سطر الأوامر والتعليمات البرمجية للتطبيق بدلاً من استخدام تخزين Azure Blob أو تخزين Azure Data Lake من داخل نظام مجموعة HDInsight.

خطوات القرار

  1. في موجه الأوامر، استخدم hdfs dfs -D "fs.default.name=hdfs://mycluster/" ... حرفياً، كما في الأمر التالي:

    hdfs dfs -D "fs.default.name=hdfs://mycluster/" -ls /
    Found 3 items
    drwxr-xr-x   - hdiuser hdfs          0 2017-03-24 14:12 /EventCheckpoint-30-8-24-11102016-01
    drwx-wx-wx   - hive    hdfs          0 2016-11-10 18:42 /tmp
    drwx------   - hdiuser hdfs          0 2016-11-10 22:22 /user
    
  2. من التعليمات البرمجية المصدر، استخدم URI hdfs://mycluster/ حرفياً، كما في نموذج التطبيق التالي:

    import java.io.IOException;
    import java.net.URI;
    import org.apache.commons.io.IOUtils;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    
    public class JavaUnitTests {
    
        public static void main(String[] args) throws Exception {
    
            Configuration conf = new Configuration();
            String hdfsUri = "hdfs://mycluster/";
            conf.set("fs.defaultFS", hdfsUri);
            FileSystem fileSystem = FileSystem.get(URI.create(hdfsUri), conf);
            RemoteIterator<LocatedFileStatus> fileStatusIterator = fileSystem.listFiles(new Path("/tmp"), true);
            while(fileStatusIterator.hasNext()) {
                System.out.println(fileStatusIterator.next().getPath().toString());
            }
        }
    }
    
  3. قم بتشغيل ملف jar. المترجم (على سبيل المثال، ملف باسم java-unit-tests-1.0.jar) على نظام مجموعة HDInsight باستخدام الأمر التالي:

    hadoop jar java-unit-tests-1.0.jar JavaUnitTests
    hdfs://mycluster/tmp/hive/hive/5d9cf301-2503-48c7-9963-923fb5ef79a7/inuse.info
    hdfs://mycluster/tmp/hive/hive/5d9cf301-2503-48c7-9963-923fb5ef79a7/inuse.lck
    hdfs://mycluster/tmp/hive/hive/a0be04ea-ae01-4cc4-b56d-f263baf2e314/inuse.info
    hdfs://mycluster/tmp/hive/hive/a0be04ea-ae01-4cc4-b56d-f263baf2e314/inuse.lck
    

استثناء التخزين للكتابة على blob

المشكلة

عند استخدام الأمرين hadoop أو hdfs dfs لكتابة ملفات بحجم 12 غيغابايت تقريباً أو أكبر على نظام مجموعة HBase، قد تصادف الخطأ التالي:

ERROR azure.NativeAzureFileSystem: Encountered Storage Exception for write on Blob : example/test_large_file.bin._COPYING_ Exception details: null Error Code : RequestBodyTooLarge
copyFromLocal: java.io.IOException
        at com.microsoft.azure.storage.core.Utility.initIOException(Utility.java:661)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:366)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:350)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Caused by: com.microsoft.azure.storage.StorageException: The request body is too large and exceeds the maximum permissible limit.
        at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:89)
        at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:307)
        at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:182)
        at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlockInternal(CloudBlockBlob.java:816)
        at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlock(CloudBlockBlob.java:788)
        at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:354)
        ... 7 more

السبب

HBase على مجموعات HDInsight الافتراضي إلى حجم كتلة 256 كيلو بايت عند الكتابة إلى تخزين Azure. أثناء عمله مع واجهات برمجة تطبيقات HBase أو واجهات برمجة تطبيقات REST، فإنه ينتج عنه خطأ عند استخدام أدوات سطر الأوامر hadoop أو hdfs dfs.

نوع الحل

استخدم fs.azure.write.request.size لتحديد حجم كتلة أكبر. يمكنك إجراء هذا التعديل على أساس كل استخدام باستخدام المعلمة -D. الأمر التالي هو مثال على استخدام هذه المعلمة مع الأمر hadoop :

hadoop -fs -D fs.azure.write.request.size=4194304 -copyFromLocal test_large_file.bin /example/data

يمكنك أيضاً زيادة قيمة fs.azure.write.request.size بشكل عام باستخدام Apache Ambari. يمكن استخدام الخطوات التالية لتغيير القيمة في Ambari Web UI:

  1. في المستعرض الخاص بك، انتقل إلى Ambari Web UI لمجموعتك. عنوان URL هو https://CLUSTERNAME.azurehdinsight.net، حيث CLUSTERNAME هو اسم مجموعتك. عند المطالبة، أدخل اسم المسؤول وكلمة المرور للنظام مجموعة.

  2. من الجانب الأيسر من الشاشة، حدد HDFS، ثم حدد علامة التبويب Configs.

  3. في الحقل ...Filter، أدخل fs.azure.write.request.size.

  4. قم بتغيير القيمة من 262144 (256 كيلو بايت) إلى القيمة الجديدة. على سبيل المثال، 4194304 (4 ميجابايت).

    Image of changing the value through Ambari Web UI.

لمزيد من المعلومات حول استخدام Ambari، راجع إدارة مجموعات HDInsight باستخدام Apache Ambari Web UI.

DU

يعرض الأمر -du أحجام الملفات والأدلة الموجودة في الدليل المحدد أو طول الملف في حال كان ممخزون ملف.

ينتج عن الخيار -s ملخصاً مجمعاً لأطوال الملفات التي يتم عرضها.
يقوم الخيار -h بتنسيق أحجام الملفات.

مثال:

hdfs dfs -du -s -h hdfs://mycluster/
hdfs dfs -du -s -h hdfs://mycluster/tmp

rm

يحذف الأمر -rm الملفات المحددة كوسائط.

مثال:

hdfs dfs -rm hdfs://mycluster/tmp/testfile

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

إذا لم تشاهد مشكلتك أو لم تتمكن من حلها، فتفضل بزيارة إحدى القنوات التالية للحصول على مزيد من الدعم:

  • احصل على إجابات من خبراء Azure عبر دعم مجتمع Azure.

  • تواصل مع @AzureSupport - حساب Microsoft Azure الرسمي لتحسين تجربة العملاء. توصيل الموارد المناسبة إلى مجتمع Azure: الإجابات، والدعم، والخبراء.

  • إذا كنت بحاجة إلى مزيد من المساعدة، فيمكنك إرسال طلب دعم من مدخل Microsoft Azure. حدد Support من شريط القائمة أو افتح المحور Help + support. لمزيد من المعلومات التفصيلية، راجع كيفية إنشاء طلب دعم Azure. يتم تضمين الوصول إلى إدارة الاشتراك ودعم الفواتير في اشتراك Microsoft Azure، ويتم توفير الدعم التقني من خلال إحدى خطط دعم Azure.