Hive学习笔记(一) Hive安装

前面学习到利用mapreduce去计算,但是mapreduce写起来麻烦,并且代码重复度高,可以进行封装,所以就出来了Hive,hive工具通过执行类SQL来启动写好的mapreduce,进一步执行hdfs中的资源。

1 Hive是什么

1.1 概念

1) hive简介

Hive:由Facebook开源用于解决海量结构化日志的数据统计工具。

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

2) Hive本质:将HQL转化成MapReduce程序如下图所示。需要注意的是以下三点:

(1)Hive处理的数据存储在HDFS

(2)Hive分析数据底层的实现是MapReduce

(3)执行程序运行在Yarn上

1636945549117

1.2 Hive架构

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的Driver,结合元数据(MetaStore),将这些指令翻译成MapReduce,提交到Hadoop中执行,最后,将执行返回的结果输出到用户交互接口。具体架构图如下所示。

1636945658710

1)用户接口:Client

CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

2)元数据:Metastore

元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;

默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

3)Hadoop

使用HDFS进行存储,使用MapReduce进行计算。

4)驱动器:Driver

(1)解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

(2)编译器(Physical Plan):将AST编译生成逻辑执行计划。

(3)优化器(Query Optimizer):对逻辑执行计划进行优化。

(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

2 Hive 安装

2.1 Hive安装地址

1)Hive官网地址

http://hive.apache.org/

2)文档查看地址

https://cwiki.apache.org/confluence/display/Hive/GettingStarted

3)下载地址

http://archive.apache.org/dist/hive/

4)github地址

https://github.com/apache/hive

2.2 MySql安装

0)为什么需要Mysql

原因在于Hive默认使用的元数据库为derby,开启Hive之后就会占用元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。以我们需要将Hive的元数据地址改为MySQL,可支持多窗口操作。

1)检查当前系统是否安装过Mysql

[molly@hadoop102 ~]$ rpm -qa|grep -I -E mysql\|mariadb
mariadb-libs-5.5.56-2.el7.x86_64 //如果存在通过如下命令卸载
[molly@hadoop102 ~]$ sudo rpm -e --nodeps mariadb-libs  //用此命令卸载mariadb
[molly@hadoop102 ~]$ rpm -qa|grep -I -E mysql\|mariadb | xargs -n1 sudo rpm -e --nodeps#卸载所有

2)将MySQL安装包拷贝到/opt/software目录下

[molly@hadoop102 software]# ll
总用量 528384
-rw-r--r--. 1 root root 609556480 3月 21 15:41 mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

3)解压MySQL安装包

[molly@hadoop102 software]# tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

4)在安装目录下执行rpm安装

[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

注意:按照顺序依次执行

如果Linux是最小化安装的,在安装mysql-community-server-5.7.28-1.el7.x86_64.rpm时可能会出 现如下错误

[molly@hadoop102 software]$ sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

警告:mysql-community-server-5.7.28-1.el7.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 5072e1f5: NOKEY

错误:依赖检测失败:

​ libaio.so.1()(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要

​ libaio.so.1(LIBAIO_0.1)(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要

​ libaio.so.1(LIBAIO_0.4)(64bit) 被 mysql-community-server-5.7.28-1.el7.x86_64 需要

通过yum安装缺少的依赖,然后重新安装mysql-community-server-5.7.28-1.el7.x86_64 即可

[molly@hadoop102 software] yum install -y libaio

5)删除/etc/my.cnf文件中datadir指向的目录下的所有内容,如果有内容的情况下:

查看datadir的值:

[mysqld]

datadir=/var/lib/mysql

删除/var/lib/mysql目录下的所有内容:

[molly@hadoop102 mysql]# cd /var/lib/mysql
[molly@hadoop102 mysql]# sudo rm -rf ./*  //注意执行命令的位置

6)初始化数据库

[molly@hadoop102 opt]$ sudo mysqld --initialize --user=mysql

7)查看临时生成的root用户的密码

[molly@hadoop102 opt]$ cat /var/log/mysqld.log |grep password

8)启动MySQL服务

[molly@hadoop102 opt]$ sudo systemctl start mysqld

9)登录MySQL数据库

[molly@hadoop102 opt]$ mysql -uroot -p
Enter password:  输入临时生成的密码

登录成功.

10)必须先修改root用户的密码,否则执行其他的操作会报错

mysql> set password = password("000000")

11)修改mysql库下的user表中的root用户允许任意ip连接

mysql> update mysql.user set host='%' where user='root';
mysql> flush privileges;

2.3 Hive安装部署

1)把apache-hive-3.1.2-bin.tar.gz上传到linux的/opt/software目录下

