之前做过hadoop的测试,测试了hive/impala对hbase数据的查询,这里以hive为例,impala查询hbase数据也类似。
hbase访问方式
NativeJAVAAPI | 最常规的最高效的访问方式 |
HbaseShell | Hbase的命令行供,以JRuby接口,最简单接入,适合HBase管理 |
ThriftGateway | 利用Thrift序列号技术,支持C++/PHP/Python等多种语言,适合其他异构系统在线访问Hbase数据 |
RESTGateway | 支持REST风格的HTTPAPI访问HBase,无语言限制 |
MapReduce | 直接使用MapReduce作业处理Hbase数据,使用Pig/Hive处理HBase数据 |
这里,hive查询hbase数据就是通过MapReduce访问方式。
hive查询hbase数据
1、创建Hbase表和插入记录
$hbaseshell
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>CREATEEXTERNALTABLEhbase_test(keystring,astring,bstring)
>ROWFORMATSERDE'org.apache.hadoop.hive.hbase.HBaseSerDe'
>STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
>WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,cf:a,cf:b")
>TBLPROPERTIES("hbase.table.name"="test");
OK
Timetaken:0.201seconds
3、Hive下查询hbase表数据
hive>select*fromhbase_test;
OK
row1value1avalue1b
row2value2avalue2b
Timetaken:0.219seconds,Fetched:2row(s)
hive无法查询hbase原因
1、hdfs权限问题
当前用户在hive下要有权值执行MapReduce操作,最简单的检查方式是执行“select*fromtestwhere1;”这种带where子句查询。
权限不足会报这个错误:
Permissiondenied:user=root,access=READ,inode="/user"
解决办法:
sudo-uhdfshadoopfs-chmod-R777/user
2、扩展表字段问题
hive表字段要和hbase列记录字段要对应,支持string,int等类型,hive会做格式转换
参考:http://blog.youkuaiyun.com/mycwq/article/details/39518897