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實現了網絡連接的複用。