
在之前的章节中我们已经一同学习的Hive和HBase相关的知识,但是Hive和HBase都存在各自的问题,Hive实时性不强单条写入数据慢,HBase查询能力差不具备复杂查询的能力,但是Hive和HBase有个隐藏的功能就是关联操作,既然可以享受到HBase的实时性还可以享受到Hive查询带来的便捷.
附上:
喵了个咪的博客:w-blog.cn
1.前言
**注意:**Hive2.3.0 和 Hbase 关联表 使用 select count(*) form 表名 只会返回0条不会走 MR 程序 可以通过count(字段) 来查询会查询到具体数字 Hive2.1.1版本无此问题
Hive提供了与HBase的集成,使得能够在HBase表上使用HQL语句进行查询 插入操作以及进行Join和Union等复杂查询,一方面可以通过Hive来补充Hbase在结构查询场景的不足,一方面Hbase可以作为Hive的一个数据源
优点:
Hive方便地提供了Hive QL的接口来简化MapReduce的使用, 而HBase提供了低延迟的数据库访问。如果两者结合,可以利 用MapReduce的优势针对HBase存储的大量内容进行离线的计算和分析。 操作方便,hive提供了大量系统功能
缺点:
性能的损失,hive有这样的功能, 他支持通过类似sql语句的语法来操作hbase中的数据, 但是速度慢。
2.准备环境
要结合使用hbase在hive所在的节点上必须要配置hbase 大家发现在运行HIVE命令的时候会出现,缺少hbase 可以看到hive默认就已经开始支持hbase了
which: no hbase in (/usr/local/ant/bin:/usr/local/hadoop-2.7.3/bin:/usr/local/hive-2.1.1/bin:/usr/local/jdk1.8/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
我们首先需要把hbase 从hadoop-1 cp 到hive机器上
> scp -r /usr/local/hbase-1.3.1/ root@192.168.1.104:/usr/local/hbase-1.3.1/
修改环境配置文件
> vim /etc/profile # hbase export HBASE_HOME=/usr/local/hbase-1.3.1 export PATH=$HBASE_HOME/bin:$PATH > source /etc/profile
配置好之后在运行hive就不会有上面的which提示了
3.关联
创建一个Hbase能够识别的Hive表
CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "hbase_table_1");
其中:
- hbase.table.name 定义在hbase的table名称
- hbase.columns.mapping 定义在hbase的列族
hbase里自动建好hbase_table_1这个表然后在Hive和Hbase查看表
hive> SHOW TABLES; OK hbase_table_1 Time taken: 0.014 seconds, Fetched: 1 row(s)
hbase(main):004:0> list TABLE hbase_table_1 member member2 3 row(s) in 0.0040 seconds
可以在Hbase中查看一下表的描述
hbase(main):005:0> describe 'hbase_table_1' Table hbase_table_1 is ENABLED hbase_table_1 COLUMN FAMILIES DESCRIPTION {NAME => 'cf1', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCOD ING => 'NONE', TTL => 'FOREVER', COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REP LICATION_SCOPE => '0'} 1 row(s) in 0.0900 seconds
使用 Hbase插入几条数据
put 'hbase_table_1','100','cf1:val','www.gongchang.com';
也可以通过Hive中写入数据然后映射到Hbase中(明显在Hive中插入数据会指向MR效率太慢了)
INSERT INTO TABLE hbase_table_1 values("101","www.baidu.com");
查看数据
hbase(main):021:0> scan 'hbase_table_1' ROW COLUMN+CELL 100 column=cf1:val, timestamp=1501654042302, value=www.gongchang.com 101 column=cf1:val, timestamp=1501654548848, value=www.baidu.com 2 row(s) in 0.0130 seconds
hive> select * from hbase_table_1; OK 100 www.gongchang.com 101 www.baidu.com Time taken: 0.16 seconds, Fetched: 2 row(s)
这样建立出来的表插入的源数据都是在Hbase里面存放着,当从Hbase中删除记录的同时也会删除在Hive中的数据
数据可以导入到Hive中另外一个表中独立于Hbase数据
CREATE TABLE hbase_table_2(key int, value string); insert overwrite TABLE hbase_table_1 select * from hbase_table_1 where key = '100';
上面这种方式是内连表删除Hive中的表同时也会影响到Hbase中的数据
上面是在创建Hive的表的时候一同创建了Hbase的表一般的情况Hbase的数据可能先存在要怎么关联到Hive中(这类是外链表删除Hive中的表不影响Hbase中的数据)
准备Hbase数据
hbase(main):009:0> create 'student','info' 0 row(s) in 1.7530 seconds put "student",'1','info:name','tom' put "student",'2','info:name','lily' put "student",'3','info:name','wwn' hbase(main):032:0> scan 'student' ROW COLUMN+CELL 1 column=info:name, timestamp=1501655363517, value=tom 2 column=info:name, timestamp=1501655363526, value=lily 3 column=info:name, timestamp=1501655363534, value=wwn 3 row(s) in 0.0080 seconds
创建Hive中的关联表
CREATE EXTERNAL TABLE hbase_table_3(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name") TBLPROPERTIES("hbase.table.name" = "student"); hive> select * from hbase_table_3; OK 1 tom 2 lily 3 wwn Time taken: 0.109 seconds, Fetched: 3 row(s)
4. 多列和多列族
CREATE TABLE hbase_table_add1(key int, value1 string, value2 int, value3 int) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:col1,info:col2,city:nu") TBLPROPERTIES("hbase.table.name" = "student_info");
通过参数hive.cli.print.header可以控制在cli中是否显示表的列名。 hive> set hive.cli.print.header=true;
hive> select * from hbase_table_3; OK hbase_table_3.key hbase_table_3.value 1 tom 2 lily 3 wwn Time taken: 0.113 seconds, Fetched: 3 row(s)
insert overwrite table hbase_table_add1 select key,value,key+1,key+100 from hbase_table_3;
hive> select * from hbase_table_add1; OK hbase_table_add1.key hbase_table_add1.value1 hbase_table_add1.value2 hbase_table_add1.value3 1 tom 2 101 2 lily 3 102 3 wwn 4 103 Time taken: 0.097 seconds, Fetched: 3 row(s)
hbase(main):037:0> list TABLE hbase_table_1 member member2 student student_info 5 row(s) in 0.0050 seconds => ["hbase_table_1", "member", "member2", "student", "student_info"] hbase(main):038:0> scan 'student_info' ROW COLUMN+CELL 1 column=city:nu, timestamp=1501656221390, value=101 1 column=info:col1, timestamp=1501656221390, value=tom 1 column=info:col2, timestamp=1501656221390, value=2 2 column=city:nu, timestamp=1501656221390, value=102 2 column=info:col1, timestamp=1501656221390, value=lily 2 column=info:col2, timestamp=1501656221390, value=3 3 column=city:nu, timestamp=1501656221390, value=103 3 column=info:col1, timestamp=1501656221390, value=wwn 3 column=info:col2, timestamp=1501656221390, value=4 3 row(s) in 0.0120 seconds
这里有3个hive的列,(value1和value2,value3),2个hbase的列簇(info,city) hive的2列(value,和value2)对应1个hbase的列簇(info,在hbase的列名称col1,col2), hive的另外1列(value3)对应列nu位于city列簇。
这里实现了hive中表,多列存放到hbase少量固定的列簇中。
5 总结
Hive和HBase相结合有更高的灵活性,无论是对HBase数据统计查询还是对Hive扩展数据源都有很好的使用场景,下节将给大家介绍一个厉害的大数据管理工具HUE,最后谢谢大家的支持我们下节再见!
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!