HDFS balancer menganalisis distribusi blok dan mendistribusikan ulang data di antara DataNode untuk menjaga pemanfaatan penyimpanan yang merata di seluruh kluster Anda.
Latar Belakang
HDFS menggunakan arsitektur master-slave. NameNode mengelola metadata sistem file, seperti nama file dan lokasi blok data, sedangkan beberapa DataNode menyimpan blok data aktual. Arsitektur ini memungkinkan redundansi data dan meningkatkan toleransi kesalahan sistem.
Seiring waktu, operasi seperti penambahan, penghapusan, dan modifikasi file dapat menyebabkan distribusi data yang tidak merata di antara DataNode. Beberapa node mungkin mendekati kapasitas penyimpanannya, sementara yang lain memiliki ruang kosong yang cukup. Ketidakseimbangan ini memengaruhi efisiensi penyimpanan dan meningkatkan risiko kehilangan data karena node yang terlalu penuh lebih rentan terhadap kegagalan perangkat keras.
Untuk mengatasi masalah ini, HDFS menyediakan HDFS balancer, yaitu utilitas command line yang memindahkan blok data di antara DataNode guna mengurangi ketidakseimbangan penyimpanan dan meningkatkan pemanfaatan resource.
View kapasitas dan penggunaan DataNode
Periksa kapasitas dan penggunaan DataNode untuk mengidentifikasi ketidakseimbangan penyimpanan dan menentukan apakah diperlukan penyeimbangan ulang.
-
Sambungkan ke node master kluster target. Untuk informasi lebih lanjut, lihat Connect to a cluster.
-
Jalankan perintah berikut untuk melihat kapasitas dan penggunaan setiap DataNode.
hdfs dfsadmin -report
Output menampilkan kapasitas total, ruang yang digunakan, persentase penggunaan, dan ruang tersisa setiap DataNode.
Jalankan HDFS balancer ketika perbedaan penggunaan penyimpanan antar DataNode melebihi ambang batas yang dikonfigurasi (secara default 10%).
Jalankan HDFS balancer
Metode 1: Gunakan perintah hdfs balancer
Sintaks perintah hdfs balancer adalah sebagai berikut:
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-source [-f <hosts-file> | <comma-separated list of hosts>]]
[-blockpools <comma-separated list of blockpool ids>]
[-idleiterations <idleiterations>]
Tabel berikut menjelaskan parameter utama untuk balancer.
|
Parameter |
Description |
|
threshold |
Persentase deviasi yang diizinkan dari rata-rata penggunaan disk di seluruh kluster. Nilai default-nya adalah 10%, artinya penggunaan setiap DataNode harus berada dalam kisaran ±10% dari rata-rata kluster. Ketika penggunaan keseluruhan kluster tinggi, Anda sebaiknya menurunkan nilai ini agar balancer tidak gagal menemukan blok yang dapat dipindahkan. Ketika Anda menambahkan banyak node baru ke kluster, Anda dapat meningkatkan nilai ini untuk mempercepat perpindahan data dari node dengan penggunaan tinggi ke node dengan penggunaan rendah. |
|
policy |
Kebijakan penyeimbangan. Kebijakan berikut didukung:
|
|
exclude |
Mengecualikan DataNode tertentu dari operasi penyeimbangan. |
|
include |
Hanya menyertakan DataNode tertentu dalam operasi penyeimbangan. |
|
source |
Menentukan DataNode mana yang dapat menjadi sumber perpindahan data. |
|
blockpools |
Menjalankan balancer hanya pada block pool yang ditentukan. |
|
idleiterations |
Jumlah maksimum iterasi idle sebelum balancer keluar. Nilai ini menggantikan nilai default 5. |
Metode 2: Gunakan tool start-balancer.sh
Skrip start-balancer.sh merupakan wrapper yang memanggil perintah hdfs daemon start balancer. Untuk menggunakan skrip ini, ikuti langkah-langkah berikut:
-
Sambungkan ke salah satu node dalam kluster target. Untuk informasi lebih lanjut, lihat Connect to a cluster.
-
Opsional: Jalankan perintah berikut untuk mengatur bandwidth maksimum balancer.
hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>CatatanParameter
<bandwidth in bytes per second>menentukan bandwidth maksimum. Misalnya, untuk mengatur bandwidth menjadi 200 MB/detik, nilainya adalah 209.715.200 (200 × 1024 × 1024 byte). Perintah lengkapnya adalahhdfs dfsadmin -setBalancerBandwidth 209715200. Untuk mengoptimalkan penggunaan jaringan dan melindungi layanan kritis selama periode beban tinggi, kami merekomendasikan mengurangi bandwidth penyeimbangan, misalnya menjadi 20.971.520 (20 MB/detik). Selama jam sepi, Anda dapat meningkatkan bandwidth, misalnya menjadi 1.073.741.824 (1 GB/detik), untuk mempercepat proses penyeimbangan. -
Jalankan perintah berikut untuk beralih ke pengguna
hdfsdan mengeksekusi skrip balancer.-
DataLake cluster
su hdfs /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5 -
Hadoop cluster
su hdfs /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5CatatanParameter
-threshold 5mengatur ambang batas penyeimbangan. Ambang batas 5% berarti balancer menganggap DataNode seimbang jika penggunaan penyimpanannya berada dalam kisaran ±5% dari rata-rata penggunaan kluster. Balancer tidak akan memindahkan blok data ke atau dari node tersebut. Anda dapat menyesuaikan nilai ini untuk mencapai keseimbangan yang diinginkan di lingkungan Anda.
-
-
Jalankan perintah berikut untuk memantau progres balancer.
-
DataLake cluster
tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log -
Hadoop cluster
tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.logCatatanNama file log
hadoop-hdfs-balancer-master-1-1.c-xxx.logdanhadoop-hdfs-balancer-emr-header-xx.cluster-xxx.loghanyalah contoh. Gunakan nama file log aktual dari kluster Anda.
Jika output berisi kata
Successfully, operasi berhasil. -
Menyesuaikan parameter balancer
Balancer mengonsumsi resource sistem, sehingga sebaiknya dijalankan selama jam sepi. Secara default, tidak diperlukan penyesuaian parameter. Jika diperlukan penyesuaian, buka halaman layanan HDFS di Konsol E-MapReduce, pilih , lalu sesuaikan konfigurasi berikut.
-
Konfigurasi klien
Parameter
Description
dfs.balancer.dispatcherThreads
Sebelum memindahkan blok data, balancer mengambil daftar blok pada setiap iterasi dan mendistribusikannya ke thread mover.
CatatanParameter dispatcherThreads menentukan jumlah thread untuk tugas distribusi ini. Nilai default-nya adalah 200.
dfs.balancer.rpc.per.sec
Jumlah RPC yang dikirim per detik. Nilai default-nya adalah 20.
Thread dispatcher melakukan banyak panggilan RPC
getBlockske NameNode. Untuk mencegah beban berlebihan pada NameNode, Anda dapat mengontrol laju RPC ini.Misalnya, pada kluster dengan beban tinggi, Anda dapat mengurangi nilai ini menjadi 10 atau 5. Hal ini memiliki dampak minimal terhadap progres keseluruhan perpindahan data.
dfs.balancer.getBlocks.size
Pada setiap iterasi, balancer mengambil daftar blok untuk thread mover. Parameter ini mengatur ukuran total blok dalam daftar tersebut, dengan nilai default 2 GB. Karena proses
getBlocksmengunci NameNode, Anda dapat menyesuaikan nilai ini berdasarkan beban saat ini pada NameNode.dfs.balancer.moverThreads
Jumlah thread yang memindahkan blok data. Setiap thread menangani satu perpindahan blok.
Nilai default-nya adalah 1000.
-
Konfigurasi DataNode
Parameter
Description
dfs.datanode.balance.bandwidthPerSec
Menentukan bandwidth yang dapat digunakan oleh DataNode untuk penyeimbangan. Pengaturan yang direkomendasikan adalah 100 MB/detik. Anda juga dapat menyesuaikan nilai ini secara dinamis dengan perintah dfsadmin -setBalancerBandwidth tanpa harus me-restart DataNode.
Misalnya, tingkatkan bandwidth selama periode beban rendah dan kurangi selama periode beban tinggi.
dfs.datanode.balance.max.concurrent.moves
Jumlah maksimum blok yang dapat dipindahkan secara bersamaan oleh DataNode. Nilai default-nya adalah 5.
Biasanya, nilai ini harus sesuai dengan jumlah disk. Kami menyarankan untuk menetapkan batas atas
4 * <number disks="" id="37b28fc25e9tt" of=""></number>di sisi DataNode, lalu menyetelnya menggunakan balancer.Misalnya, jika DataNode memiliki 28 disk, Anda dapat mengatur nilainya menjadi 28 di sisi balancer dan menjadi
28 * 4di sisi DataNode. Sesuaikan nilai-nilai tersebut berdasarkan beban kluster. Tingkatkan jumlah perpindahan konkuren saat beban rendah, dan kurangi saat beban tinggi.
FAQ
Q: Mengapa perbedaan penggunaan antar node masih sekitar 20% setelah penyeimbangan, meskipun ambang batas diatur ke 10%?
A: Parameter threshold memastikan bahwa penggunaan setiap DataNode tidak menyimpang lebih dari persentase yang ditentukan dari penggunaan rata-rata kluster. Oleh karena itu, setelah penyeimbangan, selisih penggunaan antara node dengan pemanfaatan tertinggi dan terendah dapat mencapai dua kali lipat ambang batas. Misalnya, satu node mungkin 10% di atas rata-rata, sementara yang lain 10% di bawah, sehingga menghasilkan selisih 20% di antara keduanya. Untuk mengurangi selisih ini, coba atur threshold ke nilai yang lebih kecil, seperti 5%.