最近作一個基於HBase 的大日誌存儲,分析系統。 在key的設置上有一些心得,拿出來你們共享。session
咱們這個日誌系統有個需求,就是根據某個操做找出整個會話的全部操做,按通常的作法就是根據SID(會話Id)字段來掃描全表,返回全部該會話SID的記錄。代碼以下:spa
Scan scan = new Scan();設計
FilterList filterList = new FilterList();日誌
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("CF"),get
Bytes.toBytes("SID"), op, Bytes.toBytes("10000000")));it
scan.setFilter(filterList);io
ResultScanner rs = currentTable.getScanner(scan);List
因爲hbase 是key ,value存儲系統,所以對基於V的條件查詢都是全表掃描,對於小數據量沒問題,可是一旦數據量大到百萬,千萬級(咱們這裏是一天就千萬級)那就會沒法接受,會很是很是很是慢。。 可是咱們知道Key是是順序排列的,基於key的訪問就會很是快。所以咱們在設計Key的時候加點小小技巧就可讓你輕鬆快速查找到相同SID的操做。技巧
具體:KEY = DATETIME +SID+SEQ (SEQ爲同一SID的不一樣操做的順序編號)。 這樣咱們查找SID=100000的全部操做的代碼以下:im
Scan scan = new Scan();
String startkey = DATETIME + "100000"
String endkey = DATETIME +"100000"+"99999" (咱們假設每一個session最多有100000個操做,固然實際上遠遠小於這個數值。)
scan.setStartRow(Bytes.toBytes(startKey));
scan.setStopRow(Bytes.toBytes(endKey));
ResultScanner rs = currentTable.getScanner(scan);
通過上面一改,不論你的hbase記錄多大,上述查詢時間都在毫秒級了。。。