跳到主要内容

独立模式

基础

独立模式下的 MR3 允许 HivePlus 无需 Hadoop 或 Kubernetes 等资源管理器即可运行。用户几乎可以在任何类型的集群上安装 HivePlus,而不依赖于 Hadoop 或 Kubernetes 的可用性。但是,仍然需要托管 HDFS 或 S3 的存储集群。

独立模式的主要优点是操作 HivePlus 简单。要在独立模式下运行 HivePlus,只需下载 MR3 release,通过更新几个配置文件来配置 HivePlus,然后将更新后的 MR3 release 复制到每个工作节点。因此,运行 HivePlus 类似于以独立模式运行 Trino/Presto/Spark。

由于独立模式下的 HivePlus 不使用资源管理器,因此不直接支持高可用性、DAGAppMaster 恢复和自动扩缩容等关键功能。这是使用独立模式的代价,用户负责启动和终止每个组件。

本页面介绍如何在独立模式下运行 HivePlus。Metastore、HiveServer2 和 MR3 DAGAppMaster 将在主节点上运行,而 MR3 ContainerWorkers 将在工作节点上运行。对于 Metastore 数据库,我们可以使用 Hive 自带的 Derby 数据库或 MySQL 服务器。通过遵循以下说明,用户将学习:

  1. 如何在独立模式下配置 HivePlus
  2. 如何启动和停止 Metastore
  3. 如何启动和停止 HiveServer2
  4. 如何创建 Beeline 连接并向 HiveServer2 发送查询
提示

我强烈建议用户在独立模式下运行 HivePlus 之前先尝试本地机器上的 HivePlus

先决条件

在独立模式下运行 HivePlus 有以下先决条件:

  • Java 应该在每个节点上的相同目录中安装。在我们的示例中,Java 安装在目录 /home/hive/jdk17 中。
  • 用户可以访问 HDFS 和 S3 等分布式存储。

要使用 MySQL 作为 Metastore 数据库,用户应该可以访问具有所有权限的 MySQL 服务器。

信息

使用 PostgreSQL 或 MS SQL 作为 Metastore 数据库与使用 MySQL 类似。

设置集群

HivePlus 由以下组件组成:Metastore、HiveServer2、MR3 DAGAppMaster 和 MR3 ContainerWorkers。在我们的示例中,我们使用 5 个节点的集群。orange1 是主节点,Metastore、HiveServer2 和 MR3 DAGAppMaster 将在此运行;orange2orange5 是工作节点,MR3 ContainerWorkers 将在此运行。

vi /etc/hosts
192.168.10.1 orange1 # 主节点
192.168.10.2 orange2 # 工作节点
192.168.10.3 orange3 # 工作节点
192.168.10.4 orange4 # 工作节点
192.168.10.5 orange5 # 工作节点

HivePlus 需要三种类型的存储:

  • 数据源,如 HDFS 和 S3
  • 用于存储临时数据的分布式存储,如 HDFS、S3 和 NFS
  • 用于存储中间数据的工作节点上的本地目录

在我们的示例中,我们使用 S3 作为数据源和用于存储临时数据的分布式存储。对于数据源,我们使用 S3 桶 s3a://hivemr3/warehouse。对于存储临时数据,我们使用 S3 桶 s3a://hivemr3/scratch

我们要求每个工作节点上有一组相同的本地目录来存储中间数据。在我们的示例中,工作节点使用单个本地目录 /data1/k8s

在工作节点上安装

在主节点上安装 HivePlus 后,将整个目录复制到每个工作节点。在我们的示例中,我们以用户 hive 运行 HivePlus,并且已设置到工作节点的无密码连接。以下命令假设当前工作目录是 mr3

pwd
/home/hive/mr3
for i in {2..5}; do ssh hive@orange$i "mkdir -p /home/hive/mr3"; rsync -av --links . hive@orange$i:/home/hive/mr3; done

现在进入 standalone 目录。

cd standalone/

概述

运行 HivePlus 涉及以下步骤。

  • 用户更新 env.sh 以设置其他环境变量。
  • 用户在配置目录 conf 中更新 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 中的默认值在常见设置中效果良好。

