HBase
 sql >> Teknologi Basis Data >  >> NoSQL >> HBase

Pemisahan dan Penggabungan Wilayah Apache HBase

Pos blog ini dipublikasikan di Hortonworks.com sebelum merger dengan Cloudera. Beberapa tautan, sumber daya, atau referensi mungkin tidak lagi akurat.

Untuk posting ini, kami membahas secara mendalam salah satu area inti HBase. Secara khusus, kita akan melihat bagaimana Apache HBase mendistribusikan beban melalui wilayah, dan mengelola pemisahan wilayah. HBase menyimpan baris data dalam tabel. Tabel dipecah menjadi potongan-potongan baris yang disebut "wilayah". Wilayah tersebut didistribusikan di seluruh cluster, di-host dan tersedia untuk proses klien oleh proses RegionServer. Wilayah adalah rentang berkelanjutan dalam ruang kunci, artinya semua baris dalam tabel yang diurutkan antara kunci mulai wilayah dan kunci akhir disimpan di wilayah yang sama. Wilayah tidak tumpang tindih, yaitu kunci baris tunggal milik tepat satu wilayah pada titik waktu mana pun. Suatu wilayah hanya dilayani oleh satu server wilayah pada waktu tertentu, yang merupakan cara HBase menjamin konsistensi yang kuat dalam satu baris#. Bersama dengan -ROOT- dan .META. region, region tabel secara efektif membentuk 3 level B-Tree untuk tujuan menemukan baris di dalam tabel.

Sebuah Wilayah pada gilirannya, terdiri dari banyak "Toko", yang sesuai dengan keluarga kolom. Sebuah toko berisi satu memstore dan nol atau lebih file toko. Data untuk setiap keluarga kolom disimpan dan diakses secara terpisah.

Sebuah tabel biasanya terdiri dari banyak wilayah, yang pada gilirannya di-host oleh banyak server wilayah. Dengan demikian, wilayah adalah mekanisme fisik yang digunakan untuk mendistribusikan beban tulis dan kueri di seluruh server wilayah. Saat tabel pertama kali dibuat, HBase, secara default, hanya akan mengalokasikan satu wilayah untuk tabel. Ini berarti bahwa pada awalnya, semua permintaan akan masuk ke satu server wilayah, terlepas dari jumlah server wilayah. Inilah alasan utama mengapa fase awal pemuatan data ke tabel kosong tidak dapat memanfaatkan seluruh kapasitas cluster.

Pra-pemisahan

Alasan HBase hanya membuat satu wilayah untuk tabel adalah karena ia tidak mungkin mengetahui cara membuat titik split di dalam ruang kunci baris. Membuat keputusan seperti itu sangat didasarkan pada distribusi kunci dalam data Anda. Daripada menebak-nebak dan membiarkan Anda menghadapi konsekuensinya, HBase memberi Anda alat untuk mengelola ini dari klien. Dengan proses yang disebut pra-pemisahan, Anda dapat membuat tabel dengan banyak wilayah dengan menyediakan titik pemisahan pada waktu pembuatan tabel. Karena pra-pemisahan akan memastikan bahwa beban awal lebih merata di seluruh cluster, Anda harus selalu mempertimbangkan untuk menggunakannya jika Anda mengetahui distribusi kunci Anda sebelumnya. Namun, pra-pemisahan juga memiliki risiko membuat wilayah, yang tidak benar-benar mendistribusikan beban secara merata karena kemiringan data, atau dengan adanya baris yang sangat panas atau besar. Jika set awal titik pemisahan wilayah dipilih dengan buruk, Anda mungkin berakhir dengan distribusi beban yang heterogen, yang pada gilirannya akan membatasi kinerja cluster Anda.

Tidak ada jawaban singkat untuk jumlah optimal wilayah untuk beban tertentu, tetapi Anda dapat memulai dengan kelipatan lebih rendah dari jumlah server wilayah sebagai jumlah pemisahan, lalu biarkan pemisahan otomatis menangani sisanya.

