scan在命令行有一个用法是设置timerange(时间区间)
hbase shell给出的用法:
这里的时间戳应该到ms而不是s
1 |
|
scan的时候只扫描时间范围内的文件
写入的时候,更新memstore的timeRangeTracker的min和max 时间戳
flush的时候,timeRangeTracker的值赋值给snapshotTimeRangeTracker
写文件的时候,写入snapshotTimeRangeTracker到文件的元数据中对应的key是TIMERANGE_KEY
查询的时候客户端传递过来的scan.getTimeRange在shouldUseScanner方法中通过passesTimerangeFilter进行过滤
StoreFileScanner.shouldUseScanner
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
请求堆栈
HRegionServer.scan
→HRegion.getScanner
→HRegion.instantiateRegionScanner
→RegionScannerImpl
→HStore.getScanner
→StoreScanner 构造方法
→StoreScanner.getScannersNoCompaction
→StoreScanner.selectScannersFrom
→KeyValueScanner.shouldUseScanner
|
StoreFile.WriterBuilder.build() 中调用new Writer 初始化timeRangeTracker
再上层是StoreFile.WriterBuilder.trt
⬆️HStore.createWriterInTmp
第一个引用:
这里面timerange的向上跟踪可以知道是:HStore中的snapshotTimeRangeTracker
那么snapshotTimeRangeTracker的设置从何而来?
在memstore初始化的时候,初始化TimeRangeTracker
TimeRangeTracker中的时间戳最小最大值
snapshotTimeRangeTracker的值,在MemStore snapshot方法(不是hbase的snapshot,是memstore概念的snapshot,flush中用到的)中
this.snapshotTimeRangeTracker = this.timeRangeTracker;
timeRangeTracker中min和max时间戳的更新是做写入操作的时候会调用memstore.put等操作更新
compact情况下:
初始writer的时候trt为null,会new一个新的timerangeTracker
然后通过writer写数据的时候,写入每个kv会进行append操作,里面会更新trt的 min和max值