访问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

hive> show databases;
hive> create table test(id int);
hive> 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