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 才生效。