Impala、Hive与HBase整合实践
2017-11-24 14:44
489 查看
我们知道,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来说明,Hive与HBase整合的步骤:
整合过程
在HBase中创建表
首先,我们使用HBase Shell创建一个表,如下所示:
表名为test_info,只有一个名称为info的列簇(Column Family),我们计划该列簇中存在4个列,分别为info:user_id、info:user_type、info:gender、info:birthday。
在Hive中创建外部表
创建外部表,对应的DDL如下所示:
上面DDL语句中,在WITH SERDEPROPERTIES选项中指定Hive外部表字段到HBase列的映射,其中“:key”对应于HBase中的RowKey,名称为“user_id”,其余的就是列簇info中的列名。最后在TBLPROPERTIES中指定了HBase中要进行映射的表名。
该Hive表一个外部表,所以删除该表并不会删除HBase表中的数据,有几点需要注意的是:
1、建表或映射表的时候如果没有指定:key则第一个列默认就是行键
2、HBase对应的Hive表中没有时间戳概念,默认返回的就是最新版本的值
3、由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型
在Impala中同步元数据
Impala共享Hive的Metastore,这时需要同步元数据,可以通过在Impala Shell中执行同步命令:
通过上面三步,我们就完成了Impala、Hive和HBase的整合配置。
验证整合
下面,我们通过实践来验证上述的配置是否生效。
我们模拟客户端插入数据到HBase表中,可以使用HBase API或者HBase Thrift来实现,这里我们使用了HBase Thrift接口来进行操作。
然后,我们就可以通过Impala Shell进行查询分析。基于上面创建整合的示例表,插入20000000(2000万)记录,我们做一个统计分析的示例,SQL语句如下所示:
上述程序运行所在Hadoop集群共有3个Datanode,执行上述统计SQL共用时88.13s。我的Hadoop集群配置比较低,2个节点是双核CPU,另一个是4核,内存足够,大概10G左右,而且还有好多程序在共享这些节点,如数据库服务器、SOLR集群等。如果提高配置,做一些优化,针对20000000(2000万)条记录做统计分析,应该可以在5s以内出来结果。
由于测试数据是我们随机生成的,gender取值为’M’和’F’,user_type的值为1到10,经过统计分组后,数据分布还算均匀。
实现Impala与HBase整合,我们能够获得的好处有如下几个:
可以使用我们熟悉的SQL,像操作传统关系型数据库一样,很容易给出复杂查询、统计分析的SQL设计
Impala查询统计分析,比原生的MapReduce以及Hive的执行速度快很多
Impala与HBase整合,需要将HBase的RowKey和列映射到Impala的Table字段中。Impala使用Hive的Metastore来存储元数据信息,与Hive类似,在于HBase进行整合时,也是通过外部表(EXTERNAL)的方式来实现。
下面,我们通过一个示例表test_info来说明,Hive与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中要进行映射的表名。
该Hive表一个外部表,所以删除该表并不会删除HBase表中的数据,有几点需要注意的是:
1、建表或映射表的时候如果没有指定:key则第一个列默认就是行键
2、HBase对应的Hive表中没有时间戳概念,默认返回的就是最新版本的值
3、由于HBase中没有数据类型信息,所以在存储数据的时候都转化为String类型
在Impala中同步元数据
Impala共享Hive的Metastore,这时需要同步元数据,可以通过在Impala Shell中执行同步命令:
INVALIDATE METADATA;
通过上面三步,我们就完成了Impala、Hive和HBase的整合配置。
验证整合
下面,我们通过实践来验证上述的配置是否生效。
我们模拟客户端插入数据到HBase表中,可以使用HBase API或者HBase Thrift来实现,这里我们使用了HBase Thrift接口来进行操作。
然后,我们就可以通过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;
上述程序运行所在Hadoop集群共有3个Datanode,执行上述统计SQL共用时88.13s。我的Hadoop集群配置比较低,2个节点是双核CPU,另一个是4核,内存足够,大概10G左右,而且还有好多程序在共享这些节点,如数据库服务器、SOLR集群等。如果提高配置,做一些优化,针对20000000(2000万)条记录做统计分析,应该可以在5s以内出来结果。
由于测试数据是我们随机生成的,gender取值为’M’和’F’,user_type的值为1到10,经过统计分组后,数据分布还算均匀。
相关文章推荐
- Impala与HBase整合实践
- Impala与HBase整合实践
- Impala hive hbase 整合
- 企业级系统用户浏览数据存储实例(hbase,hive,impala整合)
- Impala与HBase整合实践
- CDH5实践(二)Cloudera Manager 5安装Hive,HBase,Impala,Spark等服务
- CDH impala hive hbase 整合
- hive与hbase整合过程
- Hbase与hive整合
- 创建hive整合hbase的表总结
- hbase和hive整合
- hadoop2.4.1下整合hbase-0.96和hive-0.14
- hive存储处理器(StorageHandlers)以及hive与hbase整合
- 解决hive+hbase整合的时候遇到问题记录
- hive1.1.0与hbase0.98 整合
- hbase和hive的相互整合(需要兼容)
- 实时分析系统以及hbase、hive和impala的区别
- 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试
- Hive整合HBase完整笔记(亲测)
- Hive和Hbase整合