Hive与Yarn集群
2025年3月6日在 Hadoop 集群环境下,如果 Hive 使用的是 MapReduce (MR) 引擎,它仍然需要 YARN,因为 Hadoop 的 MapReduce v2 是基于 YARN 的资源管理和任务调度框架。
即使是使用 hive.execution.engine=mr
,Hive 的查询任务会提交为一个 MapReduce 作业,而这个 MapReduce 作业需要由 YARN 来管理。因此,在集群环境中,YARN 是必需的。
1. 为什么在集群中 Hive 的 MR 引擎需要 YARN?
- 在 Hadoop 2.x 及之后,MapReduce 被重构为 MapReduce v2,它的运行完全依赖于 YARN。
- YARN 是 Hadoop 的资源管理和任务调度核心,所有的 MapReduce 作业都需要通过 YARN 调度资源(即 ResourceManager 和 NodeManager)。
- 当 Hive 使用 MR 引擎时,它的查询会被编译成一个或多个 MapReduce 作业,交由 YARN 执行。
- 因此:
- 单节点环境下(伪分布式模式):Hive 的 MR 引擎可以不依赖 YARN,直接运行在本地 MapReduce 模式下。
- 集群环境下(分布式模式):Hive 必须依赖 YARN 来调度和执行 MapReduce 作业。
2. Hive 使用 MR 引擎时的任务执行流程
以下是 Hive 使用 MR 引擎(hive.execution.engine=mr
)在集群中的执行过程:
- Hive 查询编译:
- Hive 将 SQL 查询(如 SELECT 或 JOIN)转换为 MapReduce 作业或者 DAG。
- 每个作业会被打包成 Hadoop 的 MapReduce 作业。
- 提交到 YARN:
- Hive 会通过
JobTracker
(实际上是由 YARN 的 ResourceManager 实现)将作业提交到 YARN。 - YARN 的 ResourceManager 负责为作业分配资源,并将任务分发到各个 NodeManager。
- Hive 会通过
- 任务执行:
- 每个 NodeManager 启动相应的容器(Container)来执行 Map 或 Reduce 任务。
- 任务完成后,结果返回 Hive。
- 结果输出:
- Hive 将最终结果存储到 HDFS 或本地文件系统,供用户查询。
3. 集群环境下 Hive 的必要配置
在分布式环境下,Hive 使用 MR 引擎时需要以下配置:
3.1 配置 yarn-site.xml
Hive 的 MR 引擎依赖 YARN,因此需要正确配置 Hadoop 集群的 yarn-site.xml
,确保 YARN 服务正常运行。
示例配置:
<configuration>
<!-- ResourceManager 主机名 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master-node</value> <!-- 替换为 ResourceManager 节点的主机名 -->
</property>
<!-- ResourceManager 的地址 -->
<property>
<name>yarn.resourcemanager.address</name>
<value>master-node:8032</value>
</property>
<!-- ResourceManager 的调度地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master-node:8030</value>
</property>
<!-- ResourceTracker 的通信地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master-node:8031</value>
</property>
<!-- ResourceManager Web UI -->
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master-node:8088</value>
</property>
<!-- NodeManager 的本地目录 -->
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/data/yarn/local</value>
</property>
<!-- NodeManager 的日志目录 -->
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/data/yarn/log</value>
</property>
</configuration>
3.2 配置 mapred-site.xml
Hive 的 MR 引擎需要 MapReduce 的配置,确保 mapred-site.xml
指向 YARN。
示例配置:
<configuration>
<!-- 指定 MapReduce 使用的框架 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- MapReduce ApplicationMaster 的地址 -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>master-node:10020</value>
</property>
<!-- MapReduce JobHistory 的 Web UI -->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master-node:19888</value>
</property>
</configuration>
3.3 配置 hive-site.xml
确保 Hive 的执行引擎配置为 mr
(默认值),无需修改,但可以检查以下参数:
<configuration>
<!-- Hive 执行引擎 -->
<property>
<name>hive.execution.engine</name>
<value>mr</value>
</property>
<!-- Hive 临时目录 -->
<property>
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<!-- 临时文件存储在 HDFS 上 -->
<property>
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive-local</value>
</property>
</configuration>
4. 如何启动服务
在分布式环境下,以下服务需要启动:
- HDFS 服务:
start-dfs.sh
确保 HDFS 正常运行(包括 NameNode 和 DataNode)。 - YARN 服务:
start-yarn.sh
启动 ResourceManager 和 NodeManager。 - Hive 服务(可选):
如果使用 HiveServer2,则启动 HiveServer2:hive --service hiveserver2 &
- MapReduce History Server(可选):
如果需要查看历史作业记录:mr-jobhistory-daemon.sh start historyserver
5. 验证 Hive 的 MR 引擎是否正常运行
通过 Hive CLI 或 Beeline 提交一个简单的查询,观察是否正常执行。
示例查询:
CREATE TABLE test_table (id INT, name STRING);
INSERT INTO test_table VALUES (1, 'Alice'), (2, 'Bob');
SELECT * FROM test_table;
验证方式:
- 打开 YARN ResourceManager 的 Web UI(默认地址:http://master-node:8088),查看作业是否提交到 YARN 并成功运行。
- 结果输出到 HDFS 或 Hive 的查询结果中。
6. 总结
1. Hive 使用 MR 引擎时,是否需要 YARN?
- 是的,在分布式集群环境下,Hive 使用 MapReduce v2 引擎运行查询任务,而 MapReduce v2 是基于 YARN 的,因此必须启动 YARN 服务。
2. 你需要做什么?
- 配置并启动 YARN 服务(
start-yarn.sh
)。 - 确保 Hive 的
hive.execution.engine
设置为mr
,MapReduce 和 YARN 配置正确。
3. 小规模单机测试时,可以不启动 YARN 吗?
- 可以,如果你运行的是伪分布式模式(或本地模式),Hive 可以直接依赖 Hadoop 的独立 MapReduce 引擎,无需 YARN。