三-3, HBase 与 Hive 交互
三-3, HBase 与 Hive 交互
3.1 HBase 与 Hive 的对比
[Hive]
梗概 | 详述 |
---|---|
1. 数据仓库 | Hive 的本质其实就相当于将 HDFS 中已经存储的文件在 Mysql 中做了一个双射关系,以 |
方便使用 HQL 去管理查询。 | |
2. 用于数据分析,清洗 | Hive 适用于离线的数据分析和清洗,延迟较高。 |
3. 基于HDFS,MapReduce | Hive 存储的数据依旧在 DataNode 上,编写的 HQL 语句终将是转换为 MapReduce 代码执 |
行。 |
[HBse]
梗概 | 详述 |
---|---|
1. 数据库 | 是一种面向列族存储的非关系型数据库。 |
2.用于存储结构化和非结构化的数据 | 适用于单表非关系型数据的存储,不适合做关联查询,类似 JOIN 等操作。 |
3. 基于HDFS | 数据持久化存储的体现形式是 HFile,存放于 DataNode 中,被 ResionServer 以 region 的形 |
式进行管理。 | |
4. 延迟较低, 接入在线业务使用 | 面对大量的企业数据,HBase 可以实现单表大量数据的存储,同时提供了高效的数据访问 |
速度。 |
3.2 HBase 与Hive 集成使用
[环境准备]
- 如果有一些数据存储在hbase 当中 我们想通过sql 析其中的数据, 那么把hbase与hive 集成就是一个不错的方法,本质上来说就是hive 充当了hbase的客户端。
- 后续我们需要实现在hive中建表,同时hbase也会出现这张表, 所以我们需要hive 持有hbase的jar包依赖.
A要使用 B,那么A要有B的jar包
。例如:在 Hive的安装中,Hive需要使用到MySQL数据库,所以将jdbc驱动包放到lib文件夹中
- 通过软链接, 让hbase的lib目录持有一个到
${HBASE_HOME}/hbase-2.3.7/lib
目录的映射, 首先我们cd到/opt/module/hive-3.1.2/lib
目录下,执行软链接命令
ln -s /opt/module/hbase-2.3.7/lib
- 在当前目录下发送指令
ll
, 会有以下内容, 说明链接成功
- 其他组件访问HBase时, 首先要访问的便是zookeeper, hive也不例外. 所以hive的
hive-site.xml
文件中还要引入连接zk相关的配置:
<!---配置zookeeper的地址用于访问hbase-->
<property>
<name>hive.zookeeper.quorum</name>
<value>bigdata01,bigdata02,bigdata03</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>
3.3. 案例一, 向Hive中插入数据,同步到HBase中
[目标]
- 建立 Hive 表,关联 HBase 表,插入数据到 Hive 表的同时能够影响 HBase 表。
[方法]
- 在HIVE中建表,同时加上关联HBse 的相关语句
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中理应当都含有该表;
- 在 Hive 中创建临时中间表,用于 load 文件中的数据. 不能将数据直接 load 进 Hive 所关联 HBase 的那张表中
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 数据
hive> load data local inpath '/opt/module/data/hive-data/input/emp.txt' into table emp;
- 通过 insert 命令将中间表中的数据导入到 Hive 关联 Hbase 的那张表中
hive> insert into table hive_hbase_emp_table select * from emp;
- 查看 Hive 以及关联的 HBase 表中是否已经成功的同步插入了数据
#Hive:
hive> select * from hive_hbase_emp_table;
#HBase:
Hbase> scan ‘hbase_emp_table’
3.4 案例二,
目标:在 HBase 中已经存储了某一张表 hbase_emp_table,然后在 Hive 中创建一个外部表来
关联 HBase 中的 hbase_emp_table 这张表,使之可以借助 Hive 来分析 HBase 这张表中的数
据。
注:该案例 2 紧跟案例 1 的脚步,所以完成此案例前,请先完成案例 1。
- 在 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:co
mm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
- 关联后就可以使用 Hive 函数进行一些分析操作了
hive (default)> select * from relevance_hbase_emp;
no")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");
- 关联后就可以使用 Hive 函数进行一些分析操作了
hive (default)> select * from relevance_hbase_emp;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)