赞
踩
1)hive 简介
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计工具。
Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能。
2) Hive 本质:将 HQL 转化成 MapReduce 程序
2.1 优点
操作接口采用类 SQL 语法,提供快速开发的能力(简单、容易上手)。
避免了去写 MapReduce,减少开发人员的学习成本。
Hive 的执行延迟比较高,因此 Hive 常用于数据分析,对实时性要求不高的场合。
Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较 高。
Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
2.2 缺点
1)Hive 的 HQL 表达能力有限
2)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。
由于 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 进行并行计算,因此可以支持很大规模的数据;数据库可以支持的数据规模较小。
Hive 的安装模式分为 3 种,分别是嵌入模式、本地模式和远程模式。下面这对这 3 种模式进行介绍。
(1)嵌入模式:使用内嵌的 Derby 数据库存储元数据,这种方式是 Hive 的默认安装方式,配置简单,但是同一个目录下一次只能连接一个客户端,适合用来测试,不适合生产环境。
(2)本地模式:采用外部数据库(一般是 MySQL) 存储元数据,该模式是一个多用户的模式,运行多个客户端连接到一个数据库中。该模式一般作为公司内部同时使用 Hive。该模式不需要单独开启 Metastore 服务,因为 Hive 服务和 Metastore 服务运行在同一个进程中,MySQL 是单独的进程,可以与 Hive 在同一台机器上,也可以在远程机器上。
(3)远程模式:此模式应用于 Hive 客户端较多的情况。与本地模式一样,远程模式也是采用外部数据库(一般是 MySQL)存储元数据。不同的是,远程模式需要单独开启 Metastore 服务,然后每个客户端都在配置文件中配置连接该 Metastore 服务。远程模式中,Metastore 服务和 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的客户端。
解压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
初始化元数据库
默认的就是derby
bin/schematool -dbType derby -initSchema
自此初始化完成,现在可以进行使用Hive。
启动并使用 Hive
先简单介绍下hive中的bin目录
注:hive是依赖于HDFS的,所以启动hive前,请先启动HDFS集群和yearn集群
bin/hive
启动成功
顺便再说下:hive默认的存放log日志的目录是 /tem/userNamer,userName表示你登入hive所用的用户名。当启动hive失败时可以通过查看log寻找错误。
使用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目录中
mv hive-log4j2.properties.template hive-log4j2.properties
hive.log.dir=/opt/module/hive/logs
到此,部署完成。
将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的端口号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。