跳到主要内容

在非安全 Hadoop 上

本页面介绍如何在非安全 Hadoop 集群(无 Kerberos)上操作 Hive on MR3(完成前置步骤后)。按照以下说明,用户将学习:

  1. 如何在非安全 Hadoop 集群中配置 Hive on MR3
  2. 如何启动和停止 Metastore
  3. 如何启动和停止 HiveServer2
  4. 如何创建 Beeline 连接并向 HiveServer2 发送查询

配置 Metastore

Hive on MR3 可以使用任意兼容版本的 Metastore,不一定使用 MR3 release 中包含的版本。例如,如果 Hadoop 集群中已有 Metastore 实例在运行,用户可以复用它,而无需启动新实例。

在我们的示例中,我们启动一个新的 Metastore 实例,使用 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

由于我们使用 --tpcds 选项,打开 conf/tpcds/hive-site.xml 并更新以下配置键。删除配置键 javax.jdo.option.ConnectionDriverNamejavax.jdo.option.ConnectionUserName

vi conf/tpcds/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
...
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_MYSQL_DRIVER=/usr/share/java/mysql-connector-java.jar
  • HIVE_METASTORE_DB_TYPE 应设置为 mysql
  • HIVE_DATABASE_HOST 指定运行 MySQL 服务器的节点。
  • HIVE_DATABASE_NAME 指定在 MySQL 中为 Metastore 创建的新数据库的名称。在我们的示例中,我们使用 hivemr3
  • HIVE_MYSQL_DRIVER 应指向 MySQL 连接器 jar 文件。

由于我们使用 --tpcds 选项,打开 conf/tpcds/hive-site.xml 并更新以下配置键。将 javax.jdo.option.ConnectionUserName 设置为 MySQL 用户名,将 javax.jdo.option.ConnectionPassword 设置为密码。

vi conf/tpcds/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

启动 Metastore

使用 --tpcds 选项运行 Metastore,并使用 --init-schema 选项初始化数据库模式。

hive/metastore-service.sh start --tpcds --init-schema
# Running Metastore using Hive-MR3
#Output Directory: /home/hive/mr3/hadoop/hive/metastore-service-result/hive-2025-03-14-00-20-47-89f10360
Starting Metastore...

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

tail -f /home/hive/mr3/hadoop/hive/metastore-service-result/hive-2025-03-14-00-20-47-89f10360/out-metastore.txt
...
Starting metastore schema initialization to 4.0.0
Initialization script hive-schema-4.0.0.derby.sql...
Initialization script completed...
2025-03-14 00:20:58: Starting Hive Metastore Server

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

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

重启 Metastore 时,不要使用 --init-schema 选项,以便重用现有的 Hive 数据库。例如,用户可以终止 Metastore 并重新启动它,如下所示。

hive/metastore-service.sh stop --tpcds
hive/metastore-service.sh start --tpcds

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

ls /home/hive/mr3/hadoop/hive/metastore-service-result/hive-2025-03-14-00-20-47-89f10360/hive-logs/hive.log

启动 HiveServer2

信息

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

使用 --tpcds 选项运行 HiveServer2。要使用 MR3 DAGAppMaster 的 LocalProcess 模式,请使用 --amprocess 选项。

hive/hiveserver2-service.sh start --tpcds --amprocess
# Running HiveServer2 using Hive-MR3
#Output Directory: /home/hive/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-14-00-35-08-b34a5b8f
Starting HiveServer2...

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

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

grep -e "New MR3Session created" /home/hive/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-14-00-35-08-b34a5b8f/hive-logs/hive.log
2025-03-13T15:35:34,451 INFO [main] session.MR3SessionManagerImpl: New MR3Session created: cca348a5-1f4e-4f59-a9f2-c7defbe0630f, hive

用户可以找到由用户提交的新的 Yarn 应用,类型为 mr3

yarn application -list
...
application_1739072579773_0335 hive-mr3-cca348a5-1f4e-4f59-a9f2-c7defbe0630f mr3 hive default RUNNING UNDEFINED 0% N/A

由于我们对 MR3 DAGAppMaster 使用 LocalProcess 模式,其日志文件位于 HiveServer2 的输出目录下。

ls /home/hive/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-14-00-35-08-b34a5b8f/application_1739072579773_0335/run.log
/home/hive/mr3/hadoop/hive/hiveserver2-service-result/hive-2025-03-14-00-35-08-b34a5b8f/application_1739072579773_0335/run.log

运行 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

使用默认数据库。

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

创建一个名为 pokemon 的表。

0: jdbc:hive2://blue0: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://blue0:9842/> load data local inpath './pokemon.csv' INTO table pokemon;

执行查询。

0: jdbc:hive2://blue0:9842/> select avg(HP) from pokemon;
0: jdbc:hive2://blue0: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://blue0:9842/> select COUNT(name), power_rate from pokemon1 group by power_rate;

退出 Beeline。HDFS 上的仓库目录现在有两个子目录,对应上面创建的两个 Hive 表。

hdfs dfs -ls /user/hive/warehouse
Found 2 items
drwxr-xr-x - hive hdfs 0 2025-03-13 15:42 /user/hive/warehouse/pokemon
drwxr-xr-x - hive hdfs 0 2025-03-13 15:43 /user/hive/warehouse/pokemon1

停止 HiveServer2 和 Metastore

停止 HiveServer2。MR3 DAGAppMaster 也会停止。

hive/hiveserver2-service.sh stop --tpcds

停止 Metastore。

hive/metastore-service.sh stop --tpcds