Hadoop merupakan framework terdistribusi yang digunakan untuk menyimpan dan memproses file berukuran besar. Hadoop Distributed File System (HDFS) adalah salah satu komponen utama dari Hadoop yang menangani penyimpanan data. Komponen lain dari Hadoop adalah MapReduce yang menangani komputasi, dan Yarn yang menangani manajemen proses dan sumber daya dalam klaster Hadoop.
Artikel ini akan membahas mengenai perintah-perintah yang banyak digunakan untuk mengakses dan memproses data di HDFS.
Sebelum dapat menjalankan perintah hdfs, pastikan bahwa service hadoop sudah berjalan dan dapat diakses dari terminal yang kita gunakan.
Gunakan perintah jps untuk menampilkan service yang berjalan
hadoop fs atau hdfs dfs?
Hadoop menyediakan dua cara untuk memanggil perintah-perintah terkait sistem file, yaitu hadoop fs dan hdfs dfs
Kedua cara tersebut menggunakan perintah dan parameter yang sama, dan menghasilkan output yang relatif sama. Perbedaan antara kedua perintah tersebut adalah, hadoop fs dapat juga digunakan untuk S3, Azure, Cassandra, dll. Sedangkan hdfs dfs khusus digunakan untuk Hadoop (hdfs) saja. Sebelumnya perintah khusus untuk hdfs adalah hadoop dfs, akan tetapi pilihan ini sudah deprecated, dan digantikan dengan hdfs dfs.
Perintah-perintah hadoop sangat mirip dengan perintah UNIX, sehingga cukup intuitif terutama bagi pengguna yang sudah familiar dengan UNIX commands.
Menampilkan bantuan : -help
Untuk menampilkan bantuan, gunakan perintah -help. Fungsi ini akan menampilkan daftar semua perintah yang tersedia untuk hadoop fs (perintah-perintah yang sama digunakan juga untuk hdfs dfs), diikuti dengan keterangan mengenai masing-masing perintah tersebut.
hdfs dfs -help
Menampilkan bantuan secara singkat : -usage
Jika opsi -help menampilkan informasi yang relatif lengkap mengenai perintah-perintah dalam hadoop fs, maka untuk menampilkan bantuan secara singkat, gunakan -usage.
hdfs dfs -usage [cmd]
Jika dipanggil tanpa parameter tambahan, perintah -usage akan menampilkan semua sintaks perintah hdfs.
Jika dipanggil dengan menyebutkan salah satu command tertentu, maka akan ditampilkan sintaks untuk perintah tersebut.
Misalnya, perintah berikut akan menampilkan sintaks atau cara penggunaan perintah ls
hdfs dfs -usage ls
Home directory
Secara default, perintah hdfs dfs yang dipanggil tanpa parameter path akan mengakses home directory dari user yang bersangkutan
Home directory di hdfs pada umumnya adalah /user/namauser. Biasanya hadoop admin yang bertugas membuatkan direktori sesuai nama user yang membutuhkan, dan memberikan akses direktori tersebut kepada user yang bersangkutan.
Misalnya untuk perintah ls. Jika user tidak memiliki home direktori, maka perintah hdfs dfs -ls akan memberikan pesan error ‘.’: No such file or directory.
Menampilkan list file : -ls
Sama dengan perintah ls pada UNIX. Sintaksnya adalah
hdfs dfs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] <args>
Secara default, perintah -ls tanpa menyebutkan absolute path, akan mengakses home direktori. Perintah berikut untuk user kmo
hdfs dfs -ls input
akan menampilkan konten dari direktori /user/kmo/input
Untuk menampilkan direktori /input, kita gunakan absolute path /input
hdfs dfs -ls /input
Untuk menampilkan semua file dan subdirektori dalam direktori /user, dan menampilkan ukurannya dalam human readable form
hdfs dfs -ls -R -h /user
Menampilkan isi sebuah file : -cat
Serupa dengan perintah cat pada UNIX
hdfs dfs -cat [-ignoreCrc] URI [URI ...]
Untuk menampilkan file /user/kmo/input/buah.txt
hdfs dfs -cat input/buah.txt
Membuat direktori : -mkdir
hadoop fs -mkdir [-p] <paths>
Secara default, current user akan menjadi owner dari direktori yang terbentuk.
Parameter -p fungsinya mirip dengan parameter -p pada perintah UNIX mkdir, yaitu :
tidak mengembalikan error jika direktori sudah ada, atau
jika parent direktori belum ada, maka secara otomatis akan dibuatkan
Misalnya kita membuat direktori /user/kmo/dir1/dir2/dir3, tanpa parameter -p perintah akan gagal dengan pesan error "mkdir: `hdfs://localhost:9000/user/kmo/dir1/dir2': No such file or directory"
hdfs dfs -mkdir /user/kmo/dir1/dir2/dir3
Dengan parameter -p, parent directory dir1 dan dir2 akan dibuat secara otomatis
hdfs dfs -mkdir -p /dir1/dir2/dir3
Mengunggah file ke hdfs : -put atau -copyFromLocal
Untuk mengunggah atau menyalin file dari file sistem lokal ke hdfs, gunakan perintah put
hdfs dfs -put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] [ - | <localsrc> ...] <dest>
Untuk mengunggah file1.txt dari direktori input di lokal sistem ke direktori /user/kmo di hdfs
hdfs dfs -put input/file1.txt /user/kmo
Atau
hdfs dfs -copyFromLocal file1.txt /user/kmo
Kita bisa mengunggah beberapa file sekaligus dengan menulis nama-nama file yang akan diunggah, atau dengan menggunakan wildcard. Untuk mengunggah file1.txt dan file2.txt ke direktori /user/kmo
hdfs dfs -put file1.txt file2.txt /user/kmo
Atau
hdfs dfs -put file*.txt /user/kmo
Pastikan bahwa :
- Path dan nama file yang akan diunggah sudah sesuai
- User memiliki privilege untuk menulis ke direktori target di hdfs
- File dengan nama yang sama belum ada di direktori target
Untuk menimpa file yang lama (overwrite) jika file sudah ada, gunakan opsi -f
hdfs dfs -put -f file1.txt /user/kmo
Mengunduh file ke lokal : -get atau -copyToLocal
Untuk mendownload file dari hdfs ke file sistem lokal , gunakan perintah get atau copyToLocal
hdfs dfs -get [-ignorecrc] [-crc] [-p] [-f] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>
Untuk mengunduh file /user/kmo/file1.txt ke direktori /home/kmo/test di file system lokal
hdfs dfs -get /user/kmo/file1.txt /home/kmo/test
Atau
hdfs dfs -copyToLocal /user/kmo/file1.txt /home/kmo/test
Kita bisa mendownload beberapa file sekaligus dengan menulis nama-nama file yang akan diunggah, atau dengan menggunakan wildcard. Untuk mengunduh file1.txt dan file2.txt dari direktori /user/kmo
hdfs dfs -get /user/kmo/file1.txt /user/kmo/file2.txt /home/kmo/test
Atau
hdfs dfs -get /user/kmo/file*.txt /home/kmo/test
Jika file yang didownload sudah ada di direktori lokal, file akan mengembalikan pesan error. Untuk melakukan overwrite, gunakan parameter -f
hdfs dfs -get -f /user/kmo/file1.txt /user/kmo/file2.txt /home/kmo/test
Mengcopy file : -cp
Perintah -cp digunakan untuk menyalin file dari satu lokasi ke lokasi lain di hdfs. Pastikan bahwa user memiliki hak read untuk direktori source dan write untuk direktori target.
hdfs dfs -cp [-f] [-p | -p[topax]] [-t <thread count>] [-q <thread pool queue size>] URI [URI ...] <dest>
Mengkopi file1.txt dari direktori /input ke direktori output :
hdfs dfs -cp /input/file1.txt /output
Mengkopi lebih dari 1 file dapat dilakukan dengan menyebutkan semua nama file input, atau menggunakan wildcard. Target harus berupa direktori. Misalnya untuk mengkopi file1.txt dan file2.txt dari direktori input ke direktori output
hdfs dfs -cp /input/file1.txt /input/file2.txt /output
Atau
hdfs dfs -cp /input/file*.txt /output
Perintah cp akan error jika file sudah ada di direktori target. Untuk melakukan overwrite jika file sudah ada, gunakan opsi -f
hdfs dfs -cp -f /input/file1.txt /output
Memindahkan atau me-rename file : -mv
Perintah untuk memindahkan file dari satu lokasi ke lokasi lain di hdfs. Pastikan bahwa user memiliki hak akses untuk menulis di direktori source dan target/destinasi.
hdfs dfs -mv URI [URI ...] <dest>
Memindahkan file1.txt dari direktori input ke direktori output
hdfs dfs -mv /input/file1.txt /output
Memindahkan lebih dari 1 file dapat dilakukan dengan menyebutkan semua nama file input, atau menggunakan wildcard. Target harus berupa direktori.
Misalnya untuk memindahkan file1.txt dan file2.txt dari direktori /input ke direktori /output
hdfs dfs -mv /input/file1.txt /input/file2.txt /output
Atau
hdfs dfs -mv /input/file*.txt /output
Perintah mv akan gagal jika file dengan nama sama sudah ada di direktori target
Menghapus file : -rm
Perintah -rm digunakan untuk menghapus file dari hdfs. Serupa dengan perintah UNIX rm
hdfs dfs -rm [-f] [-r |-R] [-skipTrash] [-safely] URI [URI ...]
Misalnya untuk menghapus file1.txt di direktori output
hdfs dfs -rm /output/file1.txt
Untuk menghapus direktori beserta seluruh sub direktori dan file di dalamnya, gunakan perintah -r atau -R
Misalnya untuk menghapus direktori /user/kmo/input yang tidak kosong
hdfs dfs -rm -r /user/kmo/input
Jika trash diaktifkan, sistem akan memindahkan file yang dihapus ke direktori trash. Saat ini fitur trash pada hdfs dinonaktifkan secara default. Untuk mengaktifkan fitur tersebut, set parameter fs.trash.interval di file core-site.xml dengan nilai yang lebih besar dari 0.
Menghapus direktori : -rmdir
Perintah rmdir digunakan untuk menghapus direktori yang kosong.
hdfs dfs -rmdir [--ignore-fail-on-non-empty] URI [URI ...]
Misalnya untuk menghapus empty directory /user/kmo/test
hdfs dfs -rm -r /user/kmo/test
Untuk menghapus direktori yang tidak kosong (non-empty) beserta seluruh isinya, gunakan rm -r
Menampilkan awal file : -head
Perintah head menampilkan satu kilobyte pertama dari file ke stdout.
hdfs dfs -head /input/testfile.txt
Menampilkan akhir file : tail
Perintah tail menampilkan satu kilobyte terakhir dari file ke stdout.
hdfs dfs -tail /input/file1.txt
Mengunggah file ke hdfs dan menghapus file lokalnya : -moveFromLocal
Perintah moveFromLocal mirip dengan put, yaitu mengunggah file dari lokal file system ke hdfs, tetapi dengan menghapus file aslinya dari file sistem lokal.
hdfs fs -moveFromLocal <localsrc> <dest>
Untuk mengunggah file file1.txt dari direktori input di lokal ke direktori /input di hdfs, dan menghapus file file1.txt dari lokal sistem :
hdfs dfs -moveFromLocal input/file1.txt /input
Kita dapat mengunggah dan menghapus dari lokal beberapa file sekaligus. Misalnya untuk mengunggah dan menghapus file2.txt dan file3.txt dari direktori input di lokal file sistem, ke direktori /input di hdfs
hdfs dfs -moveFromLocal input/file2.txt input/file3.txt /input
Jika file dengan nama sama sudah ada di hdfs, perintah -moveFromLocal akan gagal/error
Untuk melakukan overwrite, gunakan parameter -f
hdfs dfs -moveFromLocal -f file1.txt /input
Mengunggah beberapa file ke dalam 1 file : -appendToFile
Untuk mengunggah beberapa file dari sistem file lokal ke dalam 1 file di hdfs, gunakan perintah -appendToFile
hadoop fs -appendToFile <localsrc> ... <dst>
Misalnya untuk meng-upload file1.txt dan file2.txt ke sebuah file satuFile.txt di direktori /input
hdfs dfs -appendToFile file1.txt file2.txt /input/satuFile.txt
Jika file /input/satuFile.txt sudah ada sebelumnya, maka yang diupload akan ditambahkan ke file tersebut.
Mengunduh beberapa file menjadi 1 file lokal : -getmerge
Perintah getmerge digunakan untuk mengunduh beberapa file dari hdfs ke dalam 1 file di file sistem lokal.
Misalnya untuk mengunduh file-file /output/file1.txt dan /output/file2.txt di hdfs ke dalam file file_merged.txt
hdfs dfs -getmerge /output/file1.txt /output/file2.txt file_merged.txt
Jika file dengan nama sama sudah ada di file sistem lokal, maka perintah -getmerge akan melakukan overwrite terhadap file tersebut.
Misalnya kita mendownload ulang file /output/file1.txt di hdfs ke dalam file_merged.txt dengan perintah -getmerged. File ini akan ditimpa/di-overwrite
hdfs dfs -getmerge /output/file1.txt file_merged.txt
Membuat file berukuran nol byte : -touchz
Perintah touchz digunakan untuk membuat file berukuran nol byte di sistem file HDFS.
Untuk membuat file /user/kmo/zerosize.dat berukuran 0 byte di hdfs
hdfs dfs -touchz /user/kmo/zerosize.dat
Jika file /input/zerosize.dat sudah ada sebelumnya, touchz akan memperbarui timestamp-nya.
Akan tetapi jika file tersebut ukurannya > 0 byte, touchz akan mengembalikan error.
Update timestamp file : -touch
Perintah touch digunakan untuk mengupdate timestap sebuah file di hdfs. Atau jika file belum ada, akan membuat file berukuran nol byte.
Misalnya untuk mengupdate timestamp file /user/kmo/file1.dat di hdfs
hdfs dfs -touch /user/kmo/file1.dat
Jika file tersebut belum ada, akan dibuat file 0 byte seperti pada perintah -touchz
hdfs dfs -touch /input/newfile.dat
Wrapping Up
HDFS merupakan komponen file sistem dalam framework Hadoop. Perintah-perintah dalam hdfs mirip dengan perintah pada UNIX shell, sehingga cukup intuitif bagi user yang sudah terbiasa dengan UNIX shell.