Hive 安装

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值