Satu masalah dengan pra-pemisahan adalah menghitung poin split untuk tabel. Anda dapat menggunakan utilitas RegionSplitter. RegionSplitter membuat titik split, dengan menggunakan SplitAlgorithm yang dapat dicolokkan. HexStringSplit dan UniformSplit adalah dua algoritma yang telah ditentukan sebelumnya. Yang pertama dapat digunakan jika kunci baris memiliki awalan untuk string heksadesimal (seperti jika Anda menggunakan hash sebagai awalan). Yang terakhir membagi ruang kunci secara merata dengan asumsi mereka adalah array byte acak. Anda juga dapat menerapkan SplitAlgorithm kustom Anda dan menggunakannya dari utilitas RegionSplitter.

$ hbase org.apache.hadoop.hbase.util.RegionSplitter test_table HexStringSplit -c 10 -f f1

di mana -c 10, menentukan jumlah wilayah yang diminta sebagai 10, dan -f menentukan keluarga kolom yang Anda inginkan dalam tabel, dipisahkan dengan ":". Alat ini akan membuat tabel bernama “test_table” dengan 10 wilayah:

13/01/18 18:49:32 DEBUG hbase.HRegionInfo: Current INFO from scan results = {NAME => 'test_table,,1358563771069.acc1ad1b7962564fc3a43e5907e8db33.', STARTKEY => '', ENDKEY => '19999999', ENCODED => acc1ad1b7962564fc3a43e5907e8db33,}
13/01/18 18:49:32 DEBUG hbase.HRegionInfo: Current INFO from scan results = {NAME => 'test_table,19999999,1358563771096.37ec12df6bd0078f5573565af415c91b.', STARTKEY => '19999999', ENDKEY => '33333332', ENCODED => 37ec12df6bd0078f5573565af415c91b,}
...

Jika Anda memiliki titik pisah, Anda juga dapat menggunakan shell HBase, untuk membuat tabel dengan titik pisah yang diinginkan.

hbase(main):015:0> create 'test_table', 'f1', SPLITS=> ['a', 'b', 'c']

atau

$ echo -e  "anbnc" >/tmp/splits
hbase(main):015:0> create 'test_table', 'f1', SPLITSFILE=>'/tmp/splits'

Untuk distribusi beban yang optimal, Anda harus memikirkan model data Anda, dan distribusi kunci untuk memilih algoritme pemisahan atau titik pemisahan yang benar. Terlepas dari metode yang Anda pilih untuk membuat tabel dengan jumlah region yang telah ditentukan sebelumnya, Anda sekarang dapat mulai memuat data ke dalam tabel, dan melihat bahwa beban didistribusikan ke seluruh cluster Anda. Anda dapat membiarkan pemisahan otomatis mengambil alih setelah penyerapan data dimulai, dan terus memantau jumlah total wilayah untuk tabel.

Pemisahan otomatis

Terlepas dari apakah pra-pemisahan digunakan atau tidak, setelah suatu wilayah mencapai batas tertentu, wilayah tersebut secara otomatis dibagi menjadi dua wilayah. Jika Anda menggunakan HBase 0.94 (yang disertakan dengan HDP-1.2), Anda dapat mengonfigurasi kapan HBase memutuskan untuk membagi suatu wilayah, dan cara menghitung titik pemisahan melalui API RegionSplitPolicy yang dapat dicolokkan. Ada beberapa kebijakan pemisahan region yang telah ditentukan sebelumnya:ConstantSizeRegionSplitPolicy, MeningkatkanToUpperBoundRegionSplitPolicy, dan KeyPrefixRegionSplitPolicy.

Yang pertama adalah kebijakan split default dan hanya untuk versi HBase sebelum 0,94. Ini membagi wilayah ketika ukuran data total untuk salah satu toko (sesuai dengan kolom-keluarga) di wilayah menjadi lebih besar dari dikonfigurasi "hbase.hregion.max.filesize", yang memiliki nilai default 10GB. Kebijakan pemisahan ini ideal jika Anda telah melakukan pra-pemisahan, dan tertarik untuk mendapatkan jumlah wilayah yang lebih sedikit per server wilayah.

