Hive和HBase连接
1.首先更改Hive下的hive-site.xml
在文件中加入zookeeper的相关依赖
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave01,slave02</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>
2.创建软连接
将HBase下的某些jar包软连接到Hive下:
hbase-common-1.4.10.jar hbase-server-1.4.10.jar hbase-client-1.4.10.jar hbase-protocol-1.4.10.jar
hbase-it-1.4.10.jar hbase-hadoop2-compat-1.4.10.jar hbase-hadoop-compat-1.4.10.jar
htrace-core-3.1.0-incubating.jar
任意目录下操作即可
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
3.在Hive下创建表关联到HBase
注意:建表之前先把zookeeper hadoop hbase hive mysql 全部启动(个人认为得全部启动)
例如:Hive下创建的hive_hbase_emp_table(自己命名即可)表和HBase下的hbase_emp_table(自己命名即可)相关连
创建完成后,可以在Hive下看到hive_hbase_emp_table表,在HBase下看到hbase_emp_table表
# 在hive下创建员工信息表
# empno 员工号 ename 姓名 job 工作名 mgr -- hiredate 入职时间 sal 薪资 comm 津贴 deptno 部门编号
hive> 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");
1) 可能会出现的问题(没有出现该问题可跳过该步):
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
# 或者
Cannot find class 'org.apache.hadoop.hive.hbase.struct.HBaseStorageHandler'
2) 原因:
Hive和HBase关联时,在创建表时,在hive下会出现hive-hbase-handler-1.2.2.jar,由于其引用的版本过低,导致HBase不能识别。
3) 解决办法:
修改hive-hbase-handler-1.2.2.jar的HBase相关jar包
1. 打开一个eclipse
2. 在eclipse中随便创建已给java工程
3. 将我们之前下载好的源码导入到eclipse的src目录下,这个时候一会发现一堆错误提示
file ---> import ---> filesystem--->选择你的源码--->finish
4. 创建一个lib目录,把准备好的jar包都拷贝到lib目录中
5. 选中所有的jar包---鼠标右键--->build path
你就会发现不报错
6. 导出
file--->export--->jar file --->
7. 将这个jar包拷贝回hive的lib目目录中,把原来的那个jar包给干掉!!!
具体方法:
(1).首先从官网下载相关jar包
地址:http://archive.apache.org/dist/hive/hive-1.2.2/ 注意和自己的Hive版本对应
(2).解压缩到本地文件夹
任意目录下都行!!!
(3).在eclipse操作
可以选择在Windows下操作,也可以在Linux下的eclipse操作,我选择在Linux下操作(导包方便)
在Windows下需要将虚拟机中hadoop和hbase的lib下的jar包导出来,感觉挺费劲(个人认为不好用)
在Linux下:
将解压问价拖入虚拟机的桌面
在eclipse下创建工程后导入文件
将Hive和HBase下的lib下的所有jar包导入
!!!注意:先找到hive-hbase-handler-1.2.2.jar包并移除,然后将org文件夹移入src下
导出为hive-hbase-handler-1.2.2.jar
(4).将jar包移动到hive的lib下替换原来的jar包
mv ./hive-hbase-handler-1.2.2.jar /usr/local/hive/lib/
(5). 重启hive
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");
可以通过命令查看建表是否成功(如果hive和hbase下均出先刚建的表,则成功)
hive> show tables;
hbase> list;
4.写数据
Hive写入HBase:
例如:先在hive的tmp下建立emp.txt(文件可任意建,内容需和上面建的表一致,可用下面的例子)
7369 SMITH CLERK 7902 1980-12-17 800.00 20 1000
7368 SMITH CLERK 7902 1980-12-17 800.00 20 1001
7367 SMITH CLERK 7902 1980-12-17 800.00 20 1002
7366 SMITH CLERK 7902 1980-12-17 800.00 20 1003
7365 SMITH CLERK 7902 1980-12-17 800.00 20 1004
7364 SMITH CLERK 7902 1980-12-17 800.00 20 1005
7363 SMITH CLERK 7902 1980-12-17 800.00 20 1006
7362 SMITH CLERK 7902 1980-12-17 800.00 20 1007
7361 SMITH CLERK 7902 1980-12-17 800.00 20 1008
7360 SMITH CLERK 7902 1980-12-17 800.00 20 1009
创建一个中间表,用于将数据导入关联表中(中间表字段需要和之前创建的关联表字段相同)
# 创建中间表
hive> 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';
# 将文件导入该表
hive> load data local inpath '/usr/local/hive/tmp/emp.txt' into table emp;
# 查询该表导入关联表
hive> insert into table hive_hbase_emp_table select * from emp;
# 在hive下可查看该表信息
hive> select * from hive_hbase_emp_table;
# 在hbase下也可查看到相应信息
hbase> scan 'hbase_emp_table'
HBase写入Hive:
可直接在hbase下向hbase_emp_table下插入文件,在hive下可查看到相应信息
hbase> put 'hbase_emp_table', '7935', 'info:ename', 'zahngsan'
(!!!看网上的)如果一张表在hbase中存放了很久,数据量并没有达到hbase数据量的要求,那么就可以在hive中中创建一个外部表来关联hbase中的表,使之可以借助hive来分析hbase这张表中的数据。
hive> 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");