信息

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

配置 env.sh

第一步是在 env.sh 中设置环境变量。env.sh 不仅被 HiveServer2(运行在主节点上)读取,也被 ContainerWorkers(运行在工作节点上)读取。

打开 env.sh,必要时设置 JAVA_HOMEPATH。将 JAVA_HOME 设置为 Java 的安装目录。

vi env.sh
export JAVA_HOME=/home/hive/jdk17/
export PATH=$JAVA_HOME/bin:$PATH

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

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

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

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

HIVE_WAREHOUSE_DIR 设置为存储仓库的 S3 桶(或 HDFS 目录)。需要注意的是,要使用 S3,我们应该使用前缀 s3a,而不是 s3

vi env.sh
HIVE_WAREHOUSE_DIR=s3a://hivemr3/warehouse

HIVE_SCRATCH_DIR 设置为在 S3 上(或 HDFS 上)存储临时数据的临时工作目录。将 HIVE_BASE_OUT_DIR 设置为在本地文件系统上的临时工作目录。

vi env.sh
HIVE_SCRATCH_DIR=s3a://hivemr3/scratch
HIVE_BASE_OUT_DIR=/tmp/hive

如果 NFS 卷以相同目录安装在每个节点上,HIVE_SCRATCH_DIR 可以设置为挂载点(例如 /home/nfs/hivemr3)。在这种情况下,请确保其权限设置为 733。如果不存在,HiveServer2 会自动创建一个权限为 733 的新目录。

创建临时目录

在本地文件系统上的 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

配置 HivePlus

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

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

为 ContainerWorkers 配置 env.sh

env.sh 中的以下环境变量(稍后将复制到工作节点)被 ContainerWorkers 读取。

vi env.sh
export PROCESS_CONTAINER_WORKER_SECRET=worker-secret
export PROCESS_CONTAINER_WORKER_SERVER_HOST=192.168.10.1
export PROCESS_CONTAINER_WORKER_MEMORY_MB=32768
export PROCESS_CONTAINER_WORKER_CPU_CORES=8
export PROCESS_CONTAINER_WORKER_MEMORY_XMX=26214
export PROCESS_CONTAINER_WORKER_LOCAL_DIRS=/data1/k8s
  • PROCESS_CONTAINER_WORKER_SECRET 指定一个字符串,用作与 DAGAppMaster 通信的密钥。
  • PROCESS_CONTAINER_WORKER_SERVER_HOST 指定 DAGAppMaster 的 IP 地址。在我们的示例中,它被设置为主节点 orange1 的 IP 地址。
  • PROCESS_CONTAINER_WORKER_MEMORY_MB 指定每个 ContainerWorker 假定的内存大小(以 MB 为单位)。也就是说,ContainerWorker 假定它可以使用多达 PROCESS_CONTAINER_WORKER_MEMORY_MB 指定的内存。
  • PROCESS_CONTAINER_WORKER_CPU_CORES 指定每个 ContainerWorker 假定的核心数。也就是说,ContainerWorker 假定它可以使用多达 PROCESS_CONTAINER_WORKER_CPU_CORES 指定的核心数。
  • PROCESS_CONTAINER_WORKER_MEMORY_XMX 指定 Java -Xmx 选项的参数。也就是说,它指定分配给每个 ContainerWorker 的堆内存大小。用户应将 PROCESS_CONTAINER_WORKER_MEMORY_XMX 设置为 PROCESS_CONTAINER_WORKER_MEMORY_MB 的一部分(例如 0.8)。在我们的示例中,每个 ContainerWorker 以 Java 选项 -Xmx26214 启动。
  • PROCESS_CONTAINER_WORKER_LOCAL_DIRS 应设置为一个(逗号分隔的)本地目录列表,用于存储 ContainerWorkers 的中间数据。

配置资源

