Az Apache Hadoop HDFS hibaelhárítása az Azure HDInsighttal

Ismerje meg a Hadoop Elosztott fájlrendszer (HDFS) használata során felmerülő leggyakoribb problémákat és megoldásokat. A parancsok teljes listáját a HDFS-parancsok útmutatójában és a fájlrendszerhéj-útmutatóban találja.

Hogyan elérni a helyi HDFS-t egy fürtön belülről?

Probléma

Az Azure Blob Storage vagy az Azure Data Lake Storage helyett a parancssorból és az alkalmazás kódjából érheti el a helyi HDFS-t a HDInsight-fürtből.

Megoldási lépések

  1. A parancssorban szó szerint használja hdfs dfs -D "fs.default.name=hdfs://mycluster/" ... a következő parancshoz hasonlóan:

    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. A forráskódból használja az URI-t hdfs://mycluster/ szó szerint, az alábbi mintaalkalmazáshoz hasonlóan:

    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. Futtassa a lefordított .jar fájlt (például egy nevű java-unit-tests-1.0.jarfájlt) a HDInsight-fürtön a következő paranccsal:

    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
    

Tárolási kivétel a blobon való íráshoz

Probléma

Ha egy hadoophdfs dfs HBase-fürtön ~12 GB-os vagy annál nagyobb fájlokat ír, a következő hibaüzenet jelenhet meg:

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

Ok

A HDInsight-fürtökön futó HBase alapértelmezés szerint 256 KB-os blokkméretre van beírva az Azure Storage-ba. Bár HBase API-khoz vagy REST API-khoz is használható, hibaüzenetet eredményez a hadoop parancssori segédprogramok használatakor hdfs dfs .

Resolution (Osztás)

Nagyobb blokkméret megadására használható fs.azure.write.request.size . Ezt a módosítást használatonként végezheti el a -D paraméter használatával. Az alábbi parancs egy példa erre a paraméterre a hadoop paranccsal:

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

Az Apache Ambari használatával globálisan is növelheti az értéket fs.azure.write.request.size . Az Ambari webes felhasználói felületén az alábbi lépésekkel módosíthatja az értéket:

  1. A böngészőben nyissa meg a fürt Ambari webes felhasználói felületét. Az URL-cím https://CLUSTERNAME.azurehdinsight.neta CLUSTERNAME fürt neve. Amikor a rendszer kéri, adja meg a fürt rendszergazdai nevét és jelszavát.

  2. A képernyő bal oldalán válassza a HDFS, majd a Konfigurációk lapot.

  3. A Szűrő... mezőbe írja be a következőtfs.azure.write.request.size:

  4. Módosítsa az értéket 262144 (256 KB) értékről az új értékre. Például 4194304 (4 MB).

    Image of changing the value through Ambari Web UI.

Az Ambari használatával kapcsolatos további információkért lásd : HDInsight-fürtök kezelése az Apache Ambari webes felhasználói felületén.

Du

A -du parancs megjeleníti az adott könyvtárban található fájlok és könyvtárak méretét, illetve a fájl hosszát, ha csak egy fájlról van szó.

A -s beállítás összesíti a megjelenített fájlhosszokat.
A -h beállítás formázja a fájlméreteket.

Példa:

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

Rm

Az -rm parancs argumentumként megadott fájlokat töröl.

Példa:

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

Következő lépések

Ha nem látja a problémát, vagy nem tudja megoldani a problémát, további támogatásért látogasson el az alábbi csatornák egyikére:

  • Azure-szakértőktől kaphat választ az Azure közösségi támogatásán keresztül.

  • Csatlakozás @AzureSupport – a hivatalos Microsoft Azure-fiók az ügyfélélmény javításához. Csatlakozás az Azure-közösséget a megfelelő erőforrásokhoz: válaszokhoz, támogatáshoz és szakértőkhöz.

  • Ha további segítségre van szüksége, támogatási kérelmet küldhet az Azure Portalról. Válassza a Támogatás lehetőséget a menüsávon, vagy nyissa meg a Súgó + támogatási központot. Részletesebb információkért tekintse át a Azure-támogatás kérések létrehozását ismertető cikket. Az előfizetés-kezeléssel és számlázással kapcsolatos támogatás a Microsoft Azure-előfizetés részét képezi, míg a technikai támogatást Azure-támogatási csomagjainkkal biztosítjuk.