独立模式
基础
独立模式下的 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 服务器。通过遵循以下说明,用户将学习:
- 如何在独立模式下配置 HivePlus
- 如何启动和停止 Metastore
- 如何启动和停止 HiveServer2
- 如何创建 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 将在此运行;orange2 到 orange5 是工作节点,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.xml、mr3-site.xml和tez-site.xml。 - 用户执行
hive/metastore-service.sh和hive/hiveserver2-service.sh来启动 Metastore 和 HiveServer2。 - HiveServer2 自动创建 MR3 DAGAppMaster,但用户应该手动执行 MR3 ContainerWorkers。
通常,更新 env.sh 和 hive-site.xml 就足以开始使用,因为 mr3-site.xml 和 tez-site.xml 中的默认值在常见设置中效果良好。
配置目录 conf 是针对规模为 10TB 的 TPC-DS 基准测试对 HivePlus 进行微调的结果。因此,它为生产使用提供了良好的基础。
配置 env.sh
第一步是在 env.sh 中设置环境变量。env.sh 不仅被 HiveServer2(运行在主节点上)读取,也被 ContainerWorkers(运行在工作节点上)读取。
打开 env.sh,必要时设置 JAVA_HOME 和 PATH。将 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.mb 和 hive.mr3.all-in-one.containergroup.vcores 应该分别与 env.sh 中的 PROCESS_CONTAINER_WORKER_MEMORY_MB 和 PROCESS_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.mb≤PROCESS_CONTAINER_WORKER_MEMORY_MBhive.mr3.map.task.vcores≤PROCESS_CONTAINER_WORKER_CPU_COREShive.mr3.reduce.task.memory.mb≤PROCESS_CONTAINER_WORKER_MEMORY_MBhive.mr3.reduce.task.vcores≤PROCESS_CONTAINER_WORKER_CPU_CORES
检查端口
Metastore 和 HiveServer2 使用由环境变量 HIVE_METASTORE_PORT 和 HIVE_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.ConnectionDriverName 和 javax.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 应设置为 postgresql 或 mssql。还应更新 conf/tpcds/hive-site.xml 中的配置键 javax.jdo.option.ConnectionURL 和 javax.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_ID 和 AWS_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 命令手动终止所有进程。