Řešení potíží s Apache Hadoop HDFS s využitím Azure HDInsightu

Seznamte se s hlavními problémy a řešeními při práci se systémem souborů HDFS (Hadoop Distributed File System). Úplný seznam příkazů najdete v příručce k příkazům HDFS a průvodci prostředím systému souborů.

Návody přistupovat k místnímu SYSTÉMU HDFS z clusteru?

Problém

Přístup k místnímu HDFS z příkazového řádku a kódu aplikace místo pomocí služby Azure Blob Storage nebo Azure Data Lake Storage z clusteru HDInsight.

Kroky řešení

  1. Na příkazovém řádku použijte hdfs dfs -D "fs.default.name=hdfs://mycluster/" ... doslova jako v následujícím příkazu:

    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. Ze zdrojového kódu použijte identifikátor URI hdfs://mycluster/ doslova, jako v následující ukázkové aplikaci:

    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. Spusťte kompilovaný soubor .jar (například soubor s názvem java-unit-tests-1.0.jar) v clusteru HDInsight pomocí následujícího příkazu:

    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
    

Výjimka úložiště pro zápis do objektu blob

Problém

Při použití příkazů k hdfs dfs zápisu hadoop souborů, které jsou v clusteru HBase přibližně 12 GB nebo větší, může dojít k následující chybě:

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

Příčina

HBase v clusterech HDInsight má při zápisu do úložiště Azure výchozí velikost bloku 256 kB. I když funguje pro rozhraní API HBase nebo rozhraní REST API, při použití nástrojů příkazového hadoophdfs dfs řádku dojde k chybě.

Rozlišení

Slouží fs.azure.write.request.size k určení větší velikosti bloku. Tuto změnu můžete provést na základě použití pomocí parametru -D . Následující příkaz je příkladem použití tohoto parametru s příkazem hadoop :

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

Hodnotu fs.azure.write.request.size globálně můžete také zvýšit pomocí Apache Ambari. Pomocí následujících kroků můžete změnit hodnotu ve webovém uživatelském rozhraní Ambari:

  1. V prohlížeči přejděte do webového uživatelského rozhraní Ambari pro váš cluster. Adresa URL je https://CLUSTERNAME.azurehdinsight.net, kde CLUSTERNAME je název vašeho clusteru. Po zobrazení výzvy zadejte jméno a heslo správce clusteru.

  2. Na levé straně obrazovky vyberte HDFS a pak vyberte kartu Konfigurace .

  3. Do pole Filtr... zadejte fs.azure.write.request.size.

  4. Změňte hodnotu z 262144 (256 kB) na novou hodnotu. Například 4194304 (4 MB).

    Image of changing the value through Ambari Web UI.

Další informace o používání Ambari najdete v tématu Správa clusterů HDInsight pomocí webového uživatelského rozhraní Apache Ambari.

Du

Příkaz -du zobrazí velikosti souborů a adresářů obsažených v daném adresáři nebo délku souboru v případě, že jde jen o soubor.

Tato -s možnost vytvoří agregovaný souhrn zobrazovaných délek souboru.
Možnost -h formátuje velikosti souborů.

Příklad:

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

Rm

Příkaz -rm odstraní soubory zadané jako argumenty.

Příklad:

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

Další kroky

Pokud jste problém neviděli nebo nemůžete problém vyřešit, navštivte jeden z následujících kanálů, kde najdete další podporu:

  • Získejte odpovědi od odborníků na Azure prostřednictvím podpory komunity Azure.

  • Připojení s @AzureSupport – oficiálním účtem Microsoft Azure pro zlepšení zkušeností zákazníků. Připojení komunity Azure k správným prostředkům: odpovědi, podpora a odborníci.

  • Pokud potřebujete další pomoc, můžete odeslat žádost o podporu z webu Azure Portal. V řádku nabídek vyberte možnost Podpora nebo otevřete centrum nápovědy a podpory . Podrobnější informace najdete v tématu Vytvoření žádosti o podpora Azure. Součástí předplatného Microsoft Azure je přístup ke správě předplatného a podpora fakturace. Technická podpora se poskytuje prostřednictvím některého z plánů podpory Azure.