【问题标题】:HBase Scan - RowKey FiltersHBase 扫描 - RowKey 过滤器
【发布时间】:2017-07-29 03:04:12
【问题描述】:

那么,让我们看看我能否简要解释一下我的问题。

假设我们有一个 HBase 表,其中包含每次访问迪斯科的信息: 每个迪斯科都会记录其姓名访客姓名以及他访问它的日期。 (是的,这是一个愚蠢的例子,我知道..)。

因此,例如,这些将是表的一些值:

..
ministryOfSoundJamesOliver01022017
ministryOfSoundJamesOliver02022017
ministryOfSoundJamesOliver03022017
ministryOfSoundOliviaNewton04042017
ministryOfSoundOliviaNewton06042017
...
pachaibizaJohnMcKiness06042017
pachaibizaJohnMcKiness04042017
pachaibizaWilliamForrester04042017
..

RowKey 具有以下结构:

迪斯科名称

人名

当年的日子

(该表还有一些其他列/限定符,但我不介意这个问题)。


问题是:想象一个男孩只是喜欢去声音部。他只是喜欢它,他把所有的钱都花在了迪斯科和毒品上(但这不是这里的重点)。

我的目标是输出所有参加Ministry Of Sound的人。在我的扫描中,这个家伙一直出现在结果中,所以我必须丢弃很多条目来寻找下一个访客。 F.E:

..
ministryOfSoundJohnnyYonkie01022017
ministryOfSoundJohnnyYonkie02022017
ministryOfSoundJohnnyYonkie03022017
ministryOfSoundJohnnyYonkie04022017
ministryOfSoundJohnnyYonkie05022017
ministryOfSoundAnotherDude02022017
...

为了注册 AnotherDude,我必须丢弃 Johnny 的 4 个条目。

最后,问题是:


有什么方法可以告诉 HBase 从 byte(x) 到 byte(x+y) 的重复条目 [ x 是来自discoName 的字节数和来自的 y 字节数personName ] 必须自动丢弃


提前非常感谢!!

【问题讨论】:

  • 什么是数据访问模式?您使用 Hadoop 和 MapReduce 还是仅使用 HBase 客户端 api 扫描表?您想跳过 HBase 服务器端或客户端的条目,因此数据处理函数将只接受唯一的 disco-user 条目吗?我没有完全理解这个场景。
  • 嗨@AdamSkywalker!我们通过客户端 api(使用 thrift 和 C#)连接到 Hbase,我们的目标是跳过服务器端的条目。谢谢!
  • 您是否考虑过使用给定的 startKey 创建新的扫描以跳过条目?例如,当您找到 JohnnyYonkie 时,您使用开始键“ministryOfSoundJohnnyYonkie99999”创建新的扫描。
  • 这是一个聪明的主意@AdamSkywalker。你看起来很聪明。就这样吧,兄弟。

标签: hbase hbase-filter bigdata database


【解决方案1】:

首先要做的事情:如果您只有客户端访问权限,我无法帮助您:(

如果您有额外的访问权限,那么您可以查看以下提议,但默认回复是: 如果这是您的访问模式,请针对它优化您的架构。

如果您需要以某种方式访问​​数据,请确保首先以这种方式编写数据。如果必须执行迁移,请使用 map-reduce API。

我可能会简单地添加一个表,该表仅写一行 MinistryOfSound 和每个访问者一列。 (一般来说,您提出的架构听起来不太适合 HBase - 因为您有一堆具有单调递增行键的写入,如果对重复结果进行后处理确实是一个性能问题)

另一方面,如果这是一个临时查询,那么您可能希望立即使用 mapreduce-API - 可能使用 Apache Spark 互连并对数据执行“不同”调用。

我不会使用 Scans 进行分析查询。

如果您必须使用 Scans 来完成,那么我建议您实现一个 CoProcessor。这些可以增加过滤器的状态,并且您可以将 PrefixFilter'd Scan 的结果投影到区域服务器端。如果您是 CoProcessors 的新手,这里有一个介绍:HBase: The Definitive Guide。这要求您可以将 jar 部署到 RegionServer 类路径中。

但同样,如果您通过在那里进行独特的过滤来炸毁您的客户端,那么您可能还会因为插入上的热点而炸毁您的区域。

作为最后一种选择:您可能希望查看 Apache Phoenix,看看您是否可以将您的 rowkey 强制转换为一个模式,您可以从中对 rowkey 的前两个部分执行 select distinct。这显然需要您在 rowkey 中有分隔符,或者至少是固定长度。

【讨论】:

  • 没有找到解决方案,但你的帖子内容丰富,所以给你打勾
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 2012-12-09
相关资源
最近更新 更多