Kebijakan pemisahan default untuk HBase 0.94 dan trunk adalah PeningkatanToUpperBoundRegionSplitPolicy, yang melakukan pemisahan lebih agresif berdasarkan jumlah wilayah yang dihosting di server wilayah yang sama. Kebijakan pemisahan menggunakan ukuran file penyimpanan maksimum berdasarkan Min (R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”), di mana R adalah jumlah wilayah yang sama tabel yang dihosting di server wilayah yang sama. Jadi misalnya, dengan ukuran flush memstore default 128MB dan ukuran max store default 10GB, wilayah pertama di server wilayah akan dibagi tepat setelah flush pertama di 128MB. Karena jumlah wilayah yang dihosting di server wilayah meningkat, itu akan menggunakan ukuran split yang meningkat:512MB, 1152MB, 2GB, 3.2GB, 4.6GB, 6.2GB, dll. Setelah mencapai 9 wilayah, ukuran split akan melampaui "hbase" yang dikonfigurasi. .hregion.max.filesize”, pada saat itu, ukuran split 10GB akan digunakan mulai saat itu. Untuk kedua algoritme ini, terlepas dari kapan pemisahan terjadi, titik pemisahan yang digunakan adalah kunci baris yang sesuai dengan titik tengah dalam “indeks blok” untuk file penyimpanan terbesar di penyimpanan terbesar.

KeyPrefixRegionSplitPolicy adalah tambahan aneh untuk gudang senjata HBase. Anda dapat mengonfigurasi panjang awalan untuk kunci baris Anda untuk mengelompokkannya, dan kebijakan pemisahan ini memastikan bahwa wilayah tidak terbelah di tengah grup baris yang memiliki awalan yang sama. Jika Anda telah menetapkan awalan untuk kunci Anda, maka Anda dapat menggunakan kebijakan pemisahan ini untuk memastikan bahwa baris yang memiliki awalan kunci baris yang sama selalu berakhir di wilayah yang sama. Pengelompokan record ini kadang-kadang disebut sebagai "Grup Entitas" atau "Grup Baris". Ini adalah fitur utama saat mempertimbangkan penggunaan fitur “transaksi lokal” (tautan alternatif) dalam desain aplikasi Anda.

Anda dapat mengonfigurasi kebijakan pemisahan default yang akan digunakan dengan mengatur konfigurasi “hbase.regionserver.region.split.policy”, atau dengan mengkonfigurasi deskriptor tabel. Untuk Anda yang berjiwa pemberani, Anda juga dapat menerapkan kebijakan pemisahan kustom Anda sendiri, dan memasangnya pada waktu pembuatan tabel, atau dengan memodifikasi tabel yang ada:

HTableDescriptor tableDesc = new HTableDescriptor("example-table");
tableDesc.setValue(HTableDescriptor.SPLIT_POLICY, AwesomeSplitPolicy.class.getName());
//add columns etc
admin.createTable(tableDesc);

Jika Anda melakukan pra-pemisahan, dan ingin mengelola pemisahan wilayah secara manual, Anda juga dapat menonaktifkan pemisahan wilayah, dengan menyetel “hbase.hregion.max.filesize” ke angka tinggi dan menyetel kebijakan pemisahan ke ConstantSizeRegionSplitPolicy. Namun, Anda harus menggunakan nilai perlindungan seperti 100GB, sehingga wilayah tidak tumbuh melampaui kemampuan server wilayah. Anda dapat mempertimbangkan untuk menonaktifkan pemisahan otomatis dan mengandalkan kumpulan awal wilayah dari pra-pemisahan misalnya, jika Anda menggunakan hash yang seragam untuk awalan kunci Anda, dan Anda dapat memastikan bahwa baca/tulis memuat ke setiap wilayah serta ukurannya seragam di seluruh wilayah dalam tabel.

Pemisahan Paksa

HBase juga memungkinkan klien untuk memaksa membagi tabel online dari sisi klien. Misalnya, shell HBase dapat digunakan untuk membagi semua wilayah tabel, atau membagi wilayah, secara opsional dengan menyediakan titik pemisahan.

hbase(main):024:0> split 'b07d0034cbe72cb040ae9cf66300a10c', 'b'
0 row(s) in 0.1620 seconds

Dengan pemantauan yang cermat terhadap distribusi beban HBase Anda, jika Anda melihat bahwa beberapa wilayah mendapatkan beban yang tidak merata, Anda dapat mempertimbangkan untuk membagi wilayah tersebut secara manual untuk meratakan beban dan meningkatkan throughput. Alasan lain mengapa Anda mungkin ingin melakukan pemisahan manual adalah ketika Anda melihat bahwa pemisahan awal untuk wilayah tersebut ternyata kurang optimal, dan Anda telah menonaktifkan pemisahan otomatis. Itu mungkin terjadi misalnya, jika distribusi data berubah dari waktu ke waktu.

