org.apache.hadoop.hbase.ipc.CallTimeoutException:row ‘12F3‘ on table ‘HBASETABLE‘ at region....

今天在查HBASE表时,一批次大概千万条数据,
表结构 rowkey是三个关键信息拼接的,A,B,C A 和 C 是多对多的关系,
在只有第一信息的情况下使用HBASE的范围查询+模糊查询,setStartRow(A) ,setStopRow(A),RowFilter(RegexStringComparator©)

查询时报错:
org.apache.hadoop.hbase.ipc.CallTimeoutException: Call id=6, waitTime=60030, rpcTimeout=60000 rpcTimeout=60000
row ‘12F3X’ on table ‘HBASETABLE’ at region=XXXX., hostname=XXX, seqNum=XX

只看报错中 12F3X,不是HBASETABLE的完整Rowkey,而是设置的setStartRow(A),并且通过HBASE shell可以拿到12F3X对应的数据,那会是神马原因呢

网上给出许多建议

1.1 HBase有很多超时机制,本次报错应当是RPC超时引起的,可根据实际情况适当调整如下参数解决:
Set mapreduce.task.timeout= 1200000
set hbase.client.scanner.timeout.period=600000
set hbase.rpc.timeout=600000
其中, hbase.client.scanner.timeout.period和hbase.rpc.timeout最好配置一样大

1.2 超时时长解决方法:
(1)-增加超时时长;
(2)-减少缓存条数;setCaching(100),但问题不再此处,因为取的每条数据很小,总的两千条也不会暂用很多的内存;
(3)-过滤器原因:因为过滤查询和前缀查询的速度比较慢。所以在扫描的块中分布的合格的条数比例很小时,会很难再短时间内读取2000条数据 或者在当前的region中找不到数据时会与其他region做比对,确认数据是否真的不存在,解决方法,用范围查询代替前缀查询或模糊查询的动作。
(4)-创建索引表: HBase 中的二级索引是通过建表的方式实现的,将能拿到A的表按照 C,A,B的格式作为rowkey新建一张索引表,拿到 A B C 后,再通过get的方式获取数据

这样看来最可能是RowFIlter使用的原因了
使用(4),最后问题解决!

疑问:
过滤器效率很慢,那其存在的意义???

附上 过滤器 使用的example
https://blog.csdn.net/zhangketuan/article/details/50528767


版权声明:本文为qq_43701760原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。