从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,将会大大提高获取数据的速率。 

### 回答1: 要导出 HBase 表中的据,您可以使用 HBase Shell 命令或 HBase API。 1. HBase Shell 命令: - 进入 HBase Shell:在命令行中输入 hbase shell 命令。 - 导出据:使用 scan 命令,并将结果保存到文件中。例如: ``` hbase> scan 'table_name', {RAW => true} | awk -F'\t' '{print $3,$4}' > /tmp/table_name.txt ``` 2. HBase API: - 获取 HBase 连接:使用 HBaseConfiguration 类获取 HBase 连接。 - 扫描据:使用 HBaseAdmin 类获取 HBase 表,并使用 Table 类执行扫描操作。 - 保存据:将扫描结果保存到文件中。 下面是一个使用 Java API 导出 HBase据的示例: ```java import java.io.IOException; import java.util.List; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.Table; public class HBaseExport { public static void main(String[] args) throws IOException { Configuration conf = HBaseConfiguration.create(); try (Connection connection = ConnectionFactory.createConnection(conf); Table table = connection.getTable(TableName.valueOf("table_name")); ResultScanner scanner = table.getScanner(new Scan())) { for (Result result : scanner) { // Do something with the result. } } } } ``` ### 回答2: 编写校导出HBase据的过程如下: 1. 配置HBase集群:确保HBase集群已正确配置和启动。 2. 编写Java程序:使用Java编写程序来导出HBase据。 3. 导入相关依赖:在Java代码中导入HBase相关的依赖项,例如HBase的核心 jar 包。 4. 创建HBase连接:使用Java代码创建到HBase集群的连接。连接需要指定HBase的主机名和端口号。 5. 获取HBase表对象:通过HBase连接对象获取到需要导出据的表对象。 6. 设置过滤器:使用过滤器来筛选需要导出的据。可以根据需求选择不同类型的过滤器,例如前缀过滤器、范围过滤器等。 7. 执行Scan操作:使用Scan对象进行据扫描。Scan对象可以设置需要扫描的列族、列等信息。 8. 迭代处理结果:使用ResultScanner迭代扫描结果,并对每条据进行处理。 9. 据导出:根据需要将每条据导出到文件、据库或其他存储介质中。 10. 关闭连接:在程序执行结束后,关闭与HBase的连接。 以上步骤提供了一个基本的框架,可以根据具体需求进行调整和扩展。对于大规模据导出,可能需要考虑分页查询、多线程处理等更高级的功能。同时,也需要注意处理可能出现的异常情况,例如连接失败据格式错误等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值