在本地机器上
本页面介绍如何在单台机器上运行 HivePlus。HivePlus 的所有组件(如 Metastore、HiveServer2、MR3 DAGAppMaster 和 MR3 ContainerWorkers)将在同一台机器上运行。通过遵循以下说明,用户将学习:
- 如何在单台机器上安装和配置 HivePlus
- 如何启动和停止带有 Derby 数据库的 Metastore
- 如何启动和停止 HiveServer2
- 如何创建 Beeline 连接并向 HiveServer2 发送查询
- LocalThread 模式和 LocalProcess 模式的区别
安装 HivePlus 后,进入 hadoop 目录。
cd hadoop/
概述
运行 HivePlus 涉及以下步骤。
- 用户更新
env.sh以设置其他环境变量。 - 用户在配置目录中更新
hive-site.xml、mr3-site.xml和tez-site.xml。 - 用户执行
hive/metastore-service.sh和hive/hiveserver2-service.sh来启动 Metastore 和 HiveServer2。
通常,更新 env.sh 和 hive-site.xml 就足以开始使用,因为 mr3-site.xml 和 tez-site.xml 中的默认值在常见设置中效果良好。
MR3 release 在目录 conf/local 和 conf/tpcds 中包含两组预置配置文件。这些配置目录用于以下场景:
conf/local:在本地模式下运行 HivePlus,其中每个组件在一台机器上运行conf/tpcds:在 Hadoop 集群中运行 HivePlus
MR3 release 中的每个脚本接受以下选项之一来选择相应的配置目录。
--local 使用 conf/local/ 中的配置运行作业(默认)
--tpcds 使用 conf/tpcds/ 中的配置运行作业
要在本地机器上运行 HivePlus,我们使用 --local 选项。
配置 env.sh
env.sh 是一个自我描述的脚本,包含在每个环境中应该设置的主要环境变量。
- 必要时设置
JAVA_HOME和PATH。 - 将
MR3_JAVA_HOME设置为 Java 的通用安装目录。
vi env.sh
export JAVA_HOME=/usr/lib/java17/
export PATH=$JAVA_HOME/bin:$PATH
MR3_JAVA_HOME=/usr/lib/java17/
设置以下环境变量以调整分配给每个组件的内存大小(以 MB 为单位):
HIVE_METASTORE_HEAPSIZE指定 Metastore 的内存大小。HIVE_SERVER2_HEAPSIZE指定 HiveServer2 的内存大小。HIVE_CLIENT_HEAPSIZE指定 Beeline 的内存大小。MR3_AM_HEAPSIZE指定 MR3 DAGAppMaster 的内存大小。
由于 MR3 DAGAppMaster 将作为线程在 HiveServer2 内运行,MR3_AM_HEAPSIZE 应该严格小于 HIVE_SERVER2_HEAPSIZE。在我们的示例中,我们使用以下值。
vi env.sh
HIVE_METASTORE_HEAPSIZE=4096
HIVE_SERVER2_HEAPSIZE=16384
HIVE_CLIENT_HEAPSIZE=1024
MR3_AM_HEAPSIZE=10240
设置 HIVE_SCRATCH_DIR 和 HIVE_BASE_OUT_DIR 为本地文件系统上的临时工作目录。在我们的示例中,我们使用通用目录 /tmp/gla(因为当前用户是 gla)。
vi env.sh
HIVE_SCRATCH_DIR=/tmp/gla
HIVE_BASE_OUT_DIR=/tmp/gla
创建临时目录
创建由 HIVE_SCRATCH_DIR 指定的目录,并将其权限设置为 733。
ls /tmp/gla
ls: cannot access /tmp/gla: No such file or directory
mkdir -p /tmp/gla
chmod 733 /tmp/gla
创建 HIVE_BASE_OUT_DIR 的子目录 operation_logs。
ls /tmp/gla/operation_logs
ls: cannot access /tmp/gla/operation_logs: No such file or directory
mkdir -p /tmp/gla/operation_logs
配置 HivePlus
打开 conf/local/hive-site.xml,根据当前用户名设置以下配置键(而不是默认用户 hive)。
vi conf/local/hive-site.xml
<property>
<name>hive.users.in.admin.role</name>
<value>gla</value>
</property>
配置资源
打开 conf/local/mr3-site.xml,设置配置键 mr3.am.local.resourcescheduler.max.memory.mb 和 mr3.am.local.resourcescheduler.max.cpu.cores,这两个键决定了分配给所有 ContainerWorker 的内存大小(以 MB 为单位)和核心数。由于所有 ContainerWorker 都将在 MR3 DAGAppMaster 内运行,mr3.am.local.resourcescheduler.max.memory.mb 应该严格小于 env.sh 中的 MR3_AM_HEAPSIZE。另一方面,mr3.am.local.resourcescheduler.max.cpu.cores 指定虚拟资源,可以设置为任何值。
vi conf/local/mr3-site.xml
<property>
<name>mr3.am.local.resourcescheduler.max.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mr3.am.local.resourcescheduler.max.cpu.cores</name>
<value>4</value>
</property>
在 hive-site.xml 中,以下配置键指定分配给 Map Task、Reduce Task 或 ContainerWorker 的资源。在我们的示例中,我们为 Map Task、Reduce Task 和 ContainerWorker 分配 2GB 和单个核心。
vi conf/local/hive-site.xml
<property>
<name>hive.mr3.map.task.memory.mb</name>
<value>2048</value>
</property>
<property>
<name>hive.mr3.map.task.vcores</name>
<value>1</value>
</property>
<property>
<name>hive.mr3.reduce.task.memory.mb</name>
<value>2048</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>2048</value>
</property>
<property>
<name>hive.mr3.all-in-one.containergroup.vcores</name>
<value>1</value>
</property>
更新这些配置键时,应满足以下要求:
hive.mr3.map.task.memory.mb≤hive.mr3.all-in-one.containergroup.memory.mbhive.mr3.map.task.vcores≤hive.mr3.all-in-one.containergroup.vcoreshive.mr3.reduce.task.memory.mb≤hive.mr3.all-in-one.containergroup.memory.mbhive.mr3.reduce.task.vcores≤hive.mr3.all-in-one.containergroup.vcoreshive.mr3.all-in-one.containergroup.memory.mb≤mr3.am.local.resourcescheduler.max.memory.mbhive.mr3.all-in-one.containergroup.vcores≤mr3.am.local.resourcescheduler.max.cpu.cores
检查端口
Metastore 和 HiveServer2 使用由环境变量 HIVE_METASTORE_PORT_LOCAL 和 HIVE_SERVER2_PORT 指定的端口。确保这些端口未被占用。
vi env.sh
HIVE_METASTORE_LOCAL_PORT=9841
HIVE_SERVER2_PORT=9842
运行 Metastore
使用 --local 选项运行带有 Derby 数据库的 Metastore,并使用 --init-schema 选项初始化数据库模式。
hive/metastore-service.sh start --local --init-schema
# 使用 Hive-MR3 运行 Metastore
#输出目录:/data1/gla/mr3/hadoop/hive/metastore-service-result/hive-2025-03-11-17-25-09-dced2eaf
正在启动 Metastore...
过一会儿,检查 Metastore 是否成功启动。
more /data1/gla/mr3/hadoop/hive/metastore-service-result/hive-2025-03-11-17-25-09-dced2eaf/out-metastore.txt
...Metastore 连接 Driver : org.apache.derby.jdbc.EmbeddedDriver
Metastore 连接 User: APP
正在启动 metastore 模式初始化到 4.0.0
初始化脚本 hive-schema-4.0.0.derby.sql...
初始化脚本完成...
用户首次运行 Metastore 时应使用 --init-schema 初始化数据库模式。没有 --init-schema,脚本会失败并显示以下错误消息。
MetaException(message:Version information not found in metastore.)
重启 Metastore 时,不要使用 --init-schema 选项,以便重用现有的 Hive 数据库。例如,用户可以终止 Metastore 并重新启动它,如下所示。
hive/metastore-service.sh stop --local
hive/metastore-service.sh start --local
运行 HiveServer2
使用 --local 选项运行 HiveServer2。
hive/hiveserver2-service.sh start --local
# 使用 Hive-MR3 运行 HiveServer2
#输出目录:/data1/gla/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-11-17-29-15-6a3cdf01
正在启动 HiveServer2...
过一会儿,检查 HiveServer2 是否成功启动。
grep "New MR3Session created" /data1/gla/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-11-17-29-15-6a3cdf01/hive-logs/hive.log
2025-03-11T17:29:34,010 INFO [main] session.MR3SessionManagerImpl: New MR3Session created: b303c7d9-b02f-4199-b54a-a0872bf032b0, gla
运行 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
输出目录:/data1/gla/mr3/hadoop/hive/run-beeline-result/hive-2025-03-11-17-32-44-ed402242
# 使用 Hive-MR3 (4.0.0) 运行 Beeline
...
正在连接到 jdbc:hive2://gold7:9842/;;ssl=false
已连接到:Apache Hive(版本 4.0.0)
Driver:Hive JDBC(版本 4.0.0)
事务隔离级别:TRANSACTION_REPEATABLE_READ
Beeline 版本 4.0.0 by Apache Hive
0: jdbc:hive2://gold7:9842/>
使用默认数据库。
0: jdbc:hive2://gold7:9842/> show databases;
...
+----------------+
| database_name |
+----------------+
| default |
+----------------+
1 row selected (1.544 seconds)
0: jdbc:hive2://gold7:9842/> use default;
...
No rows affected (0.035 seconds)
创建一个名为 pokemon 的表。
0: jdbc:hive2://gold7: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");
...
No rows affected (1.126 seconds)
导入示例数据集。
0: jdbc:hive2://gold7:9842/> load data local inpath './pokemon.csv' INTO table pokemon;
...
No rows affected (0.59 seconds)
执行查询。
0: jdbc:hive2://gold7:9842/> select avg(HP) from pokemon;
...
+---------------------+
| _c0 |
+---------------------+
| 144.84882280049567 |
+---------------------+
1 row selected (3.704 seconds)
0: jdbc:hive2://gold7:9842/> create table pokemon1 as select *, IF(HP>160.0,'strong',IF(HP>140.0,'moderate','weak')) AS power_rate from pokemon;
...
807 rows affected (1.095 seconds)
0: jdbc:hive2://gold7:9842/> select COUNT(name), power_rate from pokemon1 group by power_rate;
...
+------+-------------+
| _c0 | power_rate |
+------+-------------+
| 363 | strong |
| 336 | weak |
| 108 | moderate |
+------+-------------+
3 rows selected (0.568 seconds)
退出 Beeline。用户可以在 hive/hive-local-data/ 下找到 Metastore 目录和仓库目录。
ls hive/hive-local-data/metastore5 warehouse
ls hive/hive-local-data/warehouse/pokemon pokemon1
停止 HiveServer2
停止 HiveServer2。
hive/hiveserver2-service.sh stop --local
通过停止 HiveServer2,我们也会自动停止 MR3 DAGAppMaster,因为它作为线程在 HiveServer2 内运行,即 LocalThread 模式。但需要注意的是,Metastore 仍在运行。
使用 LocalProcess 模式运行 MR3 DAGAppMaster
在 LocalProcess 模式下,MR3 DAGAppMaster 作为独立进程运行,而不是作为线程在 HiveServer2 内运行。因此 HiveServer2 不需要额外资源来容纳 MR3 DAGAppMaster。打开 env.sh 并调整 HiveServer2 的内存大小。
vi env.sh
HIVE_SERVER2_HEAPSIZE=8192
打开 conf/local/mr3-site.xml,将配置键 mr3.master.mode 设置为 local-process。
vi conf/local/mr3-site.xml
<property>
<name>mr3.master.mode</name>
<value>local-process</value>
</property>
要使用 MR3-UI,请参阅操作指南中的用户界面。
使用 --amprocess 选项运行 HiveServer2。
hive/hiveserver2-service.sh start --local --amprocess
# 使用 Hive-MR3 运行 HiveServer2
#输出目录:/data1/gla/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-11-17-35-58-c2285f92
正在启动 HiveServer2...
过一会儿,用户可以找到 MR3 DAGAppMaster 的日志文件。
ls /data1/gla/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-11-17-35-58-c2285f92/*/run.log
/data1/gla/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-11-17-35-58-c2285f92/application_187651741682175204_0001/run.log
用户还可以找到 MR3 DAGAppMaster 的进程。
ps -ef | grep DAGAppMaster | grep mr3
gla 19036 18765 49 17:36 pts/0 00:00:08 ... com.datamonad.mr3.master.DAGAppMaster --session
运行 Beeline 并向 HiveServer2 发送查询。
hive/run-beeline.sh
停止 HiveServer2。
hive/hiveserver2-service.sh stop --local
过一会儿,MR3 DAGAppMaster 的进程也会停止。
ps -ef | grep DAGAppMaster | grep mr3
停止 Metastore
停止 Metastore。
hive/metastore-service.sh stop --local