来自 HBase 查询的 Hbase 表
Posted
技术标签:
【中文标题】来自 HBase 查询的 Hbase 表【英文标题】:Hbase Table from HBase query 【发布时间】:2015-08-28 16:14:26 【问题描述】:无论如何我们可以创建一个 Hbase 表作为 hbase 查询的输出吗?假设我有一个巨大的 hbase 表,然后我使用过滤器查询 hbase 表。我想将结果存储回 Hbase 表中。有可能吗?
【问题讨论】:
所以第一个表的结果应该存储在一个新的 hbase 表中 - 所有这些都应该一次性完成? @Ramzy 是的。我想将结果存储到另一个 Hbase 表中。或 HFile。不一定是一口气。 【参考方案1】:您可以拍摄正在运行的 Hbase 表的快照并将其导出到 HDFS。 编写 Mapreduce 以在文件中获取所需的数据,然后批量加载到新的 Hbase 表。 您也可以直接将数据写入 Hbase 表。 这样,在快照上运行 MapReduce 也不会影响实际的 Hbase 表。 这就是您可以执行以下所有步骤的方法
创建快照
snapshot 'HbaseTable','HbaseTableSnapshot'
将快照导出到本地 hdfs
hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot HbaseTableSnapshot-copy-to /tmp -mappers 16
驱动程序作业配置到 Hbase 快照上的 rum mapreduce
String snapshotName="HbaseTableSnapshot";
Path restoreDir = new Path("hdfs://quickstart.cloudera:8020/tmp");
String hbaseRootDir = "hdfs://quickstart.cloudera:8020/hbase";
TableMapReduceUtil.initTableSnapshotMapperJob(snapshotName, // Snapshot name
scan, // Scan instance to control CF and attribute selection
DefaultMapper.class, // mapper class
NullWritable.class, // mapper output key
Text.class, // mapper output value
job,
true,
restoreDir);
同样在 Hbase 快照上运行 mapreduce 将跳过对 Hbase 表的扫描,也不会对区域服务器产生影响。
【讨论】:
【参考方案2】:您可以使用 hbase 作为 map reduce 的源和接收器。我希望this 能帮到你。参见 7.2.4 节。由于您将并行编写 put 作为输出,因此时间也得到了优化。
【讨论】:
感谢您的想法。但我的要求是我可以使用特定版本的列查询 hbase 表,然后将结果存储到 hbase 表中。 好的,是什么阻止您为第一个表设置扫描的最大版本。您可以使用 scan.setmaxVersions() 并获取所有版本。 要求是我需要从表中选择一个特定版本,然后通过配置单元查询它。所以我需要将结果存储回 hbase 表以便通过 hive 查询【参考方案3】:您可以编写一个作业以从第一个表中读取键值对,然后将其保存在第二个表中。
如果您担心性能?那么你可以编写一个 map reduce 作业来做到这一点。
【讨论】:
【参考方案4】:您不能直接查询 hbase 并在其中创建另一个包含您的输出的表,但您可以编写 map reduce 来做同样的事情。除了 map reduce,如果您在 hbase 上使用 Apache Phoenix,您将能够编写查询来选择数据并将其存储到 hbase 表中。
【讨论】:
【参考方案5】:聪明又好主意...
您可以使用 HappyBase 来完成此操作,它是我们在生产服务中使用的 Python 前端。
但是,如果您实际上是在谈论 1 亿加返回值 - 我不建议这样做。多达 10-20 百万条记录,您可以获得良好的吞吐量(我们平均每秒插入 8k 条记录。围裙 0.5M/分钟)。
【讨论】:
以上是关于来自 HBase 查询的 Hbase 表的主要内容,如果未能解决你的问题,请参考以下文章
利用hive-hbase表做hive表快速入库hbase功能,纬度表的查询
0762-5.16.2-Impala查询HBase表字段顺序不正确异常分析