Impala与HBase整合实践

我们知道,HBase是一个基于列的NoSQL数据库,它可以实现的数据的灵活存储。它本身是一个大表,在一些应用中,通过设计RowKey,可以实现对海量数据的快速存储和访问。但是,对于复杂的查询统计类需求,如果直接基于HBase API来实现,性能非常差,或者,可以通过实现MapReduce程序来进行查询分析,这也继承了MapReduce所具备的延迟性。
实现Impala与HBase整合,我们能够获得的好处有如下几个:

  • 可以使用我们熟悉的SQL,像操作传统关系型数据库一样,很容易给出复杂查询、统计分析的SQL设计
  • Impala查询统计分析,比原生的MapReduce以及Hive的执行速度快很多

Impala与HBase整合,需要将HBase的RowKey和列映射到Impala的Table字段中。Impala使用Hive的Metastore来存储元数据信息,与Hive类似,在于HBase进行整合时,也是通过外部表(EXTERNAL)的方式来实现。

准备工作

首先,我们需要做如下准备工作:

涉及到相关系统的安装配置,可以参考相关文档和资料。
下面,我们通过一个示例表test_info来说明,Impala与HBase整合的步骤:

整合过程

  • 在HBase中创建表

首先,我们使用HBase Shell创建一个表,如下所示:

create 'test_info', 'info'

表名为test_info,只有一个名称为info的列簇(Column Family),我们计划该列簇中存在4个列,分别为info:user_id、info:user_type、info:gender、info:birthday。

  • 在Hive中创建外部表

创建外部表,对应的DDL如下所示:

CREATE EXTERNAL TABLE sho.test_info(
     user_id string,
     user_type tinyint,
     gender string,
     birthday string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key, info:user_type, info:gender, info:birthday")
TBLPROPERTIES("hbase.table.name" = "test_info");

上面DDL语句中,在WITH SERDEPROPERTIES选项中指定Hive外部表字段到HBase列的映射,其中“:key”对应于HBase中的RowKey,名称为“user_id”,其余的就是列簇info中的列名。最后在TBLPROPERTIES中指定了HBase中要进行映射的表名。

  • 在Impala中同步元数据

Impala共享Hive的Metastore,这时需要同步元数据,可以通过在Impala Shell中执行同步命令:

INVALIDATE METADATA;

然后,就可以查看到映射HBase中表的结构:

DESC test_info;

表结构如图所示:
test_info

通过上面三步,我们就完成了Impala和HBase的整合配置。

验证整合

下面,我们通过实践来验证上述的配置是否生效。
我们模拟客户端插入数据到HBase表中,可以使用HBase API或者HBase Thrift来实现,这里我们使用了HBase Thrift接口来进行操作,详见文章 HBase Thrift客户端Java API实践
然后,我们就可以通过Impala Shell进行查询分析。基于上面创建整合的示例表,插入20000000(2000万)记录,我们做一个统计分析的示例,SQL语句如下所示:

SELECT user_type, COUNT(user_id) AS cnt FROM test_info WHERE gender='M' GROUP BY user_type ORDER BY cnt DESC LIMIT 10;

运行结果信息,如下图所示:
impala-sql-stats
上述程序运行所在Hadoop集群共有3个Datanode,执行上述统计SQL共用时88.13s。我的Hadoop集群配置比较低,2个节点是双核CPU,另一个是4核,内存足够,大概10G左右,而且还有好多程序在共享这些节点,如数据库服务器、SOLR集群等。如果提高配置,做一些优化,针对20000000(2000万)条记录做统计分析,应该可以在5s以内出来结果。
由于测试数据是我们随机生成的,gender取值为’M’和’F’,user_type的值为1到10,经过统计分组后,数据分布还算均匀。

参考链接

Creative Commons License

本文基于署名-非商业性使用-相同方式共享 4.0许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名时延军(包含链接:http://shiyanjun.cn),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

评论(15): “Impala与HBase整合实践

    • Impala版本更新比较快,存在的问题应该很多,我觉得成功的案例应该不好找。生产环境还是不建议使用,可以研究下,等它比较成熟的时候再考虑使用。

      • 说多了都是泪,小弟使用的1.3.0版本,支持SQL语言功能少,但是速度确实很快.真想一下升级到2.1以上版本

      • 都一年多了,我当时用的时候Impala刚刚出来没多久。经过一年多的完善和发展,想必应该稳定多了,抽时间试下~_~

      • 您好,想和您请教一下,在使用impala时,存储是用hdfs还是hbase您是怎么选择的?

        • 看你的实际需求了,如果你没有类似需要操作大表的需求,那完全可以存储到HDFS上,实际上Impala也是需要读取Hive元数据,而且是处理结构化数据,所以你还是要存储成Hive表。如果存储你的这些数据还需要实时访问,比如用户在线的数据的随机查询,一些状态的实时更新,这样的数据应该存放在一张大表中(HBase表),这时可以整合Impala+HBase,即可以对用户数据进行实时统计,同时又能满足在线访问数据的需求。

        • 理论上是都可以用的,用Cloudera的版本兼容性会更好一些,用其他的可能会出现各种兼容性的问题。

          • 请问博主:我们现在使用impala用来做olap,但是impala在一条查询中本身不支持多个distinct子句,有没有什么好的解决方案?

            • 这个…要么你等新的支持多个distinct子句特性的版本,要么你就变通地分多步计算,实现与你那个一个查询等价的多个查询。

  1. 博主你好,对于Hive存储的数据,使用Impala和Elasticsearch分别进行聚合查询以及单项查询,哪一个效率要高些?

    • 要说简单查询,如果数据量超大,那么肯定是ES查询速度更快。至于复杂的聚合查询,我还真么有实践过,简单说下,使用ES构造负责查询也相对复杂,而且ES你需要预先对数据进行索引,还要实现客户端的一套调用解析逻辑,代价高一些;而Impala可以直接基于已有的Hive相关元数据,提供类似SQL的查询语法,构造复杂聚合SQL语句也相对容易一些。复杂聚合,建议使用Impala吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>