使用 Impala 查询加盐的 Hbase 行键

Posted

技术标签:

【中文标题】使用 Impala 查询加盐的 Hbase 行键【英文标题】:Using Impala to query salted Hbase rowkey 【发布时间】:2013-12-11 15:21:57 【问题描述】:

我想使用 Hbase 来存储网络事件,rowkey 将是事件的时间戳。这将在 Hbase 中创建热点,为避免这种情况,我将在行键中添加盐前缀。这将在所有区域中均匀分布行。 目前没问题。

但我也想使用 Cloudera Impala 通过 SQL 查询这些数据。是否可以将 Impala 与加盐的行键一起使用?还是我需要 * sql 查询来获得所有结果?

【问题讨论】:

【参考方案1】:

很遗憾,Impala 不支持此功能。我还发现 Impala 在 HBase 上的性能很差。我仍在尝试调整我的配置,以使性能更好。 Parquet 在我的实验中似乎是最快的(x 的 100 倍)。事实上,没有压缩的平面 tsv 文件的性能要好于 HBase。以下描述了 Impala 与 HBase 的用例(直接来自 Cloudera 文档):

通过 Impala 查询 HBase 的用例

以下是使用 Impala 查询 HBase 表的流行用例:

在 Impala 中保留大型事实表,在 HBase 中保留较小的维度表。事实表使用 Parquet 或其他针对扫描操作优化的二进制文件格式。连接查询扫描大型 Impala 事实表,并使用 HBase 中的高效单行查找交叉引用维度表。 使用 HBase 存储快速递增的计数器,例如网页被浏览了多少次,或者在社交网络上,用户有多少连接或帖子收到了多少票。 HBase 可以有效地捕获此类可变数据:仅附加存储机制可以有效地将每个更改写入磁盘,并且查询始终返回最新值。应用程序可以从 HBase 查询特定的总数,并将结果与​​从 Impala 查询的更广泛的数据集结合起来。 在 HBase 中存储非常宽的表。宽表有许多列,可能有数千列,通常记录重要主题的许多属性,例如在线服务的用户。这些表也经常是稀疏的,即大多数列的值是 NULL、0、false、空字符串或其他空白或占位符值。 (例如,任何特定的网站用户可能从未使用过某些网站功能,在他们的个人资料中填写过某个字段,访问过网站的某个特定部分,等等。)针对此类表的典型查询是查看向上一行以检索有关特定主题的所有信息,而不是像在典型的 Impala 管理的表中那样对数百万行求和、平均或过滤。

或者 HBase 表可以与更大的 Impala 管理表连接。例如,分析代表网站 Web 流量的大型 Impala 表,并挑选出查看最多页面的 50 个用户。将该结果与 HBase 中的宽用户表连接,以查找这些用户的属性。连接的 HBase 端将导致在 HBase 中进行 50 次高效的单行查找,而不是扫描整个用户表。

特别是针对 HBase 运行 SQL 查询。你看过Pheonix吗?它确实支持加盐表并提供 SQL 语法。我不知道它有多快,也不知道它与 Dremel 实现相比如何。

【讨论】:

以上是关于使用 Impala 查询加盐的 Hbase 行键的主要内容,如果未能解决你的问题,请参考以下文章

用于对项目中密码生成MD5摘要和加盐的工具类

hbase 的最佳行键设计

Phoenix中的主键如何转换为hbase中的行键

0762-5.16.2-Impala查询HBase表字段顺序不正确异常分析

HBase - Filter - 过滤器的介绍以及使用

HBase里的优秀行键设计