HBaseストレージファイルフォーマットの概要

3704 ワード

回転:http://forchenyun.iteye.com/blog/828549
概要
HBaseはBigtable論文に基づく列に面した分散型記憶システムであり、その記憶設計はMemtable/SSTableに基づいている.他にもCassandraなどはこのデザインを採用しています.
全体の記憶は二つの部分に分けられています.一部はメモリの中のMemStoreで、もう一つはディスクの上のHFileです.以下では、2つのタイプのメモリのそれぞれの実装について説明する.
Mem Storeで最も重要な変数は以下の通りです.
Javaコード
 
  • volatile KeyValue SkipListSet kvset;  
  • volatile KeyValueSkipListSet kvset;
    ここのKeyValue SkipListSetの中は実際にこのようです.
    Javaコード
     
  • prvate final コンカレントNavigableMap delegatee;  
  • private final ConcurrentNavigableMap<KeyValue, KeyValue> delegatee;
    つまり、メモリを入れるMapがkvを保存しているということです.
    HFileはHBaseの実際のファイル格納フォーマットであり、Tファイルのファイルフォーマットに基づいて、初期のMapFileを置き換え、性能を向上させた.
    その後、HBaseは制御を行います.MemStoreがいっぱいになったらディスクをタッチします.
    HLogはHBaseのログフォーマットであり、主に書き込み時にwrite-aead-logを行い、主にrecoveryのために作られます.
    H File
    HFileはHBaseにおいて実際にデータを保存するファイルであり、HBaseに効率的で高速なデータアクセスを提供する.これはHadoopのTFileに基づいて、Google BigtableアーキテクチャのSSTableフォーマットを模倣している.以前のHadoopのMapFilesは性能が私達の期待に達することができないと証明されました.ファイル形式は以下の通りです.
    ファイルは長くなります.唯一固定されたブロックはFile infoとTrailerです.図に示すように、Trailerは他のブロックを指すポインタがあります.これらのポインタもファイルに書いてあります.Indexブロックはdataとmetaブロックのオフセット量を記録しています.dataとmetaブロックはオプションです.
    ブロックの大きさは表作成時のHColumn Descriptorによって指定されています.master web interfaceで見た例は以下の通りです.
    『NAME=』'docs'、FAMILIES=>[{NAME=>'cache'、COMPRESSION=>'NONEN'、VERIONS=>'' 3',TTL=>'2147483647'、BLOCKSIZE=>'65536'、IN MEMORY=>'false、BLOCS'BLOCS=====''BBBBBBBBBBBBBBBBBBBBBBBBNININININININNNNNNNNNNNNNNNNNNNNNNNNNNNN====================''BBBBBBBBBBBBB483647'、BLOCKSIZE=>'65536'、INMEMORY=>'false'、BLOCK CACHE=>'false',…
    デフォルトのサイズは64 KBで、以下はHFileに関する説明です.
    最小のブロックサイズです.通常は8 KBから1 MBの間に設定して、primary keyに基づく順序で頻繁にアクセスすれば、より大きなブロックサイズを設定することができますが、このようにすれば、効率の悪いランダムアクセス効率をもたらすことができます.(より多くのデータは解凍される必要があります.)より小さいブロックサイズはランダムアクセス効率をより良いものとしますが、インデックスを維持するためにより多くのメモリを消費します.flash圧縮ストリームが必要ですので、FS I/O flashが必要です.内部の圧縮codecのキャッシュのため、最小のブロックサイズは20-30 KBになります.
    上の図はHFileの中でKeyValueのフォーマットごとで、普通のkey-valueとあまり違いません.
    H Log
    ソースの実装クラスはHLogです.HRegionServerはHLogに対応しています.HRegionは初期化時にHRegionServerはHLogのインスタンスを構成関数として導入します.HLogのコア関数はそのapped関数です.
    HLogでは、Sequence Numberを維持します.AtomicLongタイプです.Regionが起動すると、HFileのMeta fieldから現在のSequence Numberを読み出します.
    図のように、HLogはRegion間で共有されているため、logの順序は不定であり、この点は後述する.HRegionServerが崩壊した後、HMasterがHRegionServerを再起動させると、ログに従って回復する.
    現在のWALはHadoopのSequenceFileフォーマットを使用しており、そのkeyはHLogKeyの例であり、以下の内容を含む.
    Javaコード
     
  • prvate byte [] encodedRegionName;  
  •   
  • prvate byte [] tablename  
  •   
  • prvate long logSeqNum  
  •   
  • / Time at. which this エディット was written.  
  •   
  • prvate long writeTime;  
  •   
  • prvate byte clusterId;  
  • private byte [] encodedRegionName;
    
    
    
    private byte [] tablename;
    
    
    
    private long logSeqNum;
    
    
    
    // Time at which this edit was written.
    
    
    
    private long writeTime;
    
    
    
    private byte clusterId;
    
    
    オペレーティングシステムは、大量のデータを単一の処理にブロックするため、flashログを実行する必要があります.LogFlausherは、Hlog.optional Sync()を呼び出して、hbase.regionserver.optiongflash.optiongflanter valに来たかどうかを確認します.デフォルトは10秒です.
             ログのサイズには制限があります.これはhbaser.regionserver.logionserver.logiroll.periodパラメータで制御されています.デフォルトは1時間です.LogRollerをクリックすると操作が起動されます.現在のSequence Numberを確認して、それより小さいすべてのログが完全かどうかを確認します.
    参考文献
    http://www.larsgeorge.com/
    主にlarsgeorgeからのhbaseシリーズの文章を参照します.