1. hive数据导入hbase
1.1 使用hbase外表方式加载
在hive中创建hbase外表,并指定hbase表名,将hbase映射到hive表。在hive中向hbase外表中插入数据,将数据同步到hbase中。
1.1.1 创建自己的用户
useradd xinniu
passwd xinniu
kadmin.local
addprinc -pw xinniu xinniu@HAINIU.COM
xst -norandkey -k /data/xinniu.keytab xinniu
exit
# 用hive用户给xinniu用户赋予超级角色
kinit hive
# 连接hive
beeline -u "jdbc:hive2://worker-1:10000/;principal=hive/worker-1@HAINIU.COM"
# 给xinniu 赋予超级角色
grant role admin_role to group xinniu;
# 查看hive的权限情况
show role grant group xinniu;
# 用hbase用户给xinniu赋予超级角色
kinit hbase
hbase shell
grant '@xinniu', 'CA'
1.1.2 创建hive的内部表
用 xinniu 用户创建
-- ***1 创建hbase外表 ***
-- key必须自带,相当于是rowkey
create table xinniu.source_table4hbase1(
key string,
pk string,
col1 string,
col2 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,cf:pk,cf:col1,cf:col2")
TBLPROPERTIES("hbase.table.name" = "xinniu:dataload1");
-- 注意:
-- 1)hbase库要先存在,而且xinniu用户要有操作hbase库的权限
kinit hbase
create_namespace 'xinniu'
grant '@xinniu', 'CA'
-- 2)创建hive的库
create database xinniu;
-- 3)hbase表如果不存在则会自动创建(不需要手动创建hbase表)
-- ------------------------------------------------
-- ***2 查询hive表数据插入到hbase外表中 ***
-- 创建 source_table1表
CREATE TABLE xinniu.source_table1(
pk string,
col1 string,
col2 string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'
STORED AS TEXTFILE;
-- 造数据,并上传到表对应的hdfs目录
[root@worker-1 hdfs_test]# vim t1
S0001|name1|boy
S0002|name2|girl
S0003|name3|boy
-- 用hdfs用户上传到
kinit hdfs
hadoop fs -put t1 hdfs://worker-1:8020/user/hive/warehouse/xinniu.db/source_table1
-- hive用户
-- 查询导入的数据
select * from xinniu.source_table1;
-- 查询source_table1表数据导入到 xinniu.source_table4hbase1 里
insert into table xinniu.source_table4hbase1
select concat(pk,col1) key,pk pk,col1 col1,col2 col2 from xinniu.source_table1;
-- 查看hive表
select * from xinniu.source_table4hbase1;
-- 查看hbase表
scan 'xinniu:dataload1'
-- ------------------------------------------------
-- ***3 删除hive内表 ***
-- 如果使用hive内表的方式创建hbase关联表,删除hive表的时候会同时删除掉hbase的表
drop table xinniu.source_table4hbase1;
-- 查看表列表,hive内部已删除
show tables;
-- 查看hbase表列表,对应的hbase表已经删除
list
导入后查看 hive表:
导入后查看hbase表:
1.1.2 创建hive的外部表
用 xinniu 用户创建
采用hive外表的方式可以保证只删除元数据,数据不删(hbase表不会删除)
-- 所以我们使用的时候通常采用hive外表的方式
-- ***1 创建hbase外表 ***
-- 【注意】如果使用的是hive的外表的形式创建的hbase的关联表则需要先创建hbase的表
-- 用xinniu创建hbase表,如果xinniu没有权限需要用hbase给xinniu赋权限 grant '@xinniu', 'CA'
kinit xinniu
create 'xinniu:dataload2','cf'
-- 创建hive外部表指向已存在的hbase表
create external table xinniu.source_table4hbase2(
key string,
pk string,
col1 string,
col2 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,cf:pk,cf:col1,cf:col2")
TBLPROPERTIES("hbase.table.name" = "xinniu:dataload2");
-- 当查询表数据时报错, 原因是hive用户没有操作 hive外表指定的hbase表权限
select * from xinniu.source_table4hbase2;
-- 用xinniu或hbase 给hive赋权限
grant '@hive', 'RWXCA', 'xinniu:dataload2'
-- ------------------------------------------------
-- ***2 查询hive表数据插入到hbase外表中 ***
-- 如果使用的是hive的外表的形式创建的hbase的关联表则需要先创建hbase的表
insert into table xinniu.source_table4hbase2
select concat(pk,col1) key,pk pk,col1 col1,col2 col2 from xinniu.source_table1;
-- 查看hive表
select * from xinniu.source_table4hbase2;
-- 查看hbase表
scan 'xinniu:dataload2'
-- ------------------------------------------------
-- ***3 删除hive外表 ***
-- 如果使用hive外部的方式创建hbase关联表,删除hive表的时候不会删除hbase表
drop table xinniu.source_table4hbase2;
-- 查看表列表,hive外部表已删除
show tables;
-- 查看hbase表列表,对应的hbase表已经删除
list
scan 'xinniu:dataload2'
导入后查看 hive表:
导入后查看hbase表:
1.2 importTSV+bulkload
1)创建文件并上传到hdfs
# 用hdfs用户把hdfs 的 /data 目录改进777,目的是让每个人都可以往这个目录里写
kinit hdfs
hadoop fs -chmod 777 /data
[xinniu@worker-1 ~]$ vim t2
S0001name1|S0001|name1|boy
S0002name2|S0002|name2|girl
S0003name3|S0003|name3|boy
kinit xinniu
hadoop fs -put t2 /data/xinniu
2)在hbase中创建表,并指定列族与压缩格式,hbase建表dataload3
create 'xinniu:dataload3',{NAME => 'cf',COMPRESSION => 'SNAPPY'}
3)使用importTSV生成hfile文件
-Dimporttsv.separator :指定分隔符
-Dimporttsv.columns :指定列映射
HBASE_ROW_KEY强制要求写
cf:pk指定rowkey字段
其他字段与hive表中对应
-Dimporttsv.skip.bad.lines:是否跳过无效行
-Dimporttsv.bulk.output:hfile输出路径
xinniu:dataload3:hbase表名
hdfs://worker-1:8020/data/xinniu/t2 :用于生成hfile文件的输入目录
# 用xinniu用户生成hfile文件
kinit xinniu
# 生成hfile文件命令
hbase org.apache.hadoop.hbase.mapreduce.ImportTsv \
-Dimporttsv.separator='|' \
-Dimporttsv.columns=HBASE_ROW_KEY,cf:pk,cf:col1,cf:col2 \
-Dimporttsv.skip.bad.lines=false \
-Dimporttsv.bulk.output=/data/xinniu45/hfile1 \
xinniu:dataload3 hdfs://worker-1:8020/data/xinniu/b.txt
导出hfile文件:
4)使用bulkload加载数据到hbase表中
# /data/xinniu/hfile :hfile路径
# xinniu:dataload3 :hbase表名
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles /data/xinniu/hfile2 xinniu:dataload3
查询hbase表xinniu:dataload3
scan 'xinniu:dataload3'
2. 导出hbase数据
使用hive外表的方式导出hbase数据
2.1 hbase数据导出text文件
1)使用hive外表的方式先关联到hbase 表
-- 创建hive外部表指向已存在的hbase表
create external table xinniu.source_table4hbase3(
key string,
pk string,
col1 string,
col2 string
)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" =":key,cf:pk,cf:col1,cf:col2")
TBLPROPERTIES("hbase.table.name" = "xinniu:dataload3");
-- 用hbase 给hive赋权限
grant '@hive', 'RWXCA', 'xinniu.source_table4hbase3'
2)将hive外表数据导出到指定目录。
# 创建 /data/xinniu/hbase_out目录,并赋予777权限
mkdir -p /data/xinniu/hbase_out
chmod 777 /data/xinniu/hbase_out
insert overwrite local directory'/data/xinniu/hbase_out/source_table4hbase'
row format delimited fields terminated by '|'
select * from xinniu.source_table4hbase3;
2.2 hbase数据导出为orc文件
1)创建一张临时的orc表,再将hbase外表的数据查询插入到orc表中,再将orc表数据执行导出,导出orc文件到指定路径。
-- 创建orc表
create table xinniu.orctable stored as orc
as
select * from xinniu.source_table4hbase3
where 1=0;
-- 通过hbase的hive外表将数据导入到orc表中
insert into table xinniu.orctable
select * from xinniu.source_table4hbase3;
2)通过导出命令指定导出orc文件
insert overwrite local directory'/data/xinniu/hbase_out/source_table4hbase_orc' stored as orc
select * from xinniu.source_table4hbase3;