所需文件:
链接:https://pan.baidu.com/s/1DvUMixCMI8_-ITTOKP_guw
提取码:3uiv
整合目标:
测试HBASE中插入数据,hive中可以查询到测试
hive中插入数据,HBASE中可以查询到
原料:hadoop,zookeeper,hbase进程全部启动
第一步:
在hive使用有关HBASE中的jar包,将HBASE中lib下有关hbase-*.jar全部倒入到hive的lib目录下;
进入hbase的lib目录下
cp ./hbase-*.jar /usr/local/hive/lib
第二步:
将hive-hbase-handler-2.3.6.jar这个包导入到hive的lib目录下,并且将低版本的jar包删除(hive-hbase-handler-1.2.0.jar),此包的作用:是将hive中的表与HBASE用想对应的表做一个映射。
这个目录下的class文件是用于指定使用哪一个具体的类实现两个表的映射;
第三步:
在hive的conf目录下复制重命名hive-env.sh.template文件为hive-env.sh,并做如下修改:
cp hive-env.sh.template hive-env.sh
nano hive-env.sh
修改以下数据
第一个修改hadoop的主目录所在位置
第二个修改为hive的conf目录
第三个修改为hive的lib目录
ctrl+X退出文件
第四步:
修改hive-site.xml文件,配置zookeeper的信息。修改内容如下:
<property>
<name>hive.zookeeper.quorum</name>
<value>node51(主机名)</value>
</property>
<property>
<name>hive.zookeeper.client.port</name>
<value>2181</value>
</property>
第五步:
启动测试启动hadoop/hive/zookeeper/hbase
第六步: 查看是否能够互相映射表内容
1:添加hbase内容
先创建hbase的命名空间和表格,使用javaAPI添加数据
创建命名空间,创建表格,添加列簇使用main方法调用
@SuppressWarnings({ "deprecation", "resource" })
private static void Create() throws Exception {
// 创建配置对象
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.163.130:2181");
//创建操作的主用户
HBaseAdmin admin = new HBaseAdmin(conf);
//创建命名空间
NamespaceDescriptor create = NamespaceDescriptor.create("shopping").build();
admin.createNamespace(create);
System.out.println("命名空间创建完成");
//创建表
HTableDescriptor table=new HTableDescriptor(TableName.valueOf("shopping:users"));
//创建列簇
HColumnDescriptor cf1 = new HColumnDescriptor("base_info".getBytes());
HColumnDescriptor cf2 = new HColumnDescriptor("extra_info".getBytes());
table.addFamily(cf1);
table.addFamily(cf2);
admin.createTable(table);
System.out.println("表创建完成");
admin.close();
}
添加数据,使用的是桌面的data.txt,可以自行修改路径,网盘文件中自带
@SuppressWarnings({ "deprecation", "resource" })
private static void Insert() throws IOException {
// TODO Auto-generated method stub
// 创建配置对象
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.163.130:2181");
//创建表对象
HTable table = new HTable(conf, TableName.valueOf("shopping:users"));
//要读取的文件路径
FileReader reader = new FileReader("C:\\Users\\DELL\\Desktop\\data.txt");
//使用缓冲输入流
BufferedReader reader2 = new BufferedReader(reader);
//定义一个空字符串
String line = null;
//读出来的一行赋值给字符串,如果不是空,就继续读
while ((line=reader2.readLine())!=null) {
//对一行内容进行切割
String[] split = line.split("\t");
//第一行是行键
Put put = new Put(split[0].getBytes());
//按照字段名称,指定列簇,添加切割内容
put.add("base_info".getBytes(), "name".getBytes(), split[1].getBytes());
put.add("base_info".getBytes(), "age".getBytes(), split[2].getBytes());
put.add("extra_info".getBytes(), "hobbies1".getBytes(), split[3].getBytes());
put.add("extra_info".getBytes(), "hobbies2".getBytes(), split[4].getBytes());
table.put(put);
}
System.out.println("插入数据完成");
//关闭服务
table.close();
reader.close();
reader2.close();
}
进入hbase的shell命令行,扫描添加命名空间下表的内容
hbase shell
scan 'shopping:users'
2.在hive创建映射表
create external table users(id string,name string,age int,hobbies1 string,hobbies2 string) row format delimited fields terminated by '\t' stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties ("hbase.columns.mapping"=":key,base_info:name,base_info:age,extra_info:hobbies1,extra_info:hobbies2") tblproperties ("hbase.table.name"="shopping:users");
解释:
开头内容为创建一个hive外部表
1.1stored by 'org.apache.hadoop.hive.hbase.HbaseStorageHandler’
指定使用哪一个具体的类实现两个表的映射;
1.2
with serdeproperties (“hbase.columns.mapping”=":key,base_info:name,base_info:age,extra_info:hobbies1,extra_info:hobbies2")
指定HBASE表中的列簇下的列与hive表中的哪些字段是对应的关系;个表的映射;
1.3tblproperties (“hbase.table.name”=“shopping:users”);
指定hive与哪张HBASE表是映射关系;
添加映射完成
第七步:
插入数据测试测试HBASE中插入数据
hive中可以查询到测试hive中插入数据,HBASE中可以查询到
hive命令行
insert into users values('user9','kangkang','18','music',null);
插入hive一条数据
!exit
hbase shell
进入hbase查看表内容
scan 'shopping:users'
HIVE和HABASE整合完成