Hive与Yarn集群

2025年3月6日 作者 unix2go

在 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)在集群中的执行过程:

  1. Hive 查询编译
    • Hive 将 SQL 查询(如 SELECT 或 JOIN)转换为 MapReduce 作业或者 DAG。
    • 每个作业会被打包成 Hadoop 的 MapReduce 作业。
  2. 提交到 YARN
    • Hive 会通过 JobTracker(实际上是由 YARN 的 ResourceManager 实现)将作业提交到 YARN。
    • YARN 的 ResourceManager 负责为作业分配资源,并将任务分发到各个 NodeManager。
  3. 任务执行
    • 每个 NodeManager 启动相应的容器(Container)来执行 Map 或 Reduce 任务。
    • 任务完成后,结果返回 Hive。
  4. 结果输出
    • 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. 如何启动服务

在分布式环境下,以下服务需要启动:

  1. HDFS 服务start-dfs.sh 确保 HDFS 正常运行(包括 NameNode 和 DataNode)。
  2. YARN 服务start-yarn.sh 启动 ResourceManager 和 NodeManager。
  3. Hive 服务(可选)
    如果使用 HiveServer2,则启动 HiveServer2:hive --service hiveserver2 &
  4. 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;

验证方式:

  1. 打开 YARN ResourceManager 的 Web UI(默认地址:http://master-node:8088),查看作业是否提交到 YARN 并成功运行。
  2. 结果输出到 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。