引言
我们都知道hive数据存储在hdfs上,元数据可以存储在mysql中,计算框架采用mapreduce,hive实际上只做分析工具。那么hive的数据是不是也可以存储在hbase呢?
一、配置hive
1、创建hive所需要的hbase相关联包的软链接
ln -s $HBASE_HOME/lib/hbase-common-1.4.10.jar $HIVE_HOME/lib/hbase-common-1.4.10.jar
ln -s $HBASE_HOME/lib/hbase-server-1.4.10.jar $HIVE_HOME/lib/hbase-server-1.4.10.jar
ln -s $HBASE_HOME/lib/hbase-client-1.4.10.jar $HIVE_HOME/lib/hbase-client-1.4.10.jar
ln -s $HBASE_HOME/lib/hbase-protocol-1.4.10.jar $HIVE_HOME/lib/hbase-protocol-1.4.10.jar
ln -s $HBASE_HOME/lib/hbase-it-1.4.10.jar $HIVE_HOME/lib/hbase-it-1.4.1.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.4.10.jar $HIVE_HOME/lib/hbase-hadoop2-compat-1.4.10.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.4.10.jar $HIVE_HOME/lib/hbase-hadoop-compat-1.4.10.jar
ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
2、在hive-site.xml中修改zookeeper的属性,如下:
<property>
<name>hive.zookeeper.quorum</name>
<value>node01,node02,node03</value>
<description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
<description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
二、hive中数据与hbase相关联
1、在 Hive 中创建表同时关联 HBase (hive表hive_hbase_emp_table关联hbase表hbase_emp_table)
CREATE TABLE hive_hbase_emp_table(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
注意:如果这步提示出错:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescriptor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V,只需要将hive/lib/hive-hbase-handler-1.2.1.jar下载到本地,在hbase版本的jar包下编译即可(推荐用Eclipse的export很方便就能编译成功),上传编译后的jar包到hive/lib目录下即可解决
2、查看hive和hbase中表是否创建成功
3、在Hive中创建临时中间表,用于load文件中的数据
create table emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by ‘\t’;
4、向Hive中间表中load数据
load data local inpath '/home/bigdata/data/emp.txt' into table emp;
测试数据:
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1987-4-19 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1987-5-23 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
5、通过insert命令将中间表中的数据导入到Hive关联Hbase的那张表中
insert into table hive_hbase_emp_table select * from emp;
6、查看Hive以及关联的HBase表中是否已经成功的同步插入了数据
附加
为什么要创建中间表使用insert语句往hive表插入数据,不能直接使用load命令往hive表中导入数据吗?
答案是不能的。因为hive表与hbase表相关联的话,实际数据是存储在hbase中的。而hbase中的数据是以HFile的形式存储在hdfs上的,如果直接使用load命令,是以txt格式导入到hive表的,insert命令是走mapreduce任务的
三、hbase中数据与hive相关联
如果一张表在hbase中存放了很久,数据量并没有达到hbase数据量的要求,那么就可以在hive中中创建一个外部表来关联hbase中的表,使之可以借助hive来分析hbase这张表中的数据。
1、在Hive中创建外部表(hbase表hbase_emp_table关联hive表relevance_hbase_emp)
create external table relevance_hbase_emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =
":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
2、在hbase表hbase_emp_table中插入一条数据,观察hive表relevance_hbase_emp中是否有新数据
3、关联成功后就可以使用Hive函数进行一些分析操作了