conf/hive-site.xml 中,以下配置键指定分配给 Map Task、Reduce Task 或 ContainerWorker 的资源。在我们的示例中,我们为 Map Task 和 Reduce Task 分配 4GB 和单个核心。特别是,配置键 hive.mr3.all-in-one.containergroup.memory.mbhive.mr3.all-in-one.containergroup.vcores 应该分别与 env.sh 中的 PROCESS_CONTAINER_WORKER_MEMORY_MBPROCESS_CONTAINER_WORKER_CPU_CORES 相匹配。

vi conf/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>32768</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.vcores</name>
<value>8</value>
</property>

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

  • hive.mr3.map.task.memory.mbPROCESS_CONTAINER_WORKER_MEMORY_MB
  • hive.mr3.map.task.vcoresPROCESS_CONTAINER_WORKER_CPU_CORES
  • hive.mr3.reduce.task.memory.mbPROCESS_CONTAINER_WORKER_MEMORY_MB
  • hive.mr3.reduce.task.vcoresPROCESS_CONTAINER_WORKER_CPU_CORES

检查端口

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

vi env.sh
HIVE_METASTORE_PORT=9840
HIVE_SERVER2_PORT=9842

配置 Metastore

HivePlus 可以使用任何兼容版本的 Metastore,不一定是 MR3 release 中包含的版本。在我们的示例中,我们使用 Derby 或 MySQL 作为数据库来启动一个新的 Metastore 实例。

信息

使用 PostgreSQL 或 MS SQL 作为 Metastore 数据库与使用 MySQL 类似。

选项 1 - 使用 Derby

要使用 Derby 作为 Metastore 数据库,打开 env.sh 并将 HIVE_METASTORE_DB_TYPE 设置为 derby

vi env.sh
HIVE_METASTORE_DB_TYPE=derby

打开 conf/hive-site.xml 并更新以下配置键。删除配置键 javax.jdo.option.ConnectionDriverNamejavax.jdo.option.ConnectionUserName

vi conf/hive-site.xml
<property>
<name>hive.metastore.db.type</name>
<value>DERBY</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=${hive.local.data}/metastore_cluster/${hive.database.name};create=true</value>
</property>
<!--<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hivemr3</value>
</property> -->

选项 2 - 使用 MySQL

要使用 MySQL 作为 Metastore 数据库,我们假设 MySQL 用户 root 可以访问具有所有权限的 MySQL 服务器。MySQL 服务器可以在任何节点上运行,不一定是在 Metastore 或 HiveServer2 将运行的节点上。

mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 560632
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> SHOW GRANTS FOR 'root'@'%';
+--------------------------------------------------------------------------------------------------------------------------------+| Grants for root@% |
+--------------------------------------------------------------------------------------------------------------------------------+| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)

打开 env.sh 并设置以下环境变量。

vi env.sh
HIVE_METASTORE_DB_TYPE=mysql
HIVE_DATABASE_HOST=$HOSTNAME
HIVE_DATABASE_NAME=hivemr3
  • HIVE_METASTORE_DB_TYPE 应设置为 mysql
  • HIVE_DATABASE_HOST 指定运行 MySQL 服务器的节点。
  • HIVE_DATABASE_NAME 指定在 MySQL 中为 Metastore 创建的新数据库的名称。在我们的示例中,我们使用 hivemr3

打开 conf/hive-site.xml,将 javax.jdo.option.ConnectionUserName 设置为 MySQL 用户名,将 javax.jdo.option.ConnectionPassword 设置为密码。

vi conf/hive-site.xml
<property>
<name>hive.metastore.db.type</name>
<value>MYSQL</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://${hive.database.host}/${hive.database.name}?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>password</value>
</property>
信息

对于其他类型的 Metastore 数据库,env.sh 中的 HIVE_METASTORE_DB_TYPE 应设置为 postgresqlmssql。还应更新 conf/tpcds/hive-site.xml 中的配置键 javax.jdo.option.ConnectionURLjavax.jdo.option.ConnectionDriverName

配置 S3(可选)

要访问 S3 存储,应在 conf/core-site.xml 中设置其他配置键。打开 conf/core-site.xml 并设置 S3 的配置键。配置键 fs.s3a.endpoint 应设置为指向存储服务器。

