从hbase分页获取数据失败

错误详情

time: 2018-01-09 18:30:00.022, end time: 2018-01-09 18:30:10.023, client elapsed: 0 ms, server elapsed: 10001 ms, timeout: 10000 ms, request: Request [id=10725, version=2.0.0, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=pageGetNeedPushUsers, parameterTypes=[class java.lang.Long, class java.lang.Long, class java.lang.Integer, class java.lang.Integer], arguments=[141656, 62, 4265, 1000], attachments={flag=007ab0e4a899545ab4fe2414, path=com.xiaojukeji.training.hbase.api.service.GroupPushRemoteService, interface=com.xiaojukeji.training.hbase.api.service.GroupPushRemoteService, timeout=10000, version=1.0.0bc_hbase_online}]], channel: /100.70.131.50:42066 -> /100.90.64.22:13888

错误原因:

pageGetNeedPushUsers分页从hbase垃取userId,传的参数是rowKey的前两个值 62, 141656这两个值不变, 4265表示的是页数,2000表示的返回的条数,按照接口的设计则是:从phoenix表中获取数据,表的rowKey的第三个值是userId可变的。
select * from table where key1=62 and key2 =141656 skip 4265*1000 offset 1000

这样设计接口时,从hbase获取数据,越往后花费的时间将会越多,因为取100万条后面的1000条,它需要先把前100万条查询出来,因此接口耗时会非常的长,dubbo接口配置默认timeout=10000,即10秒,也就是此接口在10秒都没有返回,因为报错。 

解决办法:

有两种解决办法:
第一种是,在dubbo中设置method的超时时长,这个可以用在紧急修复数据上,治标不治本。
第二种是,传过来上一次取的最有一个userId,因为hbase的rowKey的设计是按照自动排序,因为前面的两个值一样,因此按照user_id来排序,传最后一个传入的userId,将会大大提高获取数据的速率。 

你可能感兴趣的:(hadoop)