Bagikan melalui


Memecahkan masalah Apache Hadoop HDFS menggunakan Azure HDInsight

Pelajari masalah dan resolusi teratas saat menggunakan Hadoop Distributed File System (HDFS). Untuk daftar lengkap perintah, lihat Panduan Perintah HDFS dan Panduan Shell Sistem File.

Bagaimana cara mengakses HDFS lokal dari dalam kluster?

Masalah

Dapatkan akses HDFS lokal dari baris perintah dan kode aplikasi dan bukan menggunakan penyimpanan Azure Blob atau Azure Data Lake Storage dari dalam kluster HDInsight.

Langkah-langkah resolusi

  1. Pada perintah, gunakan hdfs dfs -D "fs.default.name=hdfs://mycluster/" ... secara harfiah, seperti dalam perintah berikut:

    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. Dari kode sumber, gunakan URI hdfs://mycluster/ secara harfiah, seperti dalam aplikasi sampel berikut:

    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. Jalankan file .jar yang dikompilasi (contohnya, file bernama java-unit-tests-1.0.jar) pada kluster HDInsight dengan perintah berikut:

    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
    

Pengecualian penyimpanan untuk menulis pada blob

Masalah

Saat menggunakan perintah hadoop atau hdfs dfs untuk menulis file yang ~12 GB atau lebih besar pada kluster HBase, Anda mungkin menemukan eror berikut:

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

Penyebab

HBase pada kluster HDInsight secara default kembali ke ukuran blok 256 KB saat menulis ke penyimpanan Azure. Meski berfungsi dengan baik untuk API HBase atau API REST, hal itu menghasilkan eror jika menggunakan utilitas baris perintah hadoop atau hdfs dfs.

Resolusi

Gunakan fs.azure.write.request.size untuk menentukan ukuran blok yang lebih besar. Anda dapat melakukan modifikasi ini berdasarkan per penggunaan dengan menggunakan parameter -D. Perintah berikut adalah contoh penggunaan parameter ini dengan perintah hadoop:

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

Anda juga dapat meningkatkan nilai fs.azure.write.request.size secara global dengan menggunakan Apache Ambari. Langkah-langkah berikut dapat digunakan untuk mengubah nilai di Ambari Web UI:

  1. Di browser Anda, buka Ambari Web UI untuk kluster Anda. URL adalah https://CLUSTERNAME.azurehdinsight.net, di mana CLUSTERNAME adalah nama kluster Anda. Ketika diminta, masukkan nama dan sandi untuk kluster.

  2. Dari sisi kiri layar, pilih HDFS, lalu pilih tab Konfigurasi.

  3. Pada bidang Filter, masukkan fs.azure.write.request.size.

  4. Ubah nilai dari 262144 (256 KB) ke nilai baru. Contohnya, 4194304 (4 MB).

    Gambar mengubah nilai melalui Ambari Web UI.

Untuk informasi selengkapnya tentang penggunan Ambari, lihat Mengelola kluster HDInsight menggunakan Apache Ambari Web UI.

du

Perintah -dumenampilkan ukuran file dan direktori yang terkandung dalam direktori yang diberikan atau panjang file jika hanya berupa file.

Opsi -s menghasilkan ringkasan agregat dari panjang file yang ditampilkan.
Opsi -h memformat ukuran file.

Contoh:

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

rm

Perintah -rm menghapus file yang ditentukan sebagai argumen.

Contoh:

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

Langkah berikutnya

Jika Anda tidak melihat masalah atau tidak dapat memecahkan masalah, kunjungi salah satu saluran berikut untuk mendapatkan dukungan lebih lanjut:

  • Dapatkan jawaban dari para ahli Azure melalui Dukungan Komunitas Azure.

  • Hubungi @AzureSupport - akun Microsoft Azure resmi untuk meningkatkan pengalaman pelanggan. Menghubungkan komunitas Microsoft Azure ke sumber daya yang tepat: jawaban, dukungan, dan pakar.

  • Jika Anda memerlukan bantuan lainnya, Anda dapat mengirimkan permintaan dukungan dari portal Microsoft Azure. Pilih Dukungan dari bilah menu atau buka hub Bantuan + Dukungan. Untuk informasi selengkapnya, tinjau Cara membuat permintaan dukungan Microsoft Azure. Akses ke Manajemen Langganan dan dukungan tagihan disertakan dengan langganan Microsoft Azure, dan Dukungan Teknis disediakan melalui salah satu Paket Dukungan Azure.