vi conf/core-site.xml
<property>
<name>fs.s3a.aws.credentials.provider</name>
<value>com.amazonaws.auth.EnvironmentVariableCredentialsProvider</value>
</property>
<property>
<name>fs.s3a.endpoint</name>
<value>http://192.168.10.100:9000</value>
</property>
<property>
<name>fs.s3a.path.style.access</name>
<value>true</value>
</property>

用户可能需要更改访问 S3 的参数以避免 SdkClientException: Unable to execute HTTP request: Timeout waiting for connection from pool。有关更多详细信息,请参阅故障排除

当使用类 EnvironmentVariableCredentialsProvider 读取 AWS 凭证时,env.sh 中的两个环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 应分别设置为访问 ID 和密码。

vi env.sh
export AWS_ACCESS_KEY_ID=_your_aws_access_key_id_
export AWS_SECRET_ACCESS_KEY=_your_aws_secret_secret_key_

在 Metastore 中配置安全

为简单起见,我们在 Metastore 端禁用安全。

vi conf/hive-site.xml
<property>
<name>hive.metastore.pre.event.listeners</name>
<value></value>
</property>

配置 HiveServer2

检查身份验证和授权的配置。

vi conf/hive-site.xml
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory</value>
</property>

env.sh 分发到工作节点

由于 ContainerWorkers 也会读取它,请将 env.sh 复制到每个工作节点上的相同目录。

for i in {2..5}; do scp env.sh hive@orange$i:/home/hive/mr3/standalone; done

我们不需要将 conf 目录中的配置文件复制到工作节点,因为它们直接从 MR3 DAGAppMaster 传递。

运行 Metastore

运行 Metastore 并使用 --init-schema 选项初始化数据库模式。当使用 MySQL 作为 Metastore 数据库时,脚本会自动从 https://cdn.mysql.com/Downloads/Connector-J/mysql-connector-java-8.0.28.tar.gz 下载 MySQL 连接器。

hive/metastore-service.sh start --init-schema
正在下载 MySQL 连接器:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.28.tar.gz
...
# 运行 Metastore
#输出目录:/home/hive/mr3/standalone/hive/run-result/metastore/hivemr3-2025-03-15-01-51-52-26ca41a2
正在启动 Metastore...

过一会儿,检查 Metastore 是否成功启动。

tail -f /home/hive/mr3/standalone/hive/run-result/metastore/hivemr3-2025-03-15-01-51-52-26ca41a2/out-metastore.txt
...
正在启动 metastore 模式初始化到 4.0.0
初始化脚本 hive-schema-4.0.0.mysql.sql...
初始化脚本完成...
2025-03-15 01:52:10: 正在启动 Hive Metastore Server

用户首次运行 Metastore 时应使用 --init-schema 初始化数据库模式。没有 --init-schema,脚本会失败并显示以下错误消息。

MetaException(message:Version information not found in metastore.)

重启 Metastore 时,不要使用 --init-schema 选项,以便重用现有的 Hive 数据库。

Metastore 的日志文件位于 Metastore 的输出目录下。

ls /home/hive/mr3/standalone/hive/run-result/metastore/hivemr3-2025-03-15-01-51-52-26ca41a2/hive-logs/hive.log

运行 HiveServer2

信息

要使用 MR3-UI,请参阅操作指南中的用户界面

Metastore 启动后,运行 HiveServer2。要使用 MR3 DAGAppMaster 的 LocalProcess 模式,请使用 --localprocess 选项。

hive/hiveserver2-service.sh start --localprocess
# 运行 HiveServer2
#输出目录:/home/hive/mr3/standalone/hive/run-result/hiveserver2/hivemr3-2025-03-15-01-55-23-f39f05da
正在启动 HiveServer2...

在 LocalProcess 模式下,MR3 DAGAppMaster 作为常规进程在与 HiveServer2 相同的机器上运行,而不是作为 HiveServer2 内的线程或 Yarn 容器运行。

过一会儿,通过检查其日志文件来检查 HiveServer2 是否成功启动。

