我有一个hbase表,行键就像<<timestamp>>_<<user_id>>
,其中时间戳是yyyyMMddHHmm。我关心的是在给定的时间范围内查询用户详细信息。
例如:&#34; 201602021310_user1&#34;
HTable table = new HTable(conf, tableName);
Scan s = new Scan();
s.setStartRow("20160202".getBytes());
s.setStopRow("20160303".getBytes());
ResultScanner ss = table.getScanner(s);
List<Result> rs = new ArrayList<Result>();
for(Result r:ss){
rs.add(r);
}
根据我的理解,由于Hbase按字典顺序存储数据,因此不会出现任何问题。但是这种实现会导致区域服务器热点。 为了避免热点,(期待评论)
201602??_??????
+ 20160301_??????
+ 20160302_??????
+ 20160303_??????
实现这一目标的最佳方法是什么? (在支持范围排队时消除热点)
答案 0 :(得分:1)
row_key = (++index % BUCKETS_NUMBER) + original_key
其中,
分段记录的新行键将不再是一个序列,但每个桶中的记录将保留其原始序列。由于数据在写入期间被放置在多个存储桶中,因此在根据“原始”启动和停止键进行扫描并合并数据时,我们必须从所有这些存储桶中读取数据,以便保留“已排序”属性。每个存储桶的扫描可以并行化,因此性能不会降低。
摘自Sematext博客文章HBaseWD: Avoid RegionServer Hotspotting Despite Sequential Keys
您可以阅读此内容以获得完整的答案/解释