hive的metadata、metastore 、hiveserver2、beeline 之间的关系

本文深入解析Hive架构,包括metadata、metastore、hiveserver2和beeline等核心组件的功能与交互方式,阐述如何通过不同方式连接并利用Hive进行数据处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先解释一下几个名词:

metadata :hive元数据,即hive定义的表名,字段名,类型,分区,用户这些数据。一般存储关系型书库mysql中,在测试阶段也可以用hive内置Derby数据库。

metastore :hivestore服务端。主要提供将DDL,DML等语句转换为MapReduce,提交到hdfs中。

hiveserver2:hive服务端。提供hive服务。客户端可以通过beeline,jdbc(即用java代码链接)等多种方式链接到hive。

beelinehive客户端链接到hive的一个工具。可以理解成mysql的客户端。如:navite cat 等。

连接hive:

./bin/hive        

通过 ./bin/hive 启动的hive服务,第一步会先启动metastore服务,然后在启动一个客户端连接到metastore。此时metastore服务端和客户端都在一台机器上,别的机器无法连接到metastore,所以也无法连接到hive。这种方式不常用,一直只用于调试环节。

 ./bin/hive  --service metastore

通过hive --service metastore 会启动一个 hive metastore服务默认的端口号为:9083。metastore服务里面配置metadata相关的配置。此时可以有多个hive客户端在hive-site.xml配置hive.metastore.uris=thrift://ipxxx:9083  的方式链接到hive。motestore 虽然能使hive服务端和客户端分别部署到不同的节点,客户端不需要关注metadata的相关配置。但是metastore只能通过只能通过配置hive.metastore.uris的方式连接,无法通过jdbc的方式访问。

./bin/hiveserver2

hiveserver2 会启动一个hive服务端默认端口为:10000,可以通过beeline,jdbc,odbc的方式链接到hive。hiveserver2启动的时候会先检查有没有配置hive.metastore.uris,如果没有会先启动一个metastore服务,然后在启动hiveserver2。如果有配置hive.metastore.uris。会连接到远程的metastore服务。这种方式是最常用的。部署在图如下:

有问题暂时没搞明白metastore 只能部署在namenode节点吗?datanode可以吗?或者干脆不用和hadoop部署一起?后续要关注一下

./bin/beeline

beeline 可以启动客户端链接到hiveserver2。执行beeline后在控制输入 !connect jdbc:hive2://localhost:10000/default root 123 就可以链接到 hiveserver2了;default表示链接到default database, root 和123 分别为密码。注意这里的密码不是mysql的密码,是hive中的用户。如图:

 

 

 

 

 

 

 

 

### 问题分析 当执行 `create database if not exists jingwu` 操作时,Hive 报错 `FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient`[^1]。此错误通常表明 HiveMetastore 客户端无法被正确实例化。 以下是可能的原因及其对应的解决方案: --- ### 可能原因及解决方法 #### 1. **Metastore 服务未启动** 如果 HiveMetastore 服务未运行,则会引发此类异常。需要确认 Metastore 是否已正常启动并监听指定的端口(默认为 9083)。 - 启动 Metastore 服务命令如下: ```bash nohup hive --service metastore & ``` - 使用以下命令验证 Metastore 是否正在运行: ```bash netstat -an | grep 9083 ``` 如果没有看到监听端口的信息,则说明 Metastore 服务尚未启动[^4]。 --- #### 2. **MySQL 数据库连接配置不正确** HiveMetastore 默认依赖 MySQL 存储元数据信息。如果数据库连接字符串、用户名或密码配置错误,也会导致该问题。 - 检查 `hive-site.xml` 文件中的以下配置项是否正确: ```xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://<host>:<port>/<database>?useSSL=false&serverTimezone=UTC</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.cj.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value><username></value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value><password></value> </property> ``` - 确认 `<host>`、`<port>` 和 `<database>` 参数指向的是实际存在的 MySQL 实例,并且用户具有足够的权限访问目标数据库[^3]。 --- #### 3. **遗留进程干扰** 如果有多个 HiveMetastore 进程同时存在,可能会造成冲突。建议清理所有相关进程后再重新启动 Hive。 - 列出当前所有的 Hive/Metastore 进程: ```bash ps -ef | grep hive ``` - 杀死不必要的进程: ```bash kill -9 <PID> ``` - 清理完成后,再次尝试启动 Hive 并创建数据库[^5]。 --- #### 4. **Hive 配置文件中参数冲突** 某些情况下,`hive-site.xml` 中可能存在多余的配置项,例如 `hive.metastore.uris` 被误配或者重复定义。这种冲突可能导致客户端无法正确连接到 Metastore。 - 打开 `hive-site.xml` 文件,查找是否存在以下内容: ```xml <property> <name>hive.metastore.uris</name> <value>thrift://<hostname>:9083</value> </property> ``` - 如果不需要远程 Metastore 支持,可以直接注释掉该项或将值清空。随后重启 Hive 即可解决问题[^4]。 --- #### 5. **元数据表结构损坏** 即使 Metastore 正常工作,但如果底层 MySQL 表结构出现问题,也可能触发类似的错误。此时可以通过重建元数据来恢复环境。 - 删除现有元数据库: ```sql DROP DATABASE IF EXISTS metastore; CREATE DATABASE metastore; USE metastore; ``` - 初始化新的元数据表结构: ```bash schematool -initSchema -dbType mysql ``` 注意:操作前务必备份原始数据以防丢失。 --- ### 示例代码 以下是一个完整的流程示例,用于排查和修复上述问题: ```bash # Step 1: 检查 Metastore 服务状态 netstat -an | grep 9083 || (nohup hive --service metastore &) # Step 2: 修改配置文件 vi $HIVE_HOME/conf/hive-site.xml # Step 3: 清理旧进程 ps -ef | grep hive | awk '{print $2}' | xargs kill -9 # Step 4: 初始化元数据 schematool -initSchema -dbType mysql # Step 5: 创建测试数据库 beeline -u jdbc:hive2://localhost:10000 -e "CREATE DATABASE IF NOT EXISTS jingwu;" ``` --- ### 结论 通过以上步骤逐一排查,能够有效定位并解决 `Unable to instantiate SessionHiveMetaStoreClient` 错误。具体实施过程中需结合实际情况调整相应配置。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值