Bagaimana Pemisahan Wilayah diterapkan

Saat permintaan tulis ditangani oleh server wilayah, permintaan tersebut terakumulasi dalam sistem penyimpanan dalam memori yang disebut "memstore". Setelah memstore terisi, isinya ditulis ke disk sebagai file penyimpanan tambahan. Acara ini disebut "memstore flush". Saat file toko terakumulasi, RegionServer akan "memadatnya" menjadi file gabungan yang lebih besar. Setelah setiap pembilasan atau pemadatan selesai, permintaan pembagian wilayah akan diajukan jika RegionSplitPolicy memutuskan bahwa wilayah tersebut harus dipecah menjadi dua. Karena semua file data di HBase tidak dapat diubah, saat terjadi pemisahan, wilayah anak yang baru dibuat tidak akan menulis ulang semua data menjadi file baru. Sebagai gantinya, mereka akan membuat  file seperti sym-link kecil, bernama file Referensi, yang mengarah ke bagian atas atau bawah file penyimpanan induk sesuai dengan titik pemisahan. File referensi akan digunakan seperti file data biasa, tetapi hanya setengah dari catatan. Wilayah hanya dapat dibagi jika tidak ada lagi referensi ke file data yang tidak dapat diubah dari wilayah induk. File referensi tersebut dibersihkan secara bertahap dengan pemadatan, sehingga wilayah tersebut akan berhenti merujuk ke file induknya, dan dapat dipecah lebih lanjut.

Meskipun pemisahan wilayah adalah keputusan lokal yang dibuat di Server Wilayah, proses pemisahan itu sendiri harus berkoordinasi dengan banyak aktor. RegionServer memberi tahu Master sebelum dan sesudah pemisahan, memperbarui .META. tabel sehingga klien dapat menemukan wilayah anak baru, dan mengatur ulang struktur direktori dan file data di HDFS. Split adalah proses multi tugas. Untuk mengaktifkan rollback jika terjadi kesalahan, RegionServer menyimpan jurnal di memori tentang status eksekusi. Langkah-langkah yang diambil oleh RegionServer untuk mengeksekusi split diilustrasikan oleh Gambar 1. Setiap langkah diberi label dengan nomor langkahnya. Tindakan dari RegionServers atau Master ditampilkan dalam warna merah, sedangkan tindakan dari klien ditampilkan dalam warna hijau.

1. RegionServer memutuskan secara lokal untuk membagi wilayah, dan menyiapkan pemisahan. Sebagai langkah pertama, ini membuat znode di zookeeper di bawah /hbase/region-in-transition/region-name dalam status SPLITTING.
2. Master mempelajari znode ini, karena ia memiliki pengamat untuk znode region-in-transisi induk.
3. RegionServer membuat sub-direktori bernama “.splits” di bawah direktori region induk di HDFS.
4. RegionServer menutup wilayah induk, memaksa pembersihan cache dan menandai wilayah sebagai offline dalam struktur data lokalnya. Pada titik ini, permintaan klien yang datang ke wilayah induk akan membuang NotServingRegionException. Klien akan mencoba lagi dengan beberapa backoff.
5. RegionServer membuat direktori region di bawah direktori .splits, untuk region anak A dan B, dan membuat struktur data yang diperlukan. Kemudian itu membagi file toko, dalam arti bahwa itu membuat dua file Referensi per file toko di wilayah induk. File referensi tersebut akan mengarah ke file wilayah induk.
6. RegionServer membuat direktori region aktual di HDFS, dan memindahkan file referensi untuk setiap anak.
7. RegionServer mengirimkan permintaan Put ke .META. tabel, dan menetapkan induk sebagai offline di .META. tabel dan menambahkan informasi tentang daerah anak. Pada titik ini, tidak akan ada entri individu di .META. untuk anak perempuan. Klien akan melihat wilayah induk dibagi jika mereka memindai .META., tetapi tidak akan tahu tentang anak perempuan sampai mereka muncul di .META.. Juga, jika ini Put to .META. berhasil, induknya akan terbelah secara efektif. Jika RegionServer gagal sebelum RPC ini berhasil, Master dan server wilayah berikutnya yang membuka wilayah akan membersihkan status kotor tentang pemisahan wilayah. Setelah .META. pembaruan, bagaimanapun, pembagian wilayah akan diteruskan oleh Master.
8. RegionServer membuka anak perempuan secara paralel untuk menerima penulisan.
9. RegionServer menambahkan anak perempuan A dan B ke .META. bersama-sama dengan informasi yang menjadi tuan rumah daerah. Setelah titik ini, klien dapat menemukan wilayah baru, dan mengeluarkan permintaan ke wilayah baru. Klien cache .META. entri secara lokal, tetapi ketika mereka membuat permintaan ke server wilayah atau .META., cache mereka akan menjadi tidak valid, dan mereka akan belajar tentang wilayah baru dari .META..
10. RegionServer memperbarui znode /hbase/region-in-transition/region-name di zookeeper untuk menyatakan SPLIT, sehingga master dapat mempelajarinya. Penyeimbang dapat dengan bebas menetapkan ulang wilayah anak ke server wilayah lain jika diinginkan.
11. Setelah pemisahan, meta dan HDFS akan tetap berisi referensi ke wilayah induk. Referensi tersebut akan dihapus saat pemadatan di wilayah anak menulis ulang file data. Tugas pengumpulan sampah di master secara berkala memeriksa apakah wilayah anak masih merujuk ke file orang tua. Jika tidak, wilayah induk akan dihapus.

