目录
0.HBase与Hive的对比
0.1 Hive(分析框架)
(1) 数据仓库 Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以方便使用 HQL 去管理查询。
(2) 用于数据分析、清洗 Hive 适用于离线的数据分析和清洗,延迟较高。
(3) 基于 HDFS、MapReduce Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执行。
0.2 HBase(存储框架)
(1) 数据库是一种面向列族存储的非关系型数据库。
(2) 用于存储结构化和非结构化的数据适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。
(3) 基于 HDFS 数据持久化存储的体现形式是 HFile,存放于 DataNode 中,被 ResionServer 以 region 的形式进行管理。
(4) 延迟较低,接入在线业务使用面对大量的企业数据,HBase 可以直线单表大量数据的存储,同时提供了高效的数据访问速度。
1.前置准备
jdk 1.8
hadoop 2.7.7集群
zookeeper 3.5.7集群
hbase 1.4.13集群
mysql 5.3 node01单机
hive 2.3.6 node01单机(mysql-connector-java-8.0.15)
2.Hive读取HBase中的数据
先在HBase上创建一张表hbase_hive(方便测试使用默认命名空间default)
hbase(main):025:0> create 'hbase_hive','info'
向hbase_hive表中插入两条测试数据
hbase(main):031:0> put 'hbase_hive','user001','info:name','xiaokang'
hbase(main):032:0> put 'hbase_hive','user001','info:age',18
hbase(main):033:0> put 'hbase_hive','user002','info:name','xiaokang1'
hbase(main):034:0> put 'hbase_hive','user002','info:age',19
在Hive中创建外部表hive_user并关联到HBase的hbase_hive
create external table hive_user(userid string,name string,age int) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,info:name,info:age") tblproperties("hbase.table.name" = "hbase_hive");
读取Hive中表,测试
hive (default)> select * from hive_user;
OK
Time taken: 0.989 seconds, Fetched: 1 row(s)
向HBase的hbase_hive表中再添加一条数据进行读取测试
hbase(main):033:0> put 'hbase_hive','user003','info:name','xiaokang2'
hbase(main):034:0> put 'hbase_hive','user003','info:age',20
hive (default)> select * from hive_user;
OK
hive_user.userid hive_user.name hive_user.age
user001 xiaokang 18
user002 xiaokang1 19
user003 xiaokang2 20
Time taken: 0.471 seconds, Fetched: 3 row(s)
3.Hive写入数据到HBase中
先在HBase上创建一张表from_hive(数据导入到此表中)
hbase(main):025:0> create 'from_hive','info'
在Hive中创建外部表hive_user_hbase并关联到HBase的from_hive
create external table hive_user_hbase(userid string,name string,age int) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping" = ":key,info:name,info:age") tblproperties("hbase.table.name" = "from_hive");
在Hive中创建临时表(用于将数据写入到hive_user_hbase)
create temporary table tmp_user(userid string,name string,age int) row format delimited fields terminated by '\t';
在Hive中,向临时表中加载数据
load data local inpath '/home/xiaokang/user.txt' into table tmp_user;
#查询验证数据是否加载成功
hive (default)> select * from tmp_user;
OK
tmp_user.userid tmp_user.name tmp_user.age
user111 xiaokang 18
user222 xiaokang 19
user333 xiaokang 20
user444 xiaokang 21
Time taken: 0.379 seconds, Fetched: 4 row(s)
Hive向HBase中写入数据
hive (default)> insert into table hive_user_hbase select * from tmp_user;
在HBase中验证数据是否写入
#扫描全表(大数据量的情况下不推荐,会造成机器崩溃)
hbase(main):041:0> scan 'from_hive'
ROW COLUMN+CELL
user111 column=info:age, timestamp=1585814173216, value=18
user111 column=info:name, timestamp=1585814173216, value=xiaokang
user222 column=info:age, timestamp=1585814173216, value=19
user222 column=info:name, timestamp=1585814173216, value=xiaokang
user333 column=info:age, timestamp=1585814173216, value=20
user333 column=info:name, timestamp=1585814173216, value=xiaokang
user444 column=info:age, timestamp=1585814173216, value=21
user444 column=info:name, timestamp=1585814173216, value=xiaokang
4 row(s) in 0.0320 seconds