sql >> データベース >  >> NoSQL >> HBase

Apache HBase Medium Object Storage(MOB)コンパクションパーティションポリシーの紹介

    はじめに

    Apache HBase Medium Object Storage(MOB)機能は、HBASE-11339によって導入されました。この機能は、中程度のサイズの値(理想的には、テスト結果に基づいて100Kから10MB)の低遅延の読み取りおよび書き込みアクセスを改善し、ドキュメント、画像、およびその他の中程度のサイズのオブジェクトの保存に最適です[1]。 Apache HBase MOB機能は、ファイル参照とMOBオブジェクトのIOパスを分離し、MOBに異なる圧縮ポリシーを適用して、HBaseの圧縮によって作成される書き込み増幅を減らすことでこの改善を実現します。 MOBオブジェクトは、MOB領域と呼ばれる特別な領域に格納されます。 1つのテーブルのMOBオブジェクトはMOBファイルとしてMOBリージョンに保存されます。つまり、このリージョンには多数のMOBファイルがあります。 Apache HBase MOBアーキテクチャについては、[1]の図1を参照してください。

    図1ApacheHBaseMOBアーキテクチャ

    最初、MOBファイルは比較的小さいです(1つまたは2つのHDFSブロック未満)。 Apache HDFSの効率を向上させるために、MOBファイルはMOB圧縮と呼ばれる操作を介して定期的に大きなファイルにマージされます。 、これは通常の圧縮プロセスとは無関係です。 MOB圧縮の初期バージョンは、特定の日の複数のMOBファイルをその日のより大きなMOBファイルに書き換えます。これを明確にするために、以下のサンプルファイルリストを使用してみましょう。テーブルt1には2つの領域(r1、r2)があり、1つの列ファミリー(f1)があり、MOBが有効になっています。 2つのプレフィックスがあることがわかります。 D279186428a75016b17e4df5ea43d080は、リージョンr1の開始キーのハッシュ値に対応し、D41d8cd98f00b204e9800998ecf8427eは、リージョンr2の開始キーのハッシュ値に対応します。リージョンr1の場合、2016年1月1日と2016年1月2日にそれぞれ2つのMOBファイルがあり、リージョンr2の場合、MOBリージョン(/ hbase / data /)の下に2016年1月1日に3つのMOBファイルがあります。 mobdir / data / default / t1 / 78e317a6e78a0fceb27b9fa0cb9dcf5b/f1。

    >ls  /hbase/data/mobdir/data/default/t1/78e317a6e78a0fceb27b9fa0cb9dcf5b/f1

    D279186428a75016b17e4df5ea43d080 20160101 f9d9713ab2fb4a8b825485f6a8acfcd5

    D279186428a75016b17e4df5ea43d080 20160101 af7713ab2fbf4a8abc5135f6a8467ca8

    D279186428a75016b17e4df5ea43d080 20160102 9013ab2fceda8b825485f6a8acfcd515

    D279186428a75016b17e4df5ea43d080 20160102 9a7978013ab2fceda8b825485f6a8acf

    D41d8cd98f00b204e9800998ecf8427e 20160101 fc94af623c2345f1b241887721e32a48

    D41d8cd98f00b204e9800998ecf8427e 20160101 d0954af623c2345f1b241887721e3259

    D41d8cd98f00b204e9800998ecf8427e 20160101 439adf4af623c2345f1b241887721e32

    MOB圧縮後、リージョンr1の2016年1月1日と2016年1月2日の2つのMOBファイルが、1日に1つのファイルに圧縮されます。リージョンr2の2016年1月1日の3つのMOBファイルが1つのファイルに圧縮されます。

    D279186428a75016b17e4df5ea43d080 20160101 f49a9d9713ab2fb4a8b825485f6a8acf

    D279186428a75016b17e4df5ea43d080 20160102 bc9176d09424e49a9d9065caf9713ab2

    D41d8cd98f00b204e9800998ecf8427e 20160101 d9cb0954af623c2345f1b241887721e3

    リージョンの同じ日のMOBファイルのみをまとめて圧縮できるため、1年間の特定のファミリの単一のMOBリージョンディレクトリの下にあるMOBファイルの最小境界は365xリージョン数になります。 1000のリージョンがある場合、10年間でMOBの圧縮後に365 x 1000 x 10、365万のファイルが作成され、成長を続けます。残念ながら、Apache HDFSには、1つのディレクトリの下にあるファイルの数にメモリの制約がある制限があります[2]。 MOBファイルの数がこのHDFS制限を超えると、MOBテーブルは書き込みできなくなります。 ApacheHDFSの1つのディレクトリの下にあるデフォルトの最大ファイル数は100万です。 1,000の地域の場合、約3年でこの制限に達します。リージョンが増えると、制限に早く到達します。

    HBASE-16981は、毎週および毎月のMOB圧縮パーティション集約ポリシーを導入して、このMOBファイル数のスケーリングの問題をそれぞれ7倍または約30倍改善します。

    毎週および毎月のMOB圧縮パーティションポリシーの設計(HBASE-16981)

    HBASE-16981の基本的な考え方は、1暦週または1暦月のMOBファイルを、より少ない、より大きなファイルに圧縮することです。暦週はISO8601で定義されており、月曜日に始まり、日曜日に終わります。通常、毎週のポリシーでは、MOBの圧縮後、リージョンごとに1週間に1つのファイルがあります。月次ポリシーでは、MOB圧縮後、リージョンごとに月に1つのファイルがあります。 1年間の特定の1つのファミリのMOBリージョンディレクトリにあるMOBファイルの数は、週次ポリシーの場合は52 xリージョン数、月次ポリシーの場合は12xリージョン数に削減されます。これにより、圧縮後のMOBファイルの数が大幅に削減されます。

    最初に提案されたアプローチ

    MOBの圧縮が発生すると、HBaseマスターは、1暦月または1暦週以内のMOBファイルを選択して、より少ない、より大きなファイルに集約します。 MOBの圧縮が発生する頻度によっては、ファイルが複数回圧縮される可能性があります。例として、MOB圧縮操作が月次集計ポリシーで毎日行われるとします。 1日目に、MOB圧縮は1日目のすべてのファイルを1つのファイルに圧縮します。 2日目に、MOB圧縮は1日目のファイルと2日目のファイルを新しいファイルに圧縮します。 3日目に、MOB圧縮は2日目からのファイルと3日目からのファイルを新しいファイルに圧縮し、月末日まで続行します。この場合、1日目のファイルは30倍以上圧縮されるため、書き込みIOの量が30倍以上に増幅されます。

    Apache HBase MOBの設計目標は、MOB圧縮によって作成される書き込み増幅を減らすことです。この素朴なアプローチは、設計目標を打ち破ります。

    最終的に実装されたアプローチ

    最初に提案されたアプローチの欠陥を克服するために、HBASE-16981の新しい週次および月次ポリシーに段階的MOB圧縮が採用されています。図2は、月次ポリシーでどのように機能するかを示しています。週次ポリシーでも同様に機能します。

    図2月次ポリシーを使用したステージングMOB圧縮

    図2に示すように、MOBの圧縮は2016年11月15日に行われます。現在の暦週のファイルは、MOBしきい値が構成された日次パーティションに基づいて圧縮されます。図2では、2016年11月14日のファイルが一緒に圧縮され、2016年11月15日のファイルが一緒に圧縮されています。今月の過去の暦週のファイルは、週単位のしきい値(configured-MOB-threshold x 7)を使用した週単位のパーティションに基づいて圧縮されます。図2では、2016年11月1日から2016年11月6日までのファイルが一緒に圧縮され、2016年11月7日から2016年11月13日までのファイルが一緒に圧縮されています。過去数か月のファイルは、月次しきい値(configured-MOB-threshold x 28)の月次パーティションに基づいて圧縮されます。図2では、2016年10月1日から2016年10月31日までのファイルがまとめて圧縮されています。お気づきかもしれませんが、2016年11月の最初の暦週は2016年10月31日から2016年11月6日までです。 2016年10月31日は先月であるため、その日のファイルは月次パーティションに基づいて圧縮されます。これにより、週次パーティション(2016年11月1日〜2016年11月6日)は6日のみになります。圧縮後、MOB圧縮しきい値とMOB圧縮バッチサイズが適切に構成されている場合、5つのファイルがあります。

    この設計では、MOBファイルは2段階または3段階の圧縮を通過します。各段階で、MOB圧縮のしきい値を上げながら、日次パーティション、週次パーティション、または月次パーティションが適用されます。 MOBファイルは、通常、月次ポリシーで最大3倍、週次ポリシーで最大2倍圧縮されます。

    デザインの詳細については、[3]をご覧ください。

    使用法

    デフォルトでは、MOB圧縮パーティションポリシーは毎日です。週次または月次のポリシーを適用するために、MOB列ファミリーに追加された新しい属性MOB_COMPACT_PARTITION_POLICYがあります。ユーザーは、HBaseシェルからテーブルを作成するときにこの属性を設定できます。

    >create 't1', {NAME => 'f1', IS_MOB => true, MOB_THRESHOLD => 1000000, MOB_COMPACT_PARTITION_POLICY => 'weekly’}

    ユーザーは、HBaseシェルから既存のテーブルのMOB_COMPACT_PARTITION_POLICYを変更することもできます。

    >alter 't1', {NAME => 'f1', MOB_COMPACT_PARTITION_POLICY => 'monthly'}

    ポリシーが日次から週次または月次、または週次から月次に変更された場合、次のMOB圧縮は、前のポリシーで圧縮されたMOBファイルを再圧縮します。ポリシーが月次または週次から日次、または月次から週次に変更された場合、以前のポリシーで既に圧縮されたMOBファイルは、新しいポリシーで再圧縮されません。

    結論

    HBASE-16981は、ApacheHBaseMOBでのファイル番号スケーリングの問題を解決します。 ApacheHBase2.0.0リリースで利用可能になります。 CDHは、CDH5.4.0以降でApacheHBaseMOBをサポートします。 HBASE-16981はバックポートされており、CDH5.11.0で利用できるようになります。

    謝辞

    HBASE-16981の設計とレビューに協力してくれたJingchengDuとAnoopSamJohn、ブログのレビューに協力してくれたJonathanHsiehとSeanBusbeyに特に感謝します。

    参考資料

    [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


    1. RailsRedisのmaxmemoryとmaxmemory-policyの設定

    2. ビッグデータアプリケーションにMongoDBを選択する際に考慮すべき要素

    3. Laravel Redis ::scan('*')が期待されるキーを返すのに、Redis ::keys(' *')が返さないのはなぜですか?

    4. PythonとMongoDBの使用開始