1. 在linux上安装mysql
# 解压安装包
mkdir -p /opt/tools/mysql
tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar -C /opt/tools/mysql
# 删除系统自带的mysql-libs
yum remove -y mysql-libs
# 安装server时要依赖
yum install -y net-tools
# 离线安装
rpm -ivh mysql-community-common-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.22-1.el7.x86_64.rpm
# 依赖安少了,为解决依赖关系问题,通过yum进行安装
yum install -y mysql-community-server-5.7.22-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.22-1.el7.x86_64.rpm
# 启动mysql
systemctl start mysqld
systemctl status mysqld
systemctl enable mysqld
# 查看初始化密码
cat /var/log/mysqld.log | grep password
# 登录
mysql -u root -p
# 输入初始化密码
# 设置校验密码的长度
set global validate_password_policy = LOW;
# 修改密码
set password=password('12345678');
exit
# 修改my.cnf,默认在/etc/my.cnf,执行:vi /etc/my.cnf,添加如下内容:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
character_set_server=utf8
# 重启生效
systemctl restart mysqld
# 对外开放权限
set global validate_password_policy=LOW;
grant all privileges on *.* to 'root'@'%' identified by '12345678';
# 刷新生效
flush privileges;
2. 安装Hive
1. 解压到/usr/local/目录下
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /usr/local
创建软连接/起别名
ln -s /usr/local/apache-hive-3.1.3-bin /usr/local/hive
修改/usr/local/hive/apache-hive-3.1.3-bin目录所有者
chown -R hadoop:hadoop /usr/local/apache-hive-3.1.3-bin
2. 配置环境变量
增加 HIVE_HOME 和 HIVE_CONF_DIR配置文件目录
vi /etc/profile
export HIVE_HOME=/usr/local/hive
export HIVE_CONF_DIR=/usr/local/hive/conf
export PATH=$PATH:$HIVE_HOME/bin
更新配置/使配置生效
source /etc/profile
3. 修改参数配置文件(默认配置模板文件)
hive-site.xml
cp hive-default-xml.template hive-site.xml
vi hive-site.xml
<configuration>
<-- 数据库 start -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://nn1:3306/hive_meta?useSSL=false</value>
<description>mysql连接</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>mysql驱动</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>数据库使用用户名</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>12345678</value>
<description>数据库密码</description>
</property>
<!-- 数据库end -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/hive/warehouse</value>
<description>hive使用的HDFS目录</description>
</property>
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 其他 end-->
</configuration>
修改环境变量文件hive-env.sh.template
mv hive-env.sh.template hive-env.sh
mv hive-log4j2.properties.template hive-log4j2.properties
3. 登录mysql创建hive用的数据库和hive用户
mysql -u root -p
创建hive用户
create user 'hive'@'%' identified by '12345678';
在mysql中创建hive_meta数据库
create database hive_meta default charset utf8 collate utf8_general_ci;
给hive用户增加hive_meta数据库权限
grant all privileges on hive_meta.* to 'hive'@'%' identified by '12345678';
刷新权限
flush privileges;
exit
hive用户登录
mysql -u hive -p
show databases;
4. 拷贝mysql驱动jar包到/usr/local/hive/lib/,用于连接mysql
cp /public/software/database/mysql-connector-java-5.1.49,jar /usr/local/hive/lib
5. 删除冲突的log4j
rm -rf log4j-slf4j-impl-2.17.1.jar
6. hive初始化mysql(目的:mysql中有个数据库hive_meta保存元数据,而元数据需要相应的表来存储,hive初始化MySQL就是为了在该数据库下创建保存元数据的表)
schematool -dbType mysql -initSchema
--schematool是hive中的一个执行脚本
--报错: hive与hadoop经常存在库文件版本不一致的情况,hive中的guava.jar文件低版本替换高版本
cp /usr/local/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /usr/local/hive/lib
rm -rf guava-19.0.jar
--再次执行初始化--
mysql -u hive -p
use hive_mata;
show tables;
3. 启动hive客户端
命令行接口启动hive客户端
hive客户端有很多组件,命令行接口只能在安装hive所在机器上执行命令行接口,JDBC远程连接,无论哪种方式,启动hive客户端都必须要使用元数据服务,
元数据库服务端配置即: hive-site.xml中数据库相关的四个配置(mysql连接,mysql驱动,数据库使用用户名,数据库密码)
hive
显示默认当前使用的库:在hive-site.xml最后一个配置hive.cli.print.current.db
hive (default)> create database student;
use student;
create table aaa(id int);
--不建议单条insert,很慢,用的三个Job,先创建临时表,数据放到临时表,再把数据导入aa这张表
insert into aaa values(1);
--报错:不是所有人都可以提交任务到yarn上,需要指定队列名字
Failed to submit application_ to YARN: Application rejected by queue placement policy
set mapreduce.job.queuename=yae
--递归查看
hadoop fs -lsr /
/hive/warehouse
/hive/warehouse/student.db
/hive/warehouse/student.db/aaa
/hive/warehouse/student.db/aaa/000000_0
--在hive的客户端执行hadoop相关命令hadoop fs/hdfs dfs换成dfs
dfs -ls /hive/warehouse/student.db/aaa
dfs -cat /hive/warehouse/student.db/aaa/000000_0
1
JDBC启动客户端,要用到Hiveserver2组件
配置Hiveserver2服务
通过命令行接口本地连接hive执行sql,JDBC远程连接都需要将sql提交给hive的服务端,Driver进行sql的编译优化执行,执行的时候需要用到Hadoop集群。之前通过hive脚本启动hive客户端就相当于命令行方式启动,sql提交给Driver端,需要执行mr再连接hadoop集群执行任务。如果使用JDBC连接hive编写sql,就需要另外一个组件hiveserver2,可以将hiveserver2看成代理。比如说有很多用户都可以通过JDBC连接Hive服务,tom,jerry,bob需要将sql提交到hiveserver2服务组件。hiveserver2再把sql提交给Driver,执行的时候再找hadoop集群。这也意味着,在启动hiveserver2 的时候,必须要是在hadoop集群所在的节点进行启动。hiveserver2可以把用户发起的JDBC连接作为一个代理操作hadoop集群,hadoop集群需要允许hiveserver2作为代理,那么hadoop集群需要开启代理功能。即
修改/usr/local/hadoop/etc/hadoop/core-site.xml核心配置文件开启hadoop代理功能
# hadoop.开启代理用户的功能.用户名(超级用户).users,*代表可以代理所有用户
<property>
<name>hadoop.proxyuser.hadoop.users</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
<description>配置hadoop(超级用户)允许通过代理访问的主机节点</description>
</property>
<property>
<name>hadoop.proxtuser.hadoop.groups</name>
<value>*</value>
<description>配置hadoop(超级用户)允许通过代理用户所属组</description>
</property>
# 分发
scp_all.sh /usr/local/hadoop/etc/hadoop/core-site.xml /usr/local/hadoop/etc/hadoop
# 重启生效
stop-all.sh
start-all.sh
hadoop怎么识别用户,涉及到配置文件hive-site.xml添加hiveserver2服务
# 在哪一台机器上启动hiveserver2
<property>
<name>hive.server2.thrift.bind.host</name>
<value>nn1</value>
<description>hive开启的thriftServer地址</description>
</property>
# 通信的端口
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
<description>hive开启的thriftServer端口</description>
</property>
# 哪个用户通过JDBC连接,就识别成哪一个用户
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
cd ../bin
# 启动后会占用bash环境,因此采用后台启动&,所有日志放到/dev/null,无论是标准输出还是标准错误输出
nohup hiveserver2 >/dev/null 2>&1 &
# 查看后台服务
jobs -l / jps -ml
通过JDBC进行连接操作
通过Beeline方式连接hive hiveserver2启动的一个服务器的ip:端口号10000固定的,-n后是以什么用户启动
beeline -u jdbc:hive2://nn1:10000 -n hadoop
# 单独beeline也可以识别
help
!connect jdbc:hive2://nn1:10000
配置metastore服务
默认hive cli 和 hiveserver2服务内嵌了metastore服务,可以直接连接mysql数据库,但是若连接过多会造成mysql数据库压力过大(一般练习时可以用),另外对于metastore服务来说不安全,因为所有的配置信息在配置文件中都能看到。在企业中可以采用metastore服务单独的方式进行设计,在nn2上配置metastore客户端。
nn2上配置metastore的客户端
<property>
<name>hive.metastore.uris</name>
<value>thrift://nn1:9083</value>
</property>
nn1上启动metastore的服务端
nohup hive --service metastore > /dev/null 2>&1 &
jobs -l
jps -ml
4.hive的三种模式
使用内置的derby数据库做元数据的存储
操作derby数据库做元数据的管理,使用derby存储方式时:
(1) 运行hive会在当前目录生成一个derby文件和一个metastore_db目录用来保存元数据信息(不同目录下启动hive看到的元数据不一样),
(2) 这种存储方式的弊端是在同一个目录下同时只能有一个hive客户端能使用数据库,目录不同时元数据也无法共享,不适合生产环境只适合练习。
本地模式(内嵌模式)
使用mysql做元数据的存储,操作mysql数据库做元数据的管理,可以多个hive client一起使用,并且可以共享元数据,但mysq的连接信息明文存储在客户端配置,不便于数据库连接信息保密和以后对元数据库进行更改,如果客户端太多也会对mysql造成较大的压力,因为每个客户端都自己发起连接。
安全角度:metastore存储mysql连接的数据库信息,driver和metastore在一台机器上,数据库信息不安全。当多台机器的Driver、metastore都指向一个mysql时,mysql的压力会增大。
远程模式
使用mysql做元数据的存储,使用metastore服务做元数据的管理,优点便于元数据库信息的保密,因为只需要在运行metastore的机器上配置元数据库连接信息,客户端只需要配置metastore连接信息即可,缺点会引发单点问题,例如metastore服务挂了,其他hive终端就获取不到元数据信息了。
安全角度:meta从hive的driver上分离出来,在单独的机器上,这样数据库的连接信息会安全。启动时,需要分别启动driver和metastore
本地模式和远程模式的区别是:
1. 本地模式不安全,远程模式安全
2. 本地模式不需要单独起metastore服务,用的是跟hive在同一个进程里的metastore服务。
远程模式需要单独起metastore服务,然后每个客户端都在配置文件里配置连接到该metastore服务。
服务端指的是metastore服务所在的机器,即安装metastore的机器
metastore服务端配置
<configuration>
<!-- 数据库 start -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://nn1.hadoop:3306/hive_meta</value>
<description>mysql连接</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>mysql驱动</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>数据库使用用户名</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>12345678</value>
<description>数据库密码</description>
</property>
</configuration>
metastore客户端配置
<property>
<name>hive.metastore.uris</name>
<value>thrift://nn1.hadoop:9083</value>
</property>
启动hive
# 启动zookeeper、hdfs、yarn、代理、历史
# 启动metastore
nohup hive --service metastore > /dev/null 2>&1 &
# 启动hive客户端
hive