hive常见配置
Hive 配置:先配必选项,再调性能项,最后按场景优化
Hive 的配置项很多,但不用全记住。按优先级分三层:
| 层级 | 配置内容 | 不配会怎样 |
|---|---|---|
| 必配项 | 元数据存储(MySQL)、Metastore 地址 | 跑不起来 |
| 常用调优项 | 执行引擎、显示设置、动态分区 | 能用但体验差/效率低 |
| 场景化配置 | Join 优化、并行度、内存 | 特定场景下性能瓶颈 |
这篇文章按”从必配到选配”的顺序讲,核心原则:先让 Hive 能跑,再调性能,最后按业务场景优化。
配置查看方式
改配置之前,先知道怎么看当前配置。
-- 看所有配置
hive> set;
-- 看某个配置
hive> set hive.execution.engine;
-- 输出:hive.execution.engine=mr
配置优先级:谁覆盖谁?
同一个配置可以在多个地方设置,优先级从高到低:
交互式 set 命令 > 命令行 -hiveconf > hive-site.xml > hive-default.xml
| 配置方式 | 生效范围 | 什么时候用 |
|---|---|---|
hive-default.xml |
全局默认 | 一般不碰 |
hive-site.xml |
全局 | 生产核心配置(放这里) |
启动时 -hiveconf |
当前会话 | 临时测试某个参数 |
交互式 set |
当前会话 | 调试时现场改 |
举个例子:
hive-site.xml 里配了 hive.execution.engine=mr,启动时加了 hive -hiveconf hive.execution.engine=spark,那这次会话用的就是 Spark。交互式里 set hive.execution.engine=tez 会覆盖前面两者。
记住:改哪个生效,看优先级。
必配项:不配跑不起来
1. 元数据存储地址(MySQL 连接)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/metastore?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
2. Metastore 服务地址(如果起了 Metastore)
<property>
<name>hive.metastore.uris</name>
<value>thrift://localhost:9083</value>
</property>
改了怎么验证:
hive> set javax.jdo.option.ConnectionURL;
hive> set hive.metastore.uris;
交互体验配置:让命令行更好用
这几个配置不改也能跑,但改了体验好很多。
| 配置 | 作用 | 推荐值 |
|---|---|---|
hive.cli.print.header |
查询结果显示列名 | true |
hive.cli.print.current.db |
提示符显示当前数据库 | true |
hive.resultset.use.unique.column.names |
多表 Join 列名带表别名 | false(简化) |
配置示例:
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
效果对比:
-- 没配:只有数据,不知道哪列是哪列
> select id, name from users;
1 张三
2 李四
-- 配了:有表头,一目了然
> select id, name from users;
id name
1 张三
2 李四
常用调优项:换个引擎跑得快
1. 执行引擎
| 引擎 | 特点 | 推荐场景 |
|---|---|---|
mr(MapReduce) |
慢,稳定 | 默认,可以换掉 |
tez |
快,用 DAG 替代 MR 链 | 中等集群,推荐 |
spark |
最快,内存计算 | 有 Spark 集群 |
<property>
<name>hive.execution.engine</name>
<value>tez</value>
</property>
改了怎么验证:
hive> set hive.execution.engine;
-- 输出:tez
2. 动态分区
数据导入时,按日期/地区自动创建分区。
<property>
<name>hive.exec.dynamic.partition</name>
<value>true</value>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
场景化配置:按业务需求调
场景1:小表 Join 大表 → 开 MapJoin
<property>
<name>hive.auto.convert.join</name>
<value>true</value>
</property>
<property>
<name>hive.mapjoin.smalltable.filesize</name>
<value>25000000</value> <!-- 25MB,小于这个的自动走 MapJoin -->
</property>
场景2:多个任务独立 → 开并行执行
<property>
<name>hive.exec.parallel</name>
<value>true</value>
</property>
<property>
<name>hive.exec.parallel.thread.number</name>
<value>8</value>
</property>
场景3:查询慢 → 调内存
<property>
<name>hive.executor.memory</name>
<value>2048</value> <!-- MB -->
</property>
HiveServer2 相关配置
如果要通过 JDBC 远程连 Hive:
<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 才生效。