Azure HDInsight kullanarak Apache Hadoop HDFS sorunlarını giderme

Hadoop Dağıtılmış Dosya Sistemi (HDFS) ile çalışırken karşılaşılan en önemli sorunları ve çözümleri öğrenin. Komutların tam listesi için bkz . HDFS Komutları Kılavuzu ve Dosya Sistemi Kabuğu Kılavuzu.

Yerel HDFS'ye bir kümenin içinden erişmek Nasıl yaparım??

Sorun

HDInsight kümesinin içinden Azure Blob depolama veya Azure Data Lake Depolama kullanarak yerine komut satırından ve uygulama kodundan yerel HDFS'ye erişin.

Çözüm adımları

  1. Komut isteminde, aşağıdaki komutta olduğu gibi tam anlamıyla kullanın 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. Kaynak kodundan, aşağıdaki örnek uygulamada olduğu gibi URI'yi hdfs://mycluster/ tam anlamıyla kullanın:

    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. Derlenmiş .jar dosyasını (örneğin, adlı java-unit-tests-1.0.jarbir dosya) HDInsight kümesinde aşağıdaki komutla çalıştırın:

    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
    

Bloba yazma için Depolama özel durumu

Sorun

HBase kümesinde hadoop yaklaşık 12 GB veya daha büyük dosyalar yazmak için veya hdfs dfs komutlarını kullanırken aşağıdaki hatayla karşılaşabilirsiniz:

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

Neden

HDInsight kümelerinde HBase, Azure depolamaya yazarken varsayılan olarak 256 KB blok boyutuna ayarlanır. HBase API'leri veya REST API'leri için çalışırken veya hdfs dfs komut satırı yardımcı programları kullanılırken hatayla hadoop sonuçlanır.

Çözüm

Daha büyük bir blok boyutu belirtmek için kullanın fs.azure.write.request.size . Parametresini kullanarak -D bu değişikliği kullanım başına temelinde yapabilirsiniz. Aşağıdaki komut, komutuyla bu parametreyi hadoop kullanan bir örnektir:

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

Apache Ambari kullanarak da değerini genel olarak artırabilirsiniz fs.azure.write.request.size . Ambari Web kullanıcı arabirimindeki değeri değiştirmek için aşağıdaki adımlar kullanılabilir:

  1. Tarayıcınızda kümenizin Ambari Web kullanıcı arabirimine gidin. URL, https://CLUSTERNAME.azurehdinsight.netCLUSTERNAME burada kümenizin adıdır. İstendiğinde kümenin yönetici adını ve parolasını girin.

  2. Ekranın sol tarafından HDFS'yi ve ardından Yapılandırmalar sekmesini seçin.

  3. Filtre... alanına girinfs.azure.write.request.size.

  4. 262144 (256 KB) olan değeri yeni değerle değiştirin. Örneğin, 4194304 (4 MB).

    Image of changing the value through Ambari Web UI.

Ambari kullanma hakkında daha fazla bilgi için bkz . Apache Ambari Web kullanıcı arabirimini kullanarak HDInsight kümelerini yönetme.

Du

Komut, -du belirli bir dizinde yer alan dosya ve dizinlerin boyutlarını veya yalnızca bir dosya olması durumunda dosyanın uzunluğunu görüntüler.

seçeneği -s , görüntülenen dosya uzunluklarının toplam özetini oluşturur.
-h seçeneği, dosya boyutlarını biçimlendirmektedir.

Örnek:

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

Rm

-rm komutu, bağımsız değişken olarak belirtilen dosyaları siler.

Örnek:

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

Sonraki adımlar

Sorununuzu görmediyseniz veya sorununuzu çözemiyorsanız daha fazla destek için aşağıdaki kanallardan birini ziyaret edin:

  • Azure Topluluk Desteği aracılığıyla Azure uzmanlarından yanıt alın.

  • @AzureSupport ile Bağlan - müşteri deneyimini geliştirmeye yönelik resmi Microsoft Azure hesabı. Azure topluluğunun doğru kaynaklara Bağlan: yanıtlar, destek ve uzmanlar.

  • Daha fazla yardıma ihtiyacınız varsa Azure portalından bir destek isteği gönderebilirsiniz. Menü çubuğundan Destek'i seçin veya Yardım + destek hub'ını açın. Daha ayrıntılı bilgi için bkz. Azure desteği isteği oluşturma. Abonelik Yönetimi’ne ve faturalandırma desteğine erişim Microsoft Azure aboneliğinize dahildir, Teknik Destek ise herhangi bir Azure Destek Planı üzerinden sağlanır.