All Products
Search
Document Center

E-MapReduce:HDFS Balancer

Last Updated:Mar 27, 2026

Saat file ditambahkan, dihapus, atau dimodifikasi dalam kluster E-MapReduce (EMR), distribusi data di seluruh DataNode dapat menjadi tidak merata: beberapa DataNode penuh, sementara yang lain sebagian besar menganggur. HDFS Balancer memindahkan blok data antar DataNode untuk mengoreksi ketidakseimbangan ini, sehingga mengurangi risiko kehilangan data dan meningkatkan efisiensi penyimpanan.

Cara kerja

Hadoop Distributed File System (HDFS) menggunakan arsitektur master-slave. NameNode mengelola metadata sistem file—seperti nama file, lokasi blok, dan informasi blok—sedangkan DataNode menyimpan blok data aktual.

Kluster dianggap seimbang jika penggunaan disk setiap DataNode tidak berbeda lebih dari ambang batas yang dikonfigurasi dibandingkan dengan rata-rata penggunaan disk keseluruhan kluster. Misalnya, dengan ambang batas default 10%, jika rata-rata penggunaan disk kluster adalah 40%, maka setiap DataNode harus berada dalam kisaran 30% hingga 50%. Dengan demikian, selisih maksimum antara DataNode dengan penggunaan tertinggi dan terendah dapat mencapai 20%.

Prasyarat

Sebelum memulai, pastikan Anda telah:

  • Mengakses node master kluster EMR Anda. Untuk detailnya, lihat Log on to a cluster.

  • Memiliki akun pengguna hdfs untuk menjalankan balancer.

Periksa penggunaan penyimpanan DataNode

Jalankan perintah berikut pada node master untuk melihat kapasitas dan penggunaan penyimpanan setiap DataNode:

hdfs dfsadmin -report

Output menampilkan kapasitas total, penyimpanan yang digunakan, penyimpanan tersisa, dan persentase penggunaan disk untuk setiap DataNode. Jika distribusi data sangat tidak merata—misalnya, saat penggunaan salah satu DataNode berbeda lebih dari ambang batas keseimbangan (default: 10%) dari rata-rata kluster—jalankan HDFS Balancer.

Jalankan HDFS balancer

Metode 1: Jalankan perintah hdfs balancer

Jalankan perintah berikut untuk memulai balancer dengan parameter opsional:

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>]
Parameter Default Deskripsi
threshold 10% Selisih maksimum yang diizinkan antara penggunaan disk suatu DataNode dan rata-rata penggunaan disk kluster. Misalnya, jika rata-rata penggunaan disk kluster adalah 40%, setiap DataNode harus berada di antara 30% hingga 50%. Untuk mencapai keseimbangan yang lebih ketat, atur nilai yang lebih rendah seperti 5%.
policy datanode Kebijakan penyeimbangan. datanode: kluster dianggap seimbang jika semua DataNode seimbang. blockpool: kluster dianggap seimbang jika semua block pool di setiap DataNode seimbang.
exclude DataNode yang dikecualikan dari proses penyeimbangan.
include DataNode yang disertakan dalam operasi penyeimbangan.
source DataNode yang digunakan sebagai sumber pemindahan blok.
blockpools Block pool tempat balancer dijalankan.
idleiterations 5 Jumlah maksimum iterasi menganggur sebelum balancer keluar.

Metode 2: Gunakan skrip start-balancer.sh

