具有大量扫描的HBase性能

时间:2016-06-11 04:12:52

标签: hbase

我有一张包含数百万条记录的表格。此表包含有关服务器和在其上生成的事件的数据。以下是该表的行键:

rowkey = md5(serverId)+ timestamp [32个十六进制字符+10个数字= 42个字符]

其中一个用例是列出从时间t1到t2的所有事件。为此,正常扫描花费了太多时间。为了加快速度,我做了以下几点:

  1. 从另一个表中获取唯一serverId的列表(真正快速)。
  2. 根据serverIds的md5的前两个十六进制字符,在256个桶中划分上面的列表。
  3. 对于每个存储桶,使用serverId列表,开始时间和结束时间调用协处理器(并行请求)。
  4. 协处理器扫描表格如下:

    for (String serverId :  serverIds) {
      byte[] startKey = generateKeyserverId, startTime);
      byte[] endKey = generateKey(serverId, endTime);
      Scan scan = new Scan(startKey, endKey);
      InternalScanner scanner = env.getRegion().getScanner(scan);
      ....
    }
    

    我可以通过这种方法快速获得结果。我唯一担心的是大量的扫描。如果该表有20,000个serverIds,那么上面的代码将进行20,000次扫描。它会影响HBase的整体性能和可扩展性吗?

1 个答案:

答案 0 :(得分:0)

尝试使用时间戳过滤器。 以下是在hbase shell中测试的语法 import java.util.ArrayList import org.apache.hadoop.hbase.filter.TimestampsFilter list=ArrayList.new() list.add(1444398443674) //START TIMESTAMP list.add(1444457737937) //END TIMESTAMP scan 'eventLogTable', {FILTER=>TimestampsFilter.new(list)}

同样的api也在java和其他语言中退出。

相关问题