HBase基礎幾個關鍵點——你能答出多少?

1.      Region的rowkey範圍是開區間還是閉區間?描述一下

 

2.      Scan的rowkey範圍是開區間還是閉區間?描述一下

 

3.      HTablePool線程安全麼?如果線程安全,爲什麼?如果線程不安全,有什麼影響?

 

4.      下面的代碼有沒有問題

    public List<Message> getData(Date start, Dateend, Long to)

            throws IOException {

        HTableInterfacetable = tablePool.getTable(tableName);

        List<Message>ret = null;

        byte[] bytesTo = Bytes.toBytes(to);

        byte[] startRow = Bytes.add(bytesTo,Bytes.toBytes(start.getTime()));

        byte[] endRow = Bytes.add(bytesTo, Bytes.toBytes(end.getTime()));

        byte[] family = "f".getBytes();

 

        Scanscan = new Scan();

        scan.setStartRow(startRow);

        scan.setStopRow(endRow);

        scan.setCaching(200);

        scan.addFamily(family);

        ResultScannerrs = null;

        try {

            rs= table.getScanner(scan);

            Resultresult = rs.next();

            while (result != null) {

                if (ret == null) {

                    ret= new ArrayList<Message>();

                }

                Messagemsg = new Message();

                msg.setTo(to);

                long id = Bytes.toLong(result.getValue(family,"id".getBytes()));

                long from = Bytes.toLong(result.getValue(family, "from".getBytes()));

                Stringmessage = Bytes.toString(result.getValue(family,

                        "msg".getBytes()));

                long time = Bytes.toLong(Arrays.copyOfRange(result.getRow(),8,

                        16));

                msg.setId(id);

                msg.setFrom(from);

                msg.setMessage(message);

                msg.setTime(new Date(time));

                ret.add(msg);

                result.close();

                result= rs.next();

            }

        }finally {

            table.close(); // important

        }

        return ret;

}

 

5.      請優化:

publicList<Put> getPut(String row, String… values) {

 List<Put> puts = new ArrayList<Put>(values.length);

 for(String value : values) {

     Put put = new Put(row.getBytes());

put.add("family".getBytes(),"from".getBytes(), Bytes.toBytes(value));

     puts.add(put);

}

return puts;

}

 

6.      scan.setBatch(1)和scan.setCaching(2)的區別

 

7.      判斷

a)       put(List<Put> puts)比put(Put put)效率高。

b)       HBase的底層是HDFS,有多副本,所以HBase不會丟失數據。

c)       寫數據一定將自動flush設置爲true以提高性能。

d)       如果我要存30天的數據,但列都一樣,那我可以用30個version來保存。

e)       爲了提升處理能力,我們應該把一批Put,分成多線程put到HBase集羣

f)        變長字段組合成rowkey的時候,將字段之間用#隔開就可以了。

g)       一個Put對應於一個KeyValue。

h)       HBase中建兩張表不如建兩個family。

i)         假設pool是HTablePool對象,可以HTable table=(HTable) pool.get(“table”)。

j)         使用HTablePool緩存的table(HTableInterface對象),將autoFlush設置爲false的時候,用table.close就會自動flushCommits()。

k)       一批Put最多需要當前表的region個數個RPC請求

l)         HTablePool實現了網絡連接的複用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章