grep -e "New MR3Session created" /home/hive/mr3/standalone/hive/run-result/hiveserver2/hivemr3-2025-03-15-01-55-23-f39f05da/hive-logs/hive.log
2025-03-15T01:55:39,669 INFO [main] session.MR3SessionManagerImpl: New MR3Session created: a18401a6-4477-4497-ab2c-641d1793b57a, hive

由于我们对 MR3 DAGAppMaster 使用 LocalProcess 模式,其日志文件位于 hive/run-result/hiveserver2/am-local-log-dir 目录下。

过一会儿,DAGAppMaster 进程被创建,用户可以找到其日志。

ls /home/hive/mr3/standalone/hive/run-result/hiveserver2/am-local-log-dir/application_267311741971334594_0001/run.log
/home/hive/mr3/standalone/hive/run-result/hiveserver2/am-local-log-dir/application_267311741971334594_0001/run.log

运行 ContainerWorkers

在独立模式下,用户应该手动执行 ContainerWorkers。例如,用户可以创建一个执行 ContainerWorkers 的脚本。

vi run.sh
#!/bin/bash
for i in {2..5}; do
ssh orange$i "cd /home/hive/mr3/standalone/hive/; ./run-worker.sh;" &
done

ContainerWorkers 不会立即在 DAGAppMaster 中注册,如 DAGAppMaster 的日志所示:

tail -f /home/hive/mr3/standalone/hive/run-result/hiveserver2/am-local-log-dir/application_267311741971334594_0001/run.log
...
2025-03-15 02:02:43,647 [IPC Server handler 0 on default port 19666] INFO ProcessCommunicatorServerClient$ [] - tryRegisterProcess(): 47c19154-c703-4a80-859f-72ba6f7e886e, 192.168.10.2, 32768MB, 8 cores

相反,DAGAppMaster 在第一个查询提交后才注册 ContainerWorkers。

运行 Beeline

用户可以使用任何客户端程序(不一定是 MR3 release 中包含的 Beeline)连接到 HiveServer2。在我们的示例中,我们运行 MR3 release 中包含的 Beeline。

下载示例数据集。

wget https://github.com/mr3project/mr3/releases/download/v2.0/pokemon.csv

运行 Beeline。

hive/run-beeline.sh
输出目录:/home/hive/mr3/standalone/hive/run-result/beeline/hivemr3-2025-03-15-02-06-08-40e4d680
# 使用 Hive-MR3 运行 Beeline
...
正在连接到 jdbc:hive2://orange1:9842/;;;
已连接到:Apache Hive(版本 4.0.0)
Driver:Hive JDBC(版本 4.0.0)
事务隔离级别:TRANSACTION_REPEATABLE_READ
Beeline 版本 4.0.0 by Apache Hive
0: jdbc:hive2://orange1:9842/>

使用默认数据库。

0: jdbc:hive2://orange1:9842/> use default;

创建一个名为 pokemon 的表。

0: jdbc:hive2://orange1:9842/> CREATE TABLE pokemon (Number Int,Name String,Type1 String,Type2 String,Total Int,HP Int,Attack Int,Defense Int,Sp_Atk Int,Sp_Def Int,Speed Int) row format delimited fields terminated BY ',' lines terminated BY '\n' tblproperties("skip.header.line.count"="1");

导入示例数据集。

0: jdbc:hive2://orange1:9842/> load data local inpath './pokemon.csv' INTO table pokemon;

执行查询。

0: jdbc:hive2://orange1:9842/> select avg(HP) from pokemon;
0: jdbc:hive2://orange1:9842/> create table pokemon1 as select *, IF(HP>160.0,'strong',IF(HP>140.0,'moderate','weak')) AS power_rate from pokemon;
0: jdbc:hive2://orange1:9842/> select COUNT(name), power_rate from pokemon1 group by power_rate;
信息

由于我们在小型数据集上执行查询,某些 ContainerWorkers 可能不会立即在 DAGAppMaster 中注册。

停止 HivePlus

在独立模式下,用户负责启动和终止 Metastore、HiveServer、DAGAppMaster 和 ContainerWorkers。因此,请使用 kill 命令手动终止所有进程。