Anda juga dapat menggunakan tool start-balancer.sh dengan menjalankan perintah hdfs daemon start balancer. Untuk menggunakan tool tersebut, lakukan langkah-langkah berikut:

  1. Login ke sebuah node dalam kluster. Untuk detailnya, lihat Log on to a cluster.

  2. (Opsional) Atur bandwidth maksimum untuk balancer guna membatasi dampaknya terhadap beban kerja yang sedang berjalan:

    hdfs dfsadmin -setBalancerBandwidth <bandwidth in bytes per second>

    Atur nilai yang lebih rendah pada kluster dengan beban tinggi untuk melindungi pekerjaan yang sedang berjalan, dan nilai yang lebih tinggi pada kluster yang menganggur agar penyeimbangan selesai lebih cepat. Nilai umum:

    Target bandwidth Nilai (byte/detik) Perhitungan
    20 MB/detik (beban berat) 20971520 20 × 1024 × 1024
    200 MB/detik 209715200 200 × 1024 × 1024
    1 GB/detik (kluster menganggur) 1073741824 1 × 1024 × 1024 × 1024
  3. Beralih ke pengguna hdfs dan jalankan balancer:

    • Kluster DataLake:

      su hdfs
      /opt/apps/HDFS/hdfs-current/sbin/start-balancer.sh -threshold 5
    • Kluster Hadoop:

      su hdfs
      /usr/lib/hadoop-current/sbin/start-balancer.sh -threshold 5

    Flag -threshold 5 mengatur ambang batas keseimbangan menjadi 5%. Sesuaikan nilai ini sesuai kebutuhan Anda.

  4. Monitor log balancer untuk melacak progres:

    • Kluster DataLake:

      tail -f /var/log/emr/hadoop-hdfs/hadoop-hdfs-balancer-master-1-1.c-xxx.log
    • Kluster Hadoop:

      tail -f /var/log/hadoop-hdfs/hadoop-hdfs-balancer-emr-header-1.cluster-xxx.log

    Jika log berisi Successfully, berarti balancer telah selesai.

Setel HDFS balancer

Jalankan balancer selama jam sepi untuk meminimalkan dampak terhadap beban kerja produksi. Konfigurasi default sudah sesuai untuk sebagian besar kluster. Untuk menyesuaikan parameter, buka tab Configure pada halaman layanan HDFS di Konsol EMR dan klik hdfs-site.xml.

Parameter klien

Parameter Default Deskripsi
dfs.balancer.dispatcherThreads 200 Jumlah thread dispatcher yang digunakan untuk mengidentifikasi blok yang akan dipindahkan. Balancer berulang kali mengambil daftar blok hingga cukup banyak data dijadwalkan untuk ditransfer.
dfs.balancer.rpc.per.sec 20 Jumlah RPC yang dikirim oleh thread dispatcher per detik. Thread dispatcher mengirim RPC getBlocks() ke NameNode, yang dapat meningkatkan beban NameNode. Pada kluster dengan beban berat, kurangi nilai ini sebesar 5 atau 10 untuk membatasi dampak terhadap kinerja kluster secara keseluruhan.
dfs.balancer.getBlocks.size 2 GB Ukuran total data blok yang diambil dalam setiap panggilan getBlocks(). NameNode memegang lock saat memproses setiap RPC, sehingga nilai yang besar dapat memperlambat operasi tulis. Setel nilai ini berdasarkan beban NameNode.
dfs.balancer.moverThreads 1000 Jumlah total thread yang digunakan untuk memindahkan blok. Setiap pemindahan blok menggunakan satu thread.

Parameter DataNode

Parameter Default Deskripsi
dfs.datanode.balance.bandwidthPerSec Batas bandwidth per DataNode untuk operasi penyeimbangan. Atur ke 100 MB/detik sebagai titik awal. Sesuaikan nilai ini saat runtime menggunakan hdfs dfsadmin -setBalancerBandwidth tanpa perlu me-restart DataNode. Tingkatkan nilainya saat beban rendah; turunkan saat beban tinggi.
dfs.datanode.balance.max.concurrent.moves 5 Jumlah maksimum pemindahan blok bersamaan pada satu DataNode. Atur nilai ini ke 4 × jumlah disk sebagai batas atas. Misalnya, untuk DataNode dengan 28 disk, atur nilai sisi balancer menjadi 28 dan nilai sisi DataNode menjadi 112. Tingkatkan saat beban rendah; turunkan saat beban tinggi.

FAQ

Mengapa selisih antara DataNode masih sekitar 20% setelah menjalankan balancer dengan threshold diatur ke 10%?

Ini adalah perilaku yang diharapkan. Ambang batas mengontrol seberapa jauh penggunaan setiap DataNode boleh menyimpang dari rata-rata kluster—bukan seberapa jauh DataNode boleh menyimpang satu sama lain. Dengan ambang batas 10% dan rata-rata penggunaan kluster 40%, setiap DataNode berada dalam kisaran 30% hingga 50%, sehingga selisih maksimum antara dua DataNode mana pun adalah 20%. Untuk mengurangi selisih tersebut, turunkan ambang batas menjadi 5%.