前言: hive是基于hadoop的,数据存储在hdfs上并且对客户端提供hql支持,将hql语句转换为mapreduce任务的数仓工具,hive就相当于hadoop的一个另一种形式的客户端 hql,hive的底层是用java实现的!
一、安装准备:
安装hive之前保证hadoop、zookeeper、jdk
二、安装版本:
主流是1.2和2.3 版本
三、安装节点:
一个节点就可以了
1、安装模式:
1.1使用自带的元数据库 (了解)
1)上传
将压缩包上传至节点
2)解压
tar -xvzf apache-hive-2.3.2-bin.tar.gz
3)配置环境变量
建一个hive的软链
ln -s apache-hive-2.3.2-bin hive
配置环境变量
vim /etc/profile
export HIVE_HOME=/home/hadoop/apps/hive
export PATH=$PATH:$HIVE_HOME/bin
source /etc/profile
4)元数据库初始化
schematool -dbType derby -initSchema
初始化过程:
①创建元数据库
默认创建的元数据库的名字 metastore_db
jdbc:derby:;databaseName=metastore_db;create=true
schemaTool completed 成功标志
②初始化成功后初始化的当前目录:
derby.log 数据库的日志信息 metastore_db 元数据库 derby库中的数据存在这个目录下的
schemaTool failed 失败
5)启动
hive
启动hive之前要一定保证hadoop是启动的
否则报错:Caused by: java.net.ConnectException: Connection refused
启动过程中日志信息如下:
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive>
直接3)跳到5)执行命令 报错
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
原因:元数据初始化没有做好
格式化成功后在格式化的目录启动hive是正常可以使用的,但是换个目录启动hive运行命令报错
FAILED: SemanticException
org.apache.hadoop.hive.ql.metadata.HiveException:
java.lang.RuntimeException: Unable to instantiate
org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
元数据格式化问题
derby数据库的缺陷:
1)单用户的数据库
在格式化的时候当前目录下生成derby的数据库文件,在那个目录启动hive的时候只会找当前目录下的元数据库,一旦启动的目录和格式化的目录不同,这个时候启动运行命令仍然会报元数据没有初始化,启动目录的下没有元数据库格式化的文件;
2)不同目录下的元数据不能共用的。
该方法不适用生产环境
1.2使用mysql作为元数据库(重点)
1)上传压缩包
2)解压
3)修改配置文件
4)需要先安装mysql数据库
rpm包
yum方式安装
1)安装mysql并配置好mysql的用户名密码
yum安装mysql
①配置yum源
- 在/mnt创建目录cdrom
mkdir cdrom - 挂载
sudo mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom/ - 配置本地的yum源
sudo rename .repo .repo.bak *
sudo cp CentOS-Media.repo.bak CentOS-Media.repo
sudo yum clean all
yum repolist
②安装mysql
sudo yum install -y mysql-server
sudo service mysqld start
③修改mysql的用户名、密码
use mysql;
delete from user where user='';
update user set host='%' where host='localhost';
update user set password=PASSWORD('123456') where user='root';
flush privileges;
退出mysql
重启mysql服务
5)修改hive的配置文件
cd /home/hadoop/apps/hive/conf
- 换掉默认的元数据库
touch hive-site.xml
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/bd1901?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
<!-- hive连接mysql的连接url 如果 mysql 和 hive 在同一个服务器节点,连接的主机名最好为 localhost bd1901 hive的元数据库 -->
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
</configuration>
6)将hadoop的 hdfs-site core-site 添加到hive的conf目录下
cp /home/hadoop/apps/hadoop/etc/hadoop/core-site.xml
/home/hadoop/apps/hadoop/etc/hadoop/hdfs-site.xml
/home/hadoop/apps/hive/conf/
7)初始化hive的元数据库
①将mysql的驱动放在hive安装目录的lib下
②格式化(在hive的conf目录下运行)
生成mysql中hive对应的元数据库,在mysql中创建一个数据库,然后在库中执行下面的命令:
schematool -dbType mysql -initSchema
执行完后会生成了一些列的表(存储元数据用的)
8)启动
hive使用过程中:
一般启动hive的本地模式,在hive的客户端执行
set hive.exec.mode.local.auto=true;
只对当前客户端生效
四、hive的安装过程中两个常见问题
1、mysql的密码过期问题
报错如下:
Underlying cause: java.sql.SQLException : Your password has expired. To log in you must change it using a client that supports expired passwords.
mysql中的mysql库下user表中的password_expired字段标识密码是否过期
过期 Y 没有N
如果遇到过期的解决办法:
执行语句:
update user set password_expired="N" where user="root";
flush privileges;
重启mysql服务 service mysql restart
2、mysql的用户名 密码不对
报错如下:
Underlying cause: java.sql.SQLException : Access denied for user ‘root’@‘localhost’ (using password: YES)
root(mysql用户)’@‘localhost (主机名)
mysql --> user
user表中 user host password password_expired
root(mysql用户)’@'localhost (主机名)
@之前 对应的 user表中的user字段
@之后 对应的 user表中的host字段值
| user | host | password |
±-----±----------±------------------------------------------+
| root | % | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | hdp03 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
root@localhost
根据 hive-site.xml中配置的mysql连接来得
localhost:
url:
jdbc:mysql://localhost:3306
root:
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
用户名密码问题