跳到主要内容

在 Hadoop 上

本页面提供在 Hadoop 上设置 HivePlus 的初步步骤。同一个用户(不一定是 Hadoop 集群的管理员)将运行 Metastore 和 HiveServer2。对于 Metastore 数据库,我们使用 Hive 自带的 Derby 数据库或 MySQL 数据库。

提示

我强烈建议用户在运行 Hadoop 上的 HivePlus 之前先尝试本地机器上的 HivePlus

先决条件

在 Hadoop 上运行 HivePlus 有以下先决条件:

  • Hadoop 3 或更高版本可用。
  • Java 的安装目录在每个工作节点上必须相同
  • 用户可以访问 1) 主目录 /user/${USER} 和 2) HDFS 上的 /tmp 目录。在我们的示例中,用户 hive 执行 HivePlus。
  • 要使用 MySQL 作为 Metastore 数据库,用户应该可以访问具有所有权限的 MySQL 服务器。

安装 HivePlus 后,进入 hadoop 目录。

cd hadoop/
警告

Snappy 库应该安装在每个节点上,因为 HivePlus 默认使用 Snappy 压缩中间数据。或者,用户可以在 tez-site.xml 中将配置键 tez.runtime.compress.codec 设置为 DefaultCodec

vi conf/tpcds/tez-site.xml
<property>
<name>tez.runtime.compress.codec</name>
<value>org.apache.hadoop.io.compress.DefaultCodec</value>
</property>

hadoop-env.sh 中配置 Java

要运行 Metastore 和 HiveServer2,位于 Hadoop 配置目录中的 hadoop-env.sh 里的 JAVA_HOME 应该设置为 Java 的安装目录。

vi /etc/hadoop/conf/hadoop-env.sh
export JAVA_HOME=/usr/lib/java17/

这一步骤是必要的,因为 Metastore 和 HiveServer2 在执行 Java 之前会先读取 hadoop-env.sh 中的 JAVA_HOME

概述

运行 HivePlus 涉及以下步骤。

  • 用户更新 env.sh 以设置其他环境变量。
  • 用户在配置目录中更新 hive-site.xmlmr3-site.xmltez-site.xml
  • 用户执行 hive/metastore-service.shhive/hiveserver2-service.sh 来启动 Metastore 和 HiveServer2。
  • HiveServer2 自动创建 MR3 DAGAppMaster,后者又创建 MR3 ContainerWorkers。

通常,更新 env.shhive-site.xml 就足以开始使用,因为 mr3-site.xmltez-site.xml 中的默认值在常见设置中效果良好。

MR3 release 在目录 conf/localconf/tpcds 中包含两组预置配置文件。这些配置目录用于以下场景:

  • conf/local:在本地模式下运行 HivePlus,其中每个组件在一台机器上运行
  • conf/tpcds:在 Hadoop 集群中运行 HivePlus

MR3 release 中的每个脚本接受以下选项之一来选择相应的配置目录。

--local 使用 conf/local/ 中的配置运行作业(默认)
--tpcds 使用 conf/tpcds/ 中的配置运行作业

要在 Hadoop 集群上运行 HivePlus,我们使用 --tpcds 选项。

信息

配置目录 conf/tpcds 是针对规模为 10TB 的 TPC-DS 基准测试对 HivePlus 进行微调的结果。因此,它为生产使用提供了良好的基础。

提示

根据 Hadoop 集群的大小,用户应将命令 ulimit 报告的 nofile(打开的文件)和 nproc(最大用户进程数)设置为足够大。用户可以通过更新文件 /etc/security/limits.conf 或等效文件来更改这些值。

配置 env.sh

env.sh 是一个自我描述的脚本,包含在每个环境中应该设置的主要环境变量。

  • 必要时设置 JAVA_HOMEPATH
  • MR3_JAVA_HOME 设置为 Java 的通用安装目录。
  • HADOOP_HOME 设置为 Hadoop 安装目录。
vi env.sh
export JAVA_HOME=/usr/lib/java17/
export PATH=$JAVA_HOME/bin:$PATH
MR3_JAVA_HOME=/usr/lib/java17/
export HADOOP_HOME=/usr/local/hadoop

设置以下环境变量以调整分配给每个组件的内存大小(以 MB 为单位):

  • HIVE_METASTORE_HEAPSIZE 指定 Metastore 的内存大小。
  • HIVE_SERVER2_HEAPSIZE 指定 HiveServer2 的内存大小。
  • HIVE_CLIENT_HEAPSIZE 指定 Beeline 的内存大小。
  • MR3_AM_HEAPSIZE 指定 MR3 DAGAppMaster 的内存大小。

在我们的示例中,我们使用以下值。

vi env.sh
HIVE_METASTORE_HEAPSIZE=32768
HIVE_SERVER2_HEAPSIZE=32768
HIVE_CLIENT_HEAPSIZE=1024
MR3_AM_HEAPSIZE=32768

