Hadoop 集群部署实战 Part 3 - 部署 Hive

2021-05-16
3分钟阅读时长

【版本】

当前版本号v20230506

版本修改说明
v20230506更新了配置,添加了常见问题
v20220413
v20210516初始化版本

【实验名称】

实验3 - 部署 Hive

【实验目的】

  • 掌握部署 Hive

【实验环境】

  • Windows 7 以上64位操作系统
  • Hadoop 3
  • MariaDB/MySQL

【实验资源】

【实验内容】

  • 完成 Hive 的部署

【实验步骤】

  1. 使用 hadoop 登录 NodeA 节点。
su hadoop
复制
  1. Hive 的安装需要依赖 MySQL 或 MariaDB,这里我们选择 MariaDB。这里需要提权安装,如果安装失败请检查源配置文件/etc/yum.repos.d/local.repo或者光盘是否挂载成功。
sudo yum install mariadb mariadb-server
复制
  1. 启动 MariaDB 并设置为开机启动。
sudo systemctl start mariadb
sudo systemctl enable mariadb
复制
  1. 使用 MariaDB 的安全安装选项。
mysql_secure_installation
复制

以下为弹出选项的输入值

Enter current password for root (enter for none): 回车
Set root password? [Y/n] Y
New password: 123456
Re-enter new password:123456
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
复制
  1. 测试使用 root 账户登录 MariaDB。密码为123456
mysql -u root -p
复制

注意此处设置的简单密码仅为方便实验实施,工作环境请勿设置简单密码!

  1. 登录进入 MariaDB 以后。执行以下SQL
-- 创建 hive 数据库
create database hive CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 创建 hive 用户并授权
create user 'hive'@'localhost' identified by 'hive123456';
create user 'hive'@'%' identified by 'hive123456';
grant all on hive.* to 'hive'@'localhost';
grant all on hive.* to 'hive'@'%';
exit
复制
  1. 退出 MariaDB 命令行,使用 hive 用户进行登录,登录以后查看是否有 hive 这个库。
mysql hive -uhive -p
复制
  • 查看是否有 hive 这个库。
use hive;
复制
  • 退出
exit;
复制
  1. 退出 MariaDB 命令行,切换到系统 root 用户。
su
复制
  1. 增加 Hive 相关环境变量设置。
  • 需要root权限执行
echo "export HIVE_HOME=/opt/hive
export PATH=\$HIVE_HOME/bin:\$PATH" >>/etc/profile
复制
  1. 新增 MariaDB 配置。
  • 需要root权限执行
echo '[client]
default-character-set=utf8
[mysqld]
bind-address = 0.0.0.0
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8
wait_timeout = 600
max_allowed_packet = 64M
sql_mode=NO_BACKSLASH_ESCAPES
[mysql]
default-character-set=utf8' >/etc/my.cnf.d/hive.cnf
复制
  1. 切换到系统 hadoop 用户。
su hadoop
复制
  1. 查看环境变量的输出是否正确。
source /etc/profile
echo $HIVE_HOME
复制

应该输出

/opt/hive
复制
  1. 重启 MariaDB。
sudo systemctl restart mariadb
复制
  1. 查看进程和端口是否正常。
sudo netstat -tulpn|grep mysql
复制

正常会输出进程信息,类似以下内容:

tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2152/mysqld
复制
  1. 使用 hadoop 用户上传 Hive 安装文件apache-hive-3.1.2-bin.tar.gz到 /home/hadoop 并解压。
cd ~
tar -xvf apache-hive-3.1.2-bin.tar.gz
复制
  1. 创建 hive 安装目录,并拷贝文件到安装目录。
sudo mkdir -p /opt/hive
sudo chown hadoop:wheel /opt/hive
mv ~/apache-hive-3.1.2-bin/* /opt/hive
复制
  1. 上传 MariaDB 驱动mariadb-java-client-2.7.2.jar到 /opt/hive/lib/ 目录下。

  2. 编辑 Hive 的配置文件。

cd /opt/hive/conf/
vi hive-site.xml
复制
  1. 加入以下内容。
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 数据库连接 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?useSSL=false</value>
</property>
<!-- 数据库驱动名 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.mariadb.jdbc.Driver</value>
</property> <!-- 数据库用户名 --> <property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<!-- 数据库用户密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive123456</value>
</property>
<!-- 不校验 Schema -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 显示表名 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 显示表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 表头不显示表名 -->
<property>
<name>hive.resultset.use.unique.column.names</name>
<value>false</value>
</property>
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
</property>
<!-- 关闭列统计 -->
<property>
<name>hive.stats.column.autogather</name>
<value>false</value>
</property>
</configuration>
复制
  1. 初始化 Hive 的 Schema。
schematool -dbType mysql -initSchema
复制
  1. 检查 MariaDB 的 hive 库里是否有表。
mysql hive -uhive -phive123456
show tables
exit
复制
  1. 启动 Hadoop。
start-hdp.sh
复制
  1. 启动 Hive
hive
复制
  1. 查看所有数据库
hive> show databases;
复制

【常见问题】

  1. 在 Hive 执行 show tables出现 MetaException 异常。
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Got exception: org.apache.hadoop.hive.metastore.api.MetaException Exception thrown when executing query : SELECT A0.TBL_NAME,A0.TBL_NAME AS NUCORDER0 FROM TBLS A0 LEFT OUTER JOIN DBS B0 ON A0.DB_ID = B0.DB_ID WHERE B0.`NAME` = ? AND B0.CTLG_NAME = ? AND LOWER(A0.TBL_NAME) LIKE '_%' ESCAPE '\' ORDER BY NUCORDER0)
复制

答:这是因为ESCAPE '\'这个语句在 MariaDB执行的时候,\被当成转义字符导致 SQL 语句错误。需要在 MariaDB 使用 root 账号执行以下语句,把\设置为非转义字符。

SET sql_mode='NO_BACKSLASH_ESCAPES';
SET GLOBAL sql_mode = 'NO_BACKSLASH_ESCAPES';
commit;
复制
  1. 运行 Hive SQL 报错“FAILED: Execution Error,return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask” 答:编辑配置文件
cd /opt/hive/conf/
vi hive-site.xml
复制
  • <configuration></configuration>标签内加入以下属性。
<property>
<name>hive.stats.column.autogather</name>
<value>false</value>
</property>
复制

扫码或长按识别访问