在非安全 Hadoop 上
本页面介绍如何在非安全 Hadoop 集群(无 Kerberos)上操作 Hive on MR3(完成前置步骤后)。按照以下说明,用户将学习:
- 如何在非安全 Hadoop 集群中配置 Hive on MR3
- 如何启动和停止 Metastore
- 如何启动和停止 HiveServer2
- 如何创建 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.ConnectionDriverName 和 javax.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 应设置为 postgresql 或 mssql。还应更新 conf/tpcds/hive-site.xml 中的配置键 javax.jdo.option.ConnectionURL 和 javax.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