HIVE_WAREHOUSE_DIR 指定在 HDFS 上的仓库目录。

vi env.sh
HIVE_WAREHOUSE_DIR=/user/hive/warehouse

使用现有的仓库目录是可以的。如果不存在,则创建一个新的仓库目录。

hdfs dfs -mkdir -p /user/hive/warehouse

HIVE_SCRATCH_DIR 设置为在 HDFS 上的临时工作目录。将 HIVE_BASE_OUT_DIR 设置为在本地文件系统上的临时工作目录。

vi env.sh
HIVE_SCRATCH_DIR=/tmp/hive
HIVE_BASE_OUT_DIR=/tmp/hive

创建临时目录

如果 HIVE_SCRATCH_DIR 指定的目录已在 HDFS 上存在(例如,第二次运行 HivePlus 时),请确保其权限设置为 733。如果不存在,HiveServer2 会自动创建一个权限为 733 的新目录。

hdfs dfs -ls /tmp/ | grep hive
drwx-wx-wx - hive hdfs 0 2025-03-13 14:11 /tmp/hive

在本地文件系统上的 HIVE_BASE_OUT_DIR 下创建子目录 operation_logs

ls /tmp/hive/operation_logs
ls: cannot access /tmp/hive/operation_logs: No such file or directory
mkdir -p /tmp/hive/operation_logs

将 MR3 jar 文件上传到 HDFS

env.sh 中的 HDFS_LIB_DIR 指定了应将 MR3 jar 文件上传到 HDFS 的目录。运行 HivePlus 时,这些 jar 文件被注册为 Hadoop 作业的本地资源,并自动分发到工作节点(运行 NodeManagers 的地方)。

在 HDFS 上创建与 HDFS_LIB_DIR 对应的新目录 /user/${USER}/lib

hdfs dfs -mkdir -p /user/hive/lib

通过执行 mr3/upload-hdfslib-mr3.shtez/upload-hdfslib-tez.sh 将 MR3 jar 文件上传到 HDFS。

mr3/upload-hdfslib-mr3.sh
# 将 MR3 jar 文件上传到 HDFS
#输出(HDFS):/user/hive/lib/mr3
-rw-r--r-- 3 hive hdfs 31966931 2025-03-13 14:16 /user/hive/lib/mr3/mr3-tez-2.0-assembly.jar
tez/upload-hdfslib-tez.sh
# 将 tez-0.9.1.mr3.2.0 jar 文件上传到 HDFS
#输出(HDFS):/user/hive/lib/tez
drwxr-xr-x - hive hdfs 0 2025-03-13 14:16 /user/hive/lib/tez/tar
-rw-r--r-- 3 hive hdfs 370504115 2025-03-13 14:16 /user/hive/lib/tez/tar/tez-0.9.1.mr3.2.0.tar.gz

配置 HivePlus

打开 conf/tpcds/hive-site.xml,根据当前用户名(如果与默认用户 hive 不同)设置以下配置键。

vi conf/tpcds/hive-site.xml
<property>
<name>hive.users.in.admin.role</name>
<value>hive</value>
</property>

配置资源

conf/tpcds/hive-site.xml 中,以下配置键指定分配给 Map Task、Reduce Task 或 ContainerWorker 的资源。在我们的示例中,我们为 Map Task 和 Reduce Task 分配 4GB 和单个核心。单个工作容器(在 MR3 中称为 ContainerWorker)使用 40GB 内存和 10 个核心,因此可以容纳 10 个并发 Task。

vi conf/tpcds/hive-site.xml
<property>
<name>hive.mr3.map.task.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>hive.mr3.map.task.vcores</name>
<value>1</value>
</property>
<property>
<name>hive.mr3.reduce.task.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>hive.mr3.reduce.task.vcores</name>
<value>1</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.memory.mb</name>
<value>40960</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.vcores</name>
<value>10</value>
</property>

更新这些配置键时,应满足以下要求:

  • hive.mr3.map.task.memory.mbhive.mr3.all-in-one.containergroup.memory.mb
  • hive.mr3.map.task.vcoreshive.mr3.all-in-one.containergroup.vcores
  • hive.mr3.reduce.task.memory.mbhive.mr3.all-in-one.containergroup.memory.mb
  • hive.mr3.reduce.task.vcoreshive.mr3.all-in-one.containergroup.vcores

检查端口

Metastore 和 HiveServer2 使用由环境变量 HIVE_METASTORE_PORTHIVE_SERVER2_PORT 指定的端口。确保这些端口未被占用。

vi env.sh
HIVE_METASTORE_PORT=9840
HIVE_SERVER2_PORT=9842
信息

完成上述步骤后,请继续阅读以下指南:

  • 在非安全 Hadoop 上 介绍如何在非安全 Hadoop 集群上运行 HivePlus。
  • 在安全 Hadoop 上 介绍如何使用 MySQL 数据库作为 Metastore 在启用 Kerberos 的安全 Hadoop 集群上运行 HivePlus。