Pengantar
Fitur Apache HBase Medium Object Storage (MOB) diperkenalkan oleh HBASE-11339. Fitur ini meningkatkan akses baca dan tulis latensi rendah untuk nilai berukuran sedang (idealnya dari 100K hingga 10MB berdasarkan hasil pengujian kami), sehingga cocok untuk menyimpan dokumen, gambar, dan objek berukuran sedang lainnya [1]. Fitur Apache HBase MOB mencapai peningkatan ini dengan memisahkan jalur IO untuk referensi file dan objek MOB, menerapkan kebijakan pemadatan yang berbeda ke MOB dan dengan demikian mengurangi amplifikasi penulisan yang dibuat oleh pemadatan HBase. Objek MOB disimpan di wilayah khusus, yang disebut wilayah MOB. Objek MOB untuk satu tabel disimpan di wilayah MOB sebagai file MOB, yang berarti akan ada banyak file MOB di wilayah ini. Silakan lihat Gambar 1 dari [1] untuk arsitektur Apache HBase MOB.
Gambar 1 Arsitektur Apache HBase MOB
Awalnya, file MOB relatif kecil (kurang dari 1 atau 2 blok HDFS). Untuk meningkatkan efisiensi Apache HDFS, file MOB secara berkala digabungkan menjadi file yang lebih besar melalui operasi yang disebut pemadatan MOB , yang tidak tergantung pada proses pemadatan normal. Versi awal pemadatan MOB menulis ulang beberapa file MOB dari hari tertentu menjadi file MOB yang lebih besar untuk hari itu. Mari kita gunakan contoh daftar file di bawah ini untuk membuatnya lebih jelas. Tabel t1 memiliki dua wilayah (r1, r2), memiliki satu keluarga kolom (f1), dan MOB diaktifkan. Anda dapat melihat bahwa ada dua awalan; D279186428a75016b17e4df5ea43d080 sesuai dengan nilai hash dari kunci mulai untuk wilayah r1 dan D41d8cd98f00b204e9800998ecf8427e dengan nilai hash dari kunci mulai untuk wilayah r2. Untuk region r1, ada dua file MOB masing-masing pada 1/1/2016 dan 1/2/2016, dan untuk region r2, ada 3 file MOB pada 1/1/2016 di bawah region MOB, yaitu /hbase/data/ mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1.
>ls /hbase/data/mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1
D279186428a75016b17e4df5ea43d08020160101 f9d9713ab2fb4a8b825485f6a8acfcd5
D279186428a75016b17e4df5ea43d08020160101 af7713ab2fbf4a8abc5135f6a8467ca8
D279186428a75016b17e4df5ea43d08020160102 9013ab2fceda8b825485f6a8acfcd515
D279186428a75016b17e4df5ea43d08020160102 9a7978013ab2fceda8b825485f6a8acf
D41d8cd98f00b204e9800998eff8427e20160101 fc94af623c2345f1b241887721e32a48
D41d8cd98f00b204e9800998eff8427e20160101 d0954af623c2345f1b241887721e3259
D41d8cd98f00b204e9800998eff8427e20160101 439adf4af623c2345f1b241887721e32
Setelah pemadatan MOB, dua file MOB pada 1/1/2016 dan 1/2/2016 untuk wilayah r1 dipadatkan menjadi satu file untuk setiap hari. Tiga file MOB pada 1/1/2016 untuk region r2 dipadatkan menjadi satu file.
D279186428a75016b17e4df5ea43d08020160101 f49a9d9713ab2fb4a8b825485f6a8acf
D279186428a75016b17e4df5ea43d08020160102 bc9176d09424e49a9d9065caf9713ab2
D41d8cd98f00b204e9800998eff8427e20160101 d9cb0954af623c2345f1b241887721e3
Karena hanya file MOB dari hari yang sama untuk suatu wilayah yang dapat dipadatkan bersama, batas minimum file MOB di bawah direktori wilayah MOB tunggal untuk satu keluarga tertentu dalam satu tahun adalah 365 x jumlah wilayah. Dengan 1000 wilayah, dalam 10 tahun, akan ada 365 x 1000 x 10, 3,65 juta file setelah pemadatan MOB, dan terus bertambah! Sayangnya, Apache HDFS memiliki batasan memori untuk jumlah file dalam satu direktori [2]. Setelah jumlah file MOB melebihi batas HDFS ini, tabel MOB tidak dapat ditulis lagi. Jumlah maksimum default file di bawah satu direktori untuk Apache HDFS adalah 1 juta. Untuk 1.000 wilayah, batas ini akan tercapai dalam waktu sekitar 3 tahun. Dengan lebih banyak wilayah, itu akan mencapai batas lebih cepat.
HBASE-16981 memperkenalkan kebijakan agregasi partisi pemadatan MOB mingguan dan bulanan untuk meningkatkan masalah penskalaan jumlah file MOB ini masing-masing dengan faktor 7 atau ~30.
Desain kebijakan partisi pemadatan MOB mingguan dan bulanan (HBASE-16981)
Ide dasar HBASE-16981 adalah untuk memadatkan file MOB dalam satu minggu kalender atau satu bulan kalender menjadi file yang lebih kecil dan lebih besar. Minggu kalender ditentukan oleh ISO 8601, dimulai pada hari Senin dan berakhir pada hari Minggu. Biasanya, dengan kebijakan mingguan, setelah pemadatan MOB akan ada satu file per minggu per wilayah; dengan kebijakan bulanan, setelah pemadatan MOB akan ada satu file per bulan per wilayah. Jumlah file MOB di bawah direktori wilayah MOB untuk satu keluarga tertentu dalam satu tahun akan dikurangi menjadi 52 x jumlah wilayah dengan kebijakan mingguan dan 12 x jumlah wilayah dengan kebijakan bulanan. Ini sangat mengurangi jumlah file MOB setelah pemadatan.
Pendekatan awal yang diusulkan
Ketika pemadatan MOB terjadi, master HBase memilih dan menggabungkan file MOB dalam satu bulan kalender atau satu minggu kalender menjadi file yang lebih kecil dan lebih besar. Bergantung pada seberapa sering pemadatan MOB terjadi, ada kemungkinan file dipadatkan beberapa kali. Sebagai contoh, katakanlah operasi pemadatan MOB terjadi setiap hari dengan kebijakan agregasi bulanan. Pada hari 1, MOB compaction memadatkan semua file untuk hari 1 menjadi satu file. Pada hari ke-2, pemadatan MOB memadatkan file dari hari ke-1 dan file dari hari ke-2 menjadi file baru; pada hari ke 3, pemadatan MOB akan memadatkan file dari hari ke 2 dan file dari hari ke 3 menjadi file baru, itu terus berlanjut hingga hari terakhir bulan itu. Dalam hal ini, file dari hari 1 dipadatkan lebih dari 30 kali dan dengan demikian memperkuat jumlah IO tulis lebih dari 30x.
Tujuan desain Apache HBase MOB adalah untuk mengurangi amplifikasi tulis yang dibuat oleh pemadatan MOB. Pendekatan naif ini mengalahkan tujuan desain.
Pendekatan akhir yang diterapkan
Untuk mengatasi kekurangan pendekatan awal yang diusulkan, pemadatan MOB bertahap diadopsi untuk kebijakan mingguan dan bulanan baru di HBASE-16981. Gambar 2 menunjukkan cara kerjanya dengan kebijakan bulanan, cara kerjanya sama untuk kebijakan mingguan.
Gambar 2 Pementasan pemadatan MOB dengan kebijakan bulanan
Seperti yang ditunjukkan Gambar 2, pemadatan MOB terjadi pada 15/11/2016. File dalam minggu kalender saat ini dipadatkan berdasarkan partisi harian dengan ambang MOB yang dikonfigurasi. Pada Gambar 2, file untuk 14/11/2016 dipadatkan bersama, dan file untuk 15/11/2016 dipadatkan bersama. File dalam minggu-minggu kalender terakhir dari bulan berjalan dipadatkan berdasarkan partisi mingguan dengan ambang mingguan (dikonfigurasi-MOB-ambang x 7). Pada Gambar 2, file dari 11/1/2016 hingga 11/6/2016 dipadatkan bersama dan file dari 11/7/2016 hingga 13/11/2016 dipadatkan bersama. File dalam beberapa bulan terakhir dipadatkan berdasarkan partisi bulanan dengan ambang bulanan (dikonfigurasi-MOB-ambang x 28). Pada Gambar 2, file dari 10/1/2016 hingga 31/10/2016 dipadatkan bersama. Seperti yang mungkin diperhatikan, minggu kalender pertama di bulan November 2016 adalah dari 31/10/2016 hingga 11/6/2016. Karena 10/31/2016 dalam sebulan terakhir, file untuk hari itu dipadatkan berdasarkan partisi bulanan, ini hanya menyisakan 6 hari untuk partisi mingguan (11/1/2016 ~ 11/6/2016). Setelah pemadatan, ada 5 file jika ambang pemadatan MOB dan ukuran batch pemadatan MOB dikonfigurasi dengan tepat.
Dengan desain ini, file MOB melewati pemadatan 2 tahap atau 3 tahap. Pada setiap tahap, partisi harian, partisi mingguan, atau partisi bulanan diterapkan dengan peningkatan ambang batas pemadatan MOB. File MOB dipadatkan paling banyak 3 kali secara normal dengan kebijakan bulanan dan paling banyak 2 kali secara normal dengan kebijakan mingguan selama masa pakainya.
Untuk detail lebih lanjut tentang desain, silakan lihat [3].
Penggunaan
Secara default, kebijakan partisi pemadatan MOB adalah harian. Untuk menerapkan kebijakan mingguan atau bulanan, ada atribut baru MOB_COMPACT_PARTITION_POLICY ditambahkan untuk keluarga kolom MOB. Pengguna dapat mengatur atribut ini saat membuat tabel dari shell HBase.
>create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}
Pengguna juga dapat mengubah MOB_COMPACT_PARTITION_POLICY tabel yang ada dari shell HBase.
>alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}
Jika kebijakan berubah dari harian ke mingguan atau bulanan, atau dari mingguan ke bulanan, pemadatan MOB berikutnya akan meringkas file MOB yang telah dipadatkan dengan kebijakan sebelumnya. Jika kebijakan berubah dari bulanan atau mingguan ke harian, atau dari bulanan ke mingguan, file MOB yang sudah dipadatkan dengan kebijakan sebelumnya tidak akan dipadatkan kembali dengan kebijakan baru.
Kesimpulan
HBASE-16981 memecahkan masalah penskalaan nomor file dengan Apache HBase MOB. Ini akan tersedia dalam rilis Apache HBase 2.0.0. CDH mendukung Apache HBase MOB di CDH 5.4.0+. HBASE-16981 di-backport dan akan tersedia di CDH 5.11.0.
Ucapan Terima Kasih
Terima kasih khusus kepada Jingcheng Du dan Anoop Sam John untuk bantuan dalam desain dan ulasan HBASE-16981, Jonathan Hsieh dan Sean Busbey untuk meninjau blog.
Referensi
[1] https://clouderatemp.wpengine.com/blog/2015/06/inside-Apache-hbases-new-support-for-mobs/
[2] https://clouderatemp.wpengine.com/blog/2009/02/the-small-files-problem/
[3] https://issues.Apache.org/jira/browse/HBASE-16981