跳到主要内容

在本地机器上

本页面介绍如何在单台机器上运行 HivePlus。HivePlus 的所有组件(如 Metastore、HiveServer2、MR3 DAGAppMaster 和 MR3 ContainerWorkers)将在同一台机器上运行。通过遵循以下说明,用户将学习:

  1. 如何在单台机器上安装和配置 HivePlus
  2. 如何启动和停止带有 Derby 数据库的 Metastore
  3. 如何启动和停止 HiveServer2
  4. 如何创建 Beeline 连接并向 HiveServer2 发送查询
  5. LocalThread 模式和 LocalProcess 模式的区别

安装 HivePlus 后,进入 hadoop 目录。

cd hadoop/

概述

运行 HivePlus 涉及以下步骤。

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

通常,更新 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/ 中的配置运行作业

要在本地机器上运行 HivePlus,我们使用 --local 选项。

配置 env.sh

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

  • 必要时设置 JAVA_HOMEPATH
  • 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_DIRHIVE_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.mbmr3.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.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
  • hive.mr3.all-in-one.containergroup.memory.mbmr3.am.local.resourcescheduler.max.memory.mb
  • hive.mr3.all-in-one.containergroup.vcoresmr3.am.local.resourcescheduler.max.cpu.cores

检查端口

Metastore 和 HiveServer2 使用由环境变量 HIVE_METASTORE_PORT_LOCALHIVE_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