之前做过hadoop的测试,测试了hive/impala对hbase数据的查询,这里以hive为例,impala查询hbase数据也类似。
hbase访问方式
Native JAVA API |
最常规的最高效的访问方式 |
Hbase Shell |
Hbase的命令行供,以JRuby接口,最简单接入,适合HBase管理 |
Thrift Gateway |
利用Thrift序列号技术,支持C++/PHP/Python等多种语言,适合其他异构系统在线访问Hbase数据 |
REST Gateway |
支持REST风格的HTTP API访问 HBase,无语言限制 |
MapReduce |
直接使用MapReduce作业处理Hbase数据,使用Pig/Hive处理HBase数据 |
这里,hive查询hbase数据就是通过MapReduce访问方式。
1、创建Hbase表和插入记录
$ hbase shell
hbase(main):001:0> create 'test','cf'
hbase(main):002:0> put 'test','row1','cf:a','value1a'
hbase(main):003:0> put 'test','row1','cf:b','value1b'
hbase(main):004:0> put 'test','row2','cf:a','value2a'
hbase(main):005:0> put 'test','row2','cf:b','value2b'
2、创建Hive外部表
$ hive
hive> CREATE EXTERNAL TABLE hbase_test( key string, a string, b string)
> ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
> STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
> WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf:a,cf:b")
> TBLPROPERTIES("hbase.table.name" = "test");
OK
Time taken: 0.201 seconds
3、Hive下查询hbase表数据
hive> select * from hbase_test;
OK
row1 value1a value1b
row2 value2a value2b
Time taken: 0.219 seconds, Fetched: 2 row(s)
hive无法查询hbase原因
1、hdfs权限问题
当前用户在hive下要有权值执行MapReduce操作,最简单的检查方式是执行“select * from test where 1;”这种带where子句查询。
权限不足会报这个错误:
Permission denied: user=root, access=READ, inode="/user"
解决办法:
sudo -u hdfs hadoop fs -chmod -R 777 /user
2、扩展表字段问题
hive表字段要和hbase列记录字段要对应,支持string,int等类型,hive会做格式转换
参考:http://blog.csdn.net/mycwq/article/details/39518897