访问hive
Hive 访问方式:本地命令行 → 远程 JDBC,从 hive 到 beeline 到 DataGrip
Hive 默认的 hive 命令是本地客户端——只能在那台装了 Hive 的机器上用。
如果你要:
- 在另一台机器上连 Hive
- 用 DataGrip、DBeaver 连 Hive
- 用 Python/Java 代码操作 Hive
那就必须起两个服务:
| 服务 | 端口 | 管什么 |
|---|---|---|
| Metastore | 9083 | 元数据服务(表结构、分区信息) |
| HiveServer2 | 10000 | JDBC 服务(接收远程连接、执行 SQL) |
Metastore 是”数据库的数据库”——存表结构;HiveServer2 是”服务入口”——收 SQL 请求,翻译成任务去跑。
方式1:本地命令行 hive(最简单,只能本地)
直接敲 hive 就能进交互界面:
bin/hive
show databases;
create table test(id int);
exit;
特点:
- 只能在那台装了 Hive 的机器上用
- 不需要额外起服务(默认连本地 Derby 或配置好的 MySQL)
- 适合快速测试、验证 SQL
局限: 换个机器就连不上。
方式2:起 Metastore 服务——让元数据共享
默认情况下,每个 hive 客户端直接连元数据库(MySQL/Derby)。多个客户端同时连可能出问题(Derby 更明显)。
起 Metastore 服务后,所有客户端都通过这个服务访问元数据,统一管理。
配置(hive-site.xml):
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
启动 Metastore:
前台跑(调试用)
bin/hive --service metastore
后台跑(生产用)
nohup bin/hive --service metastore > metastore.log 2>&1 &
验证:
netstat -tlnp | grep 9083 # 端口在监听
什么时候必须起 Metastore?
- 多客户端共享元数据
- 要用 HiveServer2(它依赖 Metastore)
方式3:起 HiveServer2——支持 JDBC 远程连接
HiveServer2 是 JDBC/Thrift 服务,让远程工具(DataGrip、Beeline、Python 代码)能连 Hive。
依赖关系: HiveServer2 依赖 Metastore,所以要先起 Metastore,再起 HiveServer2。
配置(hive-site.xml):
<property>
<name>hive.server2.thrift.bind.host</name>
<value>0.0.0.0</value>
</property>
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
启动 HiveServer2:
前台跑(调试用)
bin/hiveserver2
后台跑(生产用)
nohup bin/hiveserver2 > hiveserver2.log 2>&1 &
验证:
netstat -tlnp | grep 10000 # 端口在监听
注意: HiveServer2 启动较慢(30 秒到 1 分钟),看日志里出现 Started HiveServer2 才算真正起来了。
方式4:Beeline——HiveServer2 的命令行客户端
hive 是本地客户端,beeline 是 JDBC 客户端——它通过 HiveServer2 连 Hive,可以远程。
连接本地 HiveServer2
bin/beeline -u "jdbc:hive2://localhost:10000" -n root
连接远程 HiveServer2
bin/beeline -u "jdbc:hive2://192.168.1.100:10000" -n root
进入后跟 hive 命令行一样:
beeline> show databases;
beeline> select * from test;
Beeline vs Hive CLI:
hive 命令 |
beeline 命令 |
|
|---|---|---|
| 连接方式 | 直连元数据库 | 通过 HiveServer2 JDBC |
| 是否远程 | 否(只能本地) | 是(可远程) |
| 依赖 | Metastore | Metastore + HiveServer2 |
| 推荐度 | 老方式 | 新方式,官方推荐 |
方式5:第三方工具 JDBC 连接
DataGrip / DBeaver / SQL Workbench 配置:
| 配置项 | 值 |
|---|---|
| 连接类型 | Hive |
| 主机 | HiveServer2 所在机器 IP |
| 端口 | 10000 |
| 用户名 | Hadoop 用户名(如 root) |
| 密码 | 通常为空(依赖 Hadoop 权限) |
| 数据库 | default |
Python(用 pyhive):
from pyhive import hive
conn = hive.Connection(
host='192.168.1.100',
port=10000,
username='root',
database='default'
)
cursor = conn.cursor()
cursor.execute('SHOW TABLES')
for row in cursor.fetchall():
print(row)
Java(JDBC):
Class.forName("org.apache.hive.jdbc.HiveDriver");
Connection conn = DriverManager.getConnection(
"jdbc:hive2://192.168.1.100:10000/default",
"root",
""
);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SHOW TABLES");
方式6:非交互式执行(脚本化)
适合定时任务、自动化脚本。
执行单条 SQL(-e):
hive -e "SELECT COUNT(*) FROM test"
执行 SQL 文件(-f):
hive -f /path/to/query.sql
静默模式(-S,只输出结果,不输出日志):
hive -S -e "SELECT * FROM test"
传参数(-d):
hive -d dt=2026-07-17 -e "SELECT * FROM events WHERE dt='${dt}'"
常见问题
1. HiveServer2 起不来
先确认 Metastore 起来了,HiveServer2 依赖它。
检查 Metastore
ps -ef | grep metastore
检查端口
netstat -tlnp | grep 9083
2. Beeline 连不上,报 Connection refused
检查 HiveServer2 是否启动,防火墙是否开放 10000 端口。
3. Beeline 连上了,执行 SQL 报错 “Permission denied”
HDFS 目录权限问题。确认 Hive 的 warehouse 目录(默认 /user/hive/warehouse)有写权限。
hdfs dfs -chmod 777 /user/hive/warehouse