Penggabungan Wilayah

Tidak seperti pemisahan wilayah, HBase pada titik ini tidak menyediakan alat yang dapat digunakan untuk menggabungkan wilayah. Meskipun ada alat Hmerge, dan Merge, mereka tidak terlalu cocok untuk penggunaan umum. Saat ini tidak ada dukungan untuk tabel online, dan fungsi penggabungan otomatis. Namun, dengan masalah seperti OnlineMerge, Master memulai penggabungan wilayah otomatis, kunci Baca/Tulis berbasis ZK untuk operasi tabel, kami bekerja untuk menstabilkan pemisahan wilayah dan memungkinkan dukungan yang lebih baik untuk penggabungan wilayah. Tetap disini!

Kesimpulan

Seperti yang Anda lihat, HBase di bawah kap melakukan banyak pembersihan untuk mengelola pembagian wilayah dan melakukan sharding otomatis melalui wilayah. Namun, HBase juga menyediakan alat yang diperlukan seputar pengelolaan kawasan, sehingga Anda dapat mengelola proses pemisahan. Anda juga dapat mengontrol dengan tepat kapan dan bagaimana pemisahan wilayah terjadi melalui RegionSplitPolicy.

Jumlah wilayah dalam tabel, dan bagaimana wilayah tersebut dibagi merupakan faktor penting dalam memahami, dan menyetel beban klaster HBase Anda. Jika Anda dapat memperkirakan distribusi kunci Anda, Anda harus membuat tabel dengan pra-pemisahan untuk mendapatkan kinerja beban awal yang optimal. Anda dapat memulai dengan kelipatan jumlah server wilayah yang lebih rendah sebagai titik awal untuk jumlah wilayah awal, dan membiarkan pemisahan otomatis mengambil alih. Jika Anda tidak dapat memperkirakan dengan tepat titik pemisahan awal, lebih baik buat tabel dengan satu wilayah saja, dan mulai beberapa beban awal dengan pemisahan otomatis, dan gunakan PeningkatanToUpperBoundRegionSplitPolicy. Namun, perlu diingat bahwa, jumlah total wilayah akan stabil dari waktu ke waktu, dan kumpulan titik pembagian wilayah saat ini akan ditentukan dari data yang diterima tabel sejauh ini. Anda mungkin ingin memantau distribusi beban di seluruh wilayah setiap saat, dan jika distribusi beban berubah seiring waktu, gunakan pemisahan manual, atau atur ukuran pemisahan wilayah yang lebih agresif. Terakhir, Anda dapat mencoba fitur penggabungan online yang akan datang dan menyumbangkan kasus penggunaan Anda.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Hadoop – Tutorial Apache Hadoop untuk Pemula

  2. Transformasi Digital adalah Perjalanan Data Dari Ujung ke Wawasan

  3. Spark-on-HBase:konektor HBase berbasis DataFrame

  4. Cara Kerja Hadoop – Pahami Cara Kerja Hadoop

  5. Cara:Mengelola Data HBase melalui Hue