2)解压apache-hive-3.1.2-bin.tar.gz到/opt/module/目录下面

[molly@hadoop102 software]$ tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/

3)修改apache-hive-3.1.2-bin.tar.gz的名称为hive

[molly@hadoop102 software]$ mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive-3.1.2

4)修改/etc/profile.d/my_env.sh,添加环境变量

[molly@hadoop102 software]$ sudo vim /etc/profile.d/my_env.sh

5)添加内容

#HIVE_HOME
HIVE_HOME=/opt/module/hive-3.1.2
PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin
export PATH JAVA_HOME HADOOP_HOME HIVE_HOME

6)解决日志Jar包冲突:Hive日志与Hadoop默认日志冲突,可以直接删除hive日志JAR

[molly@hadoop102 software]$ rm -rf /opt/module/hive-3.1.2/lib/log4j-slf4j-impl-2.10.0.jar 

2.4 Hive元数据配置到MySql

因为Hive默认使用的元数据库为derby,为了想多窗口操作,我们需要将Hive的元数据地址改为MySQL。下面安装好mysql后,进行将Hive元数据配置到mysql上。其中HIVE_HOME=/opt/module/hive-3.1.2

2.4.1 拷贝驱动

将MySQL的JDBC驱动拷贝到Hive的lib目录下

[molly@hadoop102 software]$ cp /opt/software/mysql-connector-java-5.1.48.jar $HIVE_HOME/lib

2.4.2 配置Metastore到MySql

在$HIVE_HOME/conf目录下新建hive-site.xml文件

[molly@hadoop102 software]$ vim $HIVE_HOME/conf/hive-site.xml

添加如下内容

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
  <!-- jdbc连接的URL -->
  <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
  <!-- jdbc连接的Driver-->
  <property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value>
</property>
  <!-- jdbc连接的username-->
  <property><name>javax.jdo.option.ConnectionUserName</name><value>root</value>
  </property>
  <!-- jdbc连接的password -->
  <property><name>javax.jdo.option.ConnectionPassword</name><value>123456</value>
</property>
  <!-- Hive默认在HDFS的工作目录 -->
  <property><name>hive.metastore.warehouse.dir</name><value>/user/hive/warehouse</value>
  </property>
  <!-- Hive元数据存储的验证 -->
  <property><name>hive.metastore.schema.verification</name><value>false</value>
  </property>
  <!-- 元数据存储授权 -->
  <property><name>hive.metastore.event.db.notification.api.auth</name><value>false</value>
  </property>
</configuration>

2.5 启动Hive

2.5.1 初始化元数据库

1)登陆MySQL

[molly@hadoop102 software]$ mysql -uroot -p000000

2)新建Hive元数据库

mysql> create database metastore;
mysql> quit;

3)初始化Hive元数据库

[molly@hadoop102 software]$ schematool -initSchema -dbType mysql -verbose

2.5.2 启动Hive

0)先启动hadoop集群

[molly@hadoop102 bin]$ start-dfs.sh
[molly@hadoop102 bin]$ start-yarn.sh
[molly@hadoop102 bin]$ myjps.sh

浏览器中查看hdfs:http://Hadoop102:9870

浏览器中查看yarn :http://Hadoop103:8088

1)启动Hive

[molly@hadoop102 hive]$ bin/hive

2)使用Hive

hive> show databases;
hive> show tables;
hive> create table test (id int);
hive> insert into test values(1);
hive> select * from test;

2.5.3 使用元数据服务的方式访问Hive

原始方法:Hive直接访问mysql

使用元数据服务方式:Hive—》元数据服务,元数据服务—》访问mysql。

1)在hive-site.xml文件中添加如下配置信息

  <!-- 指定存储元数据要连接的地址 -->
  <property><name>hive.metastore.uris</name><value>thrift://hadoop102:9083</value>
  </property>

2)启动metastore

[molly@hadoop202 hive]$ hive --service metastore
2020-04-24 16:58:08: Starting Hive Metastore Server

注意: 启动后窗口不能再操作,需打开一个新的shell窗口做别的操作

3)启动 hive

[molly@hadoop202 hive]$ bin/hive

2.5.4 使用JDBC方式访问Hive

客户端是beeline(JDBC协议去访问);

服务端:Hive使用hiveserver2提供JDBC协议:

所以访问数据流是:blleline通过hiveserver2去访问Hive。

1)在hive-site.xml文件中添加如下配置信息

2)启动hiveserver2

[molly@hadoop102 hive]$ bin/hive --service hiveserver2

3)启动beeline客户端(需要多等待一会)

[molly@hadoop102 hive]$ bin/beeline -u jdbc:hive2://hadoop102:10000 -n molly

