现象
hbase翻页时偶尔返回19条,偶尔返回20条,数据返回不确定
原理
hbase的实现翻页功能中有 3 个因素在共同作用:
pagefilter(翻页过滤器),offset(数据补偿),caching(单次读取条数)
hbase对于他们的查找顺序是 pagefilter > offset > caching
举个例子,假设参数为:
pagefilter(20); offset(1); caching(20);
当请求在一个 region 内满足查询条件的数据大于 20 条时:
- pagefilter 过滤返回 20 条offset 为 1 过滤一条剩 19 条caching 未达到 20 条,进一步请求由于 pagefilter 已经返回了 20 条,进一步请求拿不到数据,最终返回 19 条
当请求在一个 region 内满足 filter 条件的小于 20 条时,比如:15 条:
- pagefilter 过滤返回 15 条offset 为 1 过滤一条剩 14条caching 未达到 20 条,进一步请求pagefilter 应用于下一个 region,这次又返回 20 条offset 不再作用,caching 只拿前 6 条,凑成 20 条,返回
解决办法
弃用pagefilter,采用caching+startrow的方式去实现分页(记得设置好结束语句[scannerresult.close],否则scanner会一直去取,会造成数据库崩溃)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)