咱们知道,HBase是一个基于列的NoSQL数据库,它能够实现的数据的灵活存储。它自己是一个大表,在一些应用中,经过设计RowKey,能够 实现对海量数据的快速存储和访问。可是,对于复杂的查询统计类需求,若是直接基于HBase API来实现,性能很是差,或者,能够经过实现MapReduce程序来进行查询分析,这也继承了MapReduce所具有的延迟性。
实现Impala与HBase整合,咱们可以得到的好处有以下几个:html
可使用咱们熟悉的SQL,像操做传统关系型数据库同样,很容易给出复杂查询、统计分析的SQL设计node
Impala查询统计分析,比原生的MapReduce以及Hive的执行速度快不少数据库
Impala与HBase整合,须要将HBase的RowKey和列映射到Impala的Table字段中。Impala使用Hive的Metastore来存储元数据信息,与Hive相似,在于HBase进行整合时,也是经过外部表(EXTERNAL)的方式来实现。apache
准备工做服务器
首先,咱们须要作以下准备工做:app
安装配置Hadoop集群(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_4_4.html)ide
安装配置HBase集群(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_20.html)oop
涉及到相关系统的安装配置,能够参考相关文档和资料。
下面,咱们经过一个示例表test_info来讲明,Impala与HBase整合的步骤:
整合过程
在HBase中建立表
首先,咱们使用HBase Shell建立一个表,以下所示:
1 |
create 'test_info' , 'info' |
表名为test_info,只有一个名称为info的列簇(Column Family),咱们计划该列簇中存在4个列,分别为info:user_id、info:user_type、info:gender、info:birthday。
在Hive中建立外部表
建立外部表,对应的DDL以下所示:
1 |
CREATE EXTERNAL TABLE sho.test_info( |
2 |
user_id string, |
3 |
user_type tinyint, |
4 |
gender string, |
5 |
birthday string) |
6 |
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' |
7 |
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' |
8 |
WITH SERDEPROPERTIES ( "hbase.columns.mapping" = ":key, info:user_type, info:gender, info:birthday" ) |
9 |
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中执行同步命令:
1 |
INVALIDATE METADATA; |
而后,就能够查看到映射HBase中表的结构:
1 |
DESC test_info; |
表结构如图所示:
经过上面三步,咱们就完成了Impala和HBase的整合配置。
验证整合
下面,咱们经过实践来验证上述的配置是否生效。
咱们模拟客户端插入数据到HBase表中,可使用HBase API或者HBase Thrift来实现,这里咱们使用了HBase Thrift接口来进行操做,详见文章 HBase Thrift客户端Java API实践。
而后,咱们就能够经过Impala Shell进行查询分析。基于上面建立整合的示例表,插入20000000(2000万)记录,咱们作一个统计分析的示例,SQL语句以下所示:
1 |
SELECT user_type, COUNT (user_id) AS cnt FROM test_info WHERE gender= 'M' GROUP BY user_type ORDER BY cnt DESC LIMIT 10; |
运行结果信息,以下图所示:
上述程序运行所在Hadoop集群共有3个Datanode,执行上述统计SQL共用时88.13s。个人Hadoop集群配置比较低,2个节点是双核 CPU,另外一个是4核,内存足够,大概10G左右,并且还有好多程序在共享这些节点,如数据库服务器、SOLR集群等。若是提升配置,作一些优化,针对 20000000(2000万)条记录作统计分析,应该能够在5s之内出来结果。
因为测试数据是咱们随机生成的,gender取值为’M’和’F’,user_type的值为1到10,通过统计分组后,数据分布还算均匀。
参考连接