目录
1、什么是Hive
1)hive 简介
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
2) Hive 本质:将 HQL 转化成 MapReduce 程序
- Hive 处理的数据存储在 HDFS
- Hive 分析数据底层的实现是 MapReduce
- 执行程序运行在 Yarn 上
2、Hive的优缺点
2.1 优点
-
操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。
-
避免了去写 MapReduce,减少开发人员的学习成本。
-
Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
-
Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。
-
Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
2.2 缺点
1)Hive 的 HQL 表达能力有限
- 迭代式算法无法表达
- 数据挖掘方面不擅长,由于 MapReduce 数据处理流程的限制,效率更高的算法却无法实现。
2)Hive 的效率比较低
- Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
- Hive 调优比较困难,粒度较粗
3、Hive架构原理
-
用户接口:Client
CLI(command-line interface)、JDBC/ODBC(jdbc 访问 hive)、WEBUI(浏览器访问 hive) -
元数据:Metastore
元数据包括:表名、表所属的数据库(默认是 default)、表的拥有者、列/分区字段、 表的类型(是否是外部表)、表的数据所在目录等;实际上就是将Hive中的表和HDFS的路径做一个映射关系;默认存储在自带的 derby 数据库中,推荐使用 MySQL 存储 Metastore。 -
Hadoop
使用 HDFS 进行存储,使用 MapReduce 进行计算。 -
驱动器:Driver
(1)解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第 三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
(2)编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
(3)优化器(Query Optimizer):对逻辑执行计划进行优化。
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,就是 MR/Spark。
4、Hive和数据库比较
由于 Hive 采用了类似 SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在 Online 的应用中,但是 Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。
-
查询语言
由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉 SQL 开发的开发者可以很方便的使用 Hive 进行开发,二者比较相似。 -
数据更新
由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少的。因此,Hive 中不建议对数据的改写,所有的数据都是在加载的时候确定好的。而数据库中的数据通常是需要经常进行修改的。 -
执行延迟
Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。 当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。 -
数据规模
由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据;数据库可以支持的数据规模较小。
5、Hive的三种部署模式
Hive 的安装模式分为 3 种,分别是嵌入模式、本地模式和远程模式。下面这对这 3 种模式进行介绍。
(1)嵌入模式:使用内嵌的 Derby 数据库存储元数据,这种方式是 Hive 的默认安装方式,配置简单,但是同一个目录下一次只能连接一个客户端,适合用来测试,不适合生产环境。
(2)本地模式:采用外部数据库(一般是 MySQL) 存储元数据,该模式是一个多用户的模式,运行多个客户端连接到一个数据库中。该模式一般作为公司内部同时使用 Hive。该模式不需要单独开启 Metastore 服务,因为 Hive 服务和 Metastore 服务运行在同一个进程中,MySQL 是单独的进程,可以与 Hive 在同一台机器上,也可以在远程机器上。
(3)远程模式:此模式应用于 Hive 客户端较多的情况。与本地模式一样,远程模式也是采用外部数据库(一般是 MySQL)存储元数据。不同的是,远程模式需要单独开启 Metastore 服务,然后每个客户端都在配置文件中配置连接该 Metastore 服务。远程模式中,Metastore 服务和 Hive 运行在不同的进程中。
【本地模式没有单独开启服务和端口,其他第三方框架等无法访问;而远程模式有单独服务和端口,可以访问。】
6、Hive的部署
Hive没有集群的概念,实际上就是一个对HDFS数据进行处理的一个客户端。
准备hive、Linux版的mysql、mysql-connector,这里所使用的版本如下:
apache-hive-3.1.2-bin.tar.gz
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
mysql-connector-java-5.1.37-bin.jar
链接:https://pan.baidu.com/s/1Q7tjHrX4uP2dVckd52pjUA
提取码:5tmi
注意:使用mysql储存Metastore,所以Hive将要访问mysql,Hive需要有mysql-connector驱动,此时Hive也可以看作是一个访问mysql的客户端。
6.1 Hive嵌入模式部署
-
解压hive
tar -zxvf /opt/software/apache-hive-3.1.2- bin.tar.gz -C /opt/module/
-
修改名字
mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive-3.1.2
-
添加环境变量
sudo vim /etc/profile
在c中添加hive的所在路径
-
更新/etc/profile文件
source /etc/profile
-
解决日志 Jar 包冲突
实际上是将一个文件进行改名mv $HIVE_HOME/lib/log4j-slf4j-impl-2.10.0.jar $HIVE_HOME/lib/log4j-slf4j-impl-2.6.2.bak
-
初始化元数据库
默认的就是derbybin/schematool -dbType derby -initSchema
自此初始化完成,现在可以进行使用Hive。 -
启动并使用 Hive
先简单介绍下hive中的bin目录
注:hive是依赖于HDFS的,所以启动hive前,请先启动HDFS集群和yearn集群bin/hive
启动成功
顺便再说下:hive默认的存放log日志的目录是 /tem/userNamer,userName表示你登入hive所用的用户名。当启动hive失败时可以通过查看log寻找错误。使用hive
6.2 Hive本地模式部署
虽然hive已经可以正常使用,但derby仅支持单用户使用。下面进行mysql的安装和用mysql存放metastone。
-
hive文件配置
将之前的mysql-connector复制到hive的lib目录下;在conf目录下创建一个hive-site.xml文件一边配置。
将下列信息写入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>000000</value> </property> <!-- Hive 默认在 HDFS 的工作目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <!-- 当前库 和表信息 --> <property> <name>hive.cli.print.header</name> <value>true</value> </property> <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> <!-- Hive 元数据存储版本的验证 默认对derby数据库进行验证--> <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>
hive.metastore.schema.verification
:强制metastore的schema一致性,开启的话会校验在metastore中存储的信息的版本和hive的jar包中的版本一致性,并且关闭自动schema迁移,用户必须手动的升级hive并且迁移schema,关闭的话只会在版本不一致时给出警告,默认是false不开启; -
mysql解压
tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
-
查看当前是否安装过mysql
rpm -qa|grep mariadb
若有,删除sudo rpm -e --nodeps mariadb-libs
-
安装服务
将刚刚解压得到的部分压缩包进行安装sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
mysql-community-common (服务器和客户端库的公共文件);
mysql-community-libs(MySQL 数据库客户端应用程序的共享库);
mysql-community-libs-compat(MySQL 之前版本的共享兼容库);
mysql-community-client(MySQL 客户端应用程序和工具);
mysql-community-server(数据库服务器和相关工具)。
-
删除/etc/my.cnf 文件(mysql的配置信息)中 datadir 指向的目录下的所有内容
datadir指向的目录实际上是mysql存放数据的地方
由于是新装的mysql,所以里面没有内容
-
初始化mysql和查看mysql临时产生的密码
sudo mysqld --initialize --user=mysql sudo cat /var/log/mysqld.log
-
登入mysql和修改密码
注:mysql是开机自启的,所以第一次开启之后,以后不需要再次手动启动。 -
修改 mysql 库下的 user 表中的 root 用户允许任意 ip 连接
当前只能本机的root用户可以连接mysql,这明显是不行,其他的主机也要能够连接mysql。对root用户的Host进行修改。update mysql.user set host='%' where user='root'; flush privileges;
-
mysql下建立metastore数据库和初始化hive
注:创建的元数据库名字要和前面hive配置的数据库名字要一致。 -
修改hive的log日志地址
hive的log日志默认地址是 /tmp/userName/hive.log,当磁盘空间不足时/tmp中的数据会被优先删除,安全性不高。在conf目录中
- 将hive-log4j2.properties.template文件改名为hive-log4j2.properties
mv hive-log4j2.properties.template hive-log4j2.properties
- 在hive-log4j2.properties 文件中修改 log 存放位置
hive.log.dir=/opt/module/hive/logs
到此,部署完成。
6.3 Hive远程模式部署
将hive中的相关进程比如hiveserver2或者metastore这样的进程单独开启,使用客户端工具或者命令行进行远程连接这样的服务,即远程模式。客户端可以在任何机器上,只要连接到这个server,就可以进行操作。客户端可以不需要密码。
-
metastore(元数据)服务
在hive-site.xml 文件中再添加如下配置信息
<!-- 指定存储元数据要连接的地址 --> <property> <name>hive.metastore.uris</name> <value>thrift://hadoop102:9083</value> </property>
thrift:协议名称
hadoop102:metastore服务所在的主机ip地址
9083:默认端口号启动服务
1. 此服务才是真正连接元数据库的服务进程 2. 也可以让远程客户端连接 3. 启动方式: 方法1: - hive --service metastore & 方法2: - hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。
客户端访问
【为了方便,只进行了命令行连接】bin/hive
-
hiveserver2服务
Hiveserver2服务 依赖于 metastore服务 ,所以前面的 metastore服务必须先启动
在hive-site.xml 文件中再添加如下配置信息<!-- 指定 hiveserver2 连接的 host --> <property> <name>hive.server2.thrift.bind.host</name> <value>hadoop102</value> </property> <!-- 指定 hiveserver2 连接的端口号 --> <property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
启动服务
1. 该服务端口号默认是10000 2. 可以单独启动此服务进程,供远程客户端连接;此服务内置metastore服务。 3. 启动方式: 方法1: 直接调用hiveserver2。会进入监听状态不退出。 方法2: hive --service hiveserver2 & 进入后台启动 方法3: hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。
客户端访问
【为了方便,只进行了命令行连接】
方式1: step1. beeline 回车 step2. !connect jdbc:hive2://ip:10000 回车 step3. 输入用户名 回车 step4. 输入密码 回车 方法2(直连): 1. beeline -u jdbc:hive2://ip:10000 -n 用户名 解析: hive2,是hive的协议名称 ip: hiveserver2服务所在的主机IP。 10000,是hiveserver2的端口号