4)看到如下界面

Connecting to jdbc:hive2://hadoop102:10000
Connected to: Apache Hive (version 3.1.2)
Driver: Hive JDBC (version 3.1.2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 3.1.2 by Apache Hive
0: jdbc:hive2://hadoop102:10000>

3 常用命令

3.1 Hive常用交互命令

[molly@hadoop102 hive]$ bin/hive -help

1)“-e”不进入hive的交互窗口执行sql语句

[molly@hadoop102 hive]$ bin/hive -e "select id from student;"

2)“-f”执行脚本中sql语句

(1)在/opt/module/hive/下创建datas目录并在datas目录下创建hivef.sql文件

[molly@hadoop102 datas]$ touch hivef.sql

(2)文件中写入正确的sql语句

select *from student;

(3)执行文件中的sql语句

[molly@hadoop102 hive]$ bin/hive -f /opt/module/hive/datas/hivef.sql

(4)执行文件中的sql语句并将结果写入文件中

[molly@hadoop102 hive]$ bin/hive -f /opt/module/hive/datas/hivef.sql > /opt/module/datas/hive_result.txt

3.2 Hive其他命令操作

1)退出hive窗口:

hive(default)>exit;
hive(default)>quit;

在新版的hive中没区别了,在以前的版本是有的:

exit:先隐性提交数据,再退出;

quit:不提交数据,退出;

2)在hive cli命令窗口中如何查看hdfs文件系统

hive(default)>dfs -ls /;

3)查看在hive中输入的所有历史命令

(1)进入到当前用户的根目录/root或/home/molly

(2)查看. hivehistory文件

[atguig2u@hadoop102 ~]$ cat .hivehistory

3.3 Hive常见属性配置

3.3.1 hive窗口打印默认库和表头

1)打印 当前库 和 表头

在hive-site.xml中加入如下两个配置:

<property>
  <name>hive.cli.print.header</name>
  <value>true</value>
 </property>
  <property>
  <name>hive.cli.print.current.db</name>
  <value>true</value>
 </property>

3.3.2 Hive运行日志信息配置

1)Hive的log默认存放在/tmp/molly/hive.log目录下(当前用户名下)

2)修改hive的log存放日志到/opt/module/hive/logs

(1)修改/opt/module/hive/conf/hive-log4j2.properties.template文件名称为

hive-log4j2.properties

[molly@hadoop102 conf]$ pwd
/opt/module/hive/conf
[molly@hadoop102 conf]$ mv hive-log4j2.properties.template hive-log4j2.properties

(2)在hive-log4j.properties文件中修改log存放位置

property.hive.log.dir=/opt/module/hive/logs

3.3.3 参数配置方式

1)查看当前所有的配置信息

hive>set;

2)参数的配置三种方式

(1)配置文件方式

默认配置文件:hive-default.xml

用户自定义配置文件:hive-site.xml

注意:用户自定义配置会覆盖默认配置。另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。配置文件的设定对本机启动的所有Hive进程都有效。

(2)命令行参数方式

启动Hive时,可以在命令行添加-hiveconf param=value来设定参数。

例如:

[molly@hadoop103 hive]$ bin/hive -hiveconf mapred.reduce.tasks=10;

注意:仅对本次hive启动有效

查看参数设置:

hive (default)> set mapred.reduce.tasks;

(3)参数声明方式

可以在HQL中使用SET关键字设定参数

例如:

hive (default)> set mapred.reduce.tasks=100;

注意:仅对本次hive启动有效。

查看参数设置

hive (default)> set mapred.reduce.tasks;

上述三种设定方式的优先级依次递增。即配置文件<命令行参数<参数声明。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在会话建立以前已经完成了。

文章目录
  1. 1 Hive是什么
    1. 1.1 概念
    2. 1.2 Hive架构
  2. 2 Hive 安装
    1. 2.1 Hive安装地址
    2. 2.2 MySql安装
    3. 2.3 Hive安装部署
    4. 2.4 Hive元数据配置到MySql
      1. 2.4.1 拷贝驱动
      2. 2.4.2 配置Metastore到MySql
    5. 2.5 启动Hive
      1. 2.5.1 初始化元数据库
      2. 2.5.2 启动Hive
      3. 2.5.3 使用元数据服务的方式访问Hive
      4. 2.5.4 使用JDBC方式访问Hive
  3. 3 常用命令
    1. 3.1 Hive常用交互命令
    2. 3.2 Hive其他命令操作
    3. 3.3 Hive常见属性配置
      1. 3.3.1 hive窗口打印默认库和表头
      2. 3.3.2 Hive运行日志信息配置
      3. 3.3.3 参数配置方式