大数据实验踩坑指南_No.2——Hive的安装配置
大数据实验踩坑指南_No.2——Hive的安装配置
事先说明,Beeline还有很多坑没有处理好,暂时先跳过,只使用传统Hive Cli
Hive基础安装
通过官网下载apache-hive-3.1.3-bin.tar.gz
根据另一篇文章[1]安装好MySQL
将文件解压到/usr/local
目录内
1 | sudo tar -zxvf /home/hadoop/Downloads/apache-hive-3.1.3-bin.tar.gz -C /usr/local/ |
进入该目录并将Hive的主目录改名
1 | cd /usr/local |
修改目录拥有者
1 | sudo chown -R hadoop:hadoop hive |
配置Hive相关的环境变量
1 | export HIVE_HOME=/usr/local/hive |
加载配置文件
1 | source /home/hadoop/.bashrc |
MySQL配置
启动MySQL服务
1 | sudo service mysql start |
登录MySQl Shell
1 | sudo mysql -u root |
创建hadoop
用户,密码为hadoop
1 | mysql> CREATE USER 'hadoop'@'%' IDENTIFIED BY 'hadoop'; |
创建hive
数据库并把数据库的权限赋予hadoop
用户
1 | mysql> create database hive; |
最后记得刷新权限
1 | mysql> flush privileges; |
输入exit
退出MySQL
登录hadoop
目录,输入密码hadoop
1 | mysql -u hadoop -p |
下载JDBC连接驱动的deb安装包,我的MySQL版本为8.0.37,网站上写的Product Version只有8.0.33,不过也是兼容的,选择好MySQL版本和Ubuntu版本,即可下载deb安装包
现在MySQL版本更新到了9,可以直接使用MySQL 9和对应的JDBC驱动
通过apt
工具安装驱动
1 | sudo apt-get install /home/hadoop/Downloads/mysql-connector-j_8.0.33-1ubuntu22.04_all.deb |
然后将安装好的驱动复制到Hive的lib目录下
1 | cp /usr/share/java/mysql-connector-j-8.0.33.jar $HIVE_HOME/lib/ |
MySQL注意事项
通信问题
为了让Hive与MySQL能通信,需要修改以下配置
1 | [mysqld] |
命令差异
MySQL8和MySQL5.7命令有差异
创建用户与赋权
在MySQL5.7版本上,使用以下命令可以同时创建账户并赋权
1 | mysql> GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; |
但是在新版本的MySQL 8.x
版本上,已经将两个操作分离,执行以上命令会导致语法错误
1 | mysql> 'hadoop'@'%' IDENTIFIED BY 'hadoop' WITH GRANT OPTION; |
应将创建用户与授权命令分离:
1 | mysql> CREATE USER 'hadoop'@'%' IDENTIFIED BY '123456'; |
修改密码
MySQL修改密码有三种方式[2]
方法一:使用UPDATE语句更改MySQL用户密码
1 | mysql> USE mysql; |
注意:MySQL 5.7.6版本以下,才能使用此方法来修改密码。从MySQL 5.7.6版本起,user表仅使用authentication_string列代替之前版本中的password列来存储密码。此外,它删除了password列。
版本在5.7.6+,必须在UPDATE语句中使用authentication_string列代替password列
1 | mysql> USE mysql; |
方法二:使用SET PASSWORD语句更改MySQL用户密码
1 | mysql> SET PASSWORD FOR 'jccc'@'%' = PASSWORD('newpasswd2'); |
从MySQL 5.7.6版本开始,MySQL不推荐使用此语法,可能会在将来的版本中将其删除。作为一个代替的解决方案,它使用明文密码如下:
1 | mysql> SET PASSWORD FOR 'jccc'@'%' = 'newpasswd2'; |
方法三:使用ALTER USER
语句改MySQL用户密码
1 | mysql> ALTER USER jccc@% IDENTIFIED BY 'newpasswd3'; |
Hive配置
Hive自身配置
进入Hive的目录,复制几个配置文件的模板
1 | cd $HIVE_HOME/conf |
配置hive-site.xml
文件,跟使用TiDB[3]的配置类似
各个选项的说明可以在这里看到
注意:
创建用户和授权命令在MySQL8.x版本中有所不同,配置文件中根据你创建的MySQL用户和密码进行修改。
hive-site.xml
配置文件中,需要将javax.jdo.option.ConnectionDriverName
的值修改为com.mysql.cj.jdbc.Driver
,而原本的com.mysql.jdbc.Driver
在较新的MySQL Connector/J版本中已被标记为过时,新的驱动类提供了更好的功能和性能。如果使用原本的值,初始化Hive会出现以下警告。
1 Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.还有用户名密码要设为MySQL中对应的。
1 | <configuration> |
配置Hive的环境变量hive-env.sh
1 | export HADOOP_HOME=/usr/local/hadoop |
运行下面的命令初始化MySQL元数据
1 | schematool -dbType mysql -initSchema --verbose |
配置Hadoop的代理用户
HiveServer2的使用需要用到Hadoop的代理用户,使用以下配置允许hadoop用户代理所有主机中和所有用户
1 | <property> |
注意:这里的hadoop.proxyuser.xxx.hosts和hadoop.proxy.xxx.groups要把中间的xxx换成你的用户名[4],也就是允许xxx代理所有主机所有用户(折腾几天才发现hiveserver2启动不起来是这里的问题(≖_≖ ))
启动并试用Hive
首先启动Hadoop集群
1 | start-all.sh |
启动Metastore(传统Hive Cli不需要HiveServer2)
1 | hive --service metastore |
启动Hive客户端并进行测试
1 | hive |
在里面可以输入SQL语句,如果要退出Hive交互式执行环境,可以输入如下命令:
1 | hive> exit; |
(Beeline部分待完善)
如果使用的是4.0版本,Beeline代替了传统的hive cli,需要先启动HiveServer2再进入Beeline,大部分Hive的SQL语句也是可以用于Beeline的启动HiveServer2:
1 hive --service hiveserver2Beeline连接HiveServer2。为了拥有访问hadoop目录的权限,把
username
改为你的系统用户名如果不指定用户,使用的是匿名用户,没有权限访问/user/hive/warehouse,无法创建数据库
1 beeline -u jdbc:hive2://localhost:10000 -n username使用
!quit
或!exit
退出Beeline
Hive排错
无法执行Hive的SQL语句
运行hive命令如果报错:
1 | FAILED: HiveException java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient |
说明Hive
在尝试连接到Hive MetaStore时失败了
可能是因为Hive MetaStore
服务没有运行,在后台运行以下命令:
1 | hive --service metastore & |
然后再运行hive
即可正常使用
如果还是不行,就重新初始化hive
尝试进入MySQL将hive数据库删除。由于已经授权给用户hadoop
,直接登录hadoop
对hive数据库重置即可,无需登录root
用户进行删除并重新创建授权
1 | mysql> drop database hive; |
然后删除HDFS中的/tmp
目录
1 | hdfs dfs -rm -r /tmp |
再重新升级元数据
1 | schematool -initSchema -dbType mysql --verbose |
格式化失败
如果在运行schematool
命令进行初始化时报以下错误
1 | Error: Table 'CTLGS' already exists (state=42S01,code=1050) |
可以尝试先进入MySQL
,删除hive
数据库再重建
1 | DROP DATABASE hive; |