05 分布式数据仓库Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行。
其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
1. Hive概述
Hive最初是由Facebook开发的,后来由Apache软件基金会开发,并作为Apache的一个顶级开源项目。Hive基于Hadoop,专为联机分析处理(On-LineAnalytical Processing,OLAP)设计,但由于Hadoop MapReduce并不实时,所以Hive并不适合联机事务处理(On-Line Transaction Processing,OLTP)业务。Hive的最佳使用场合是大数据集的批处理作业。本节对Hive的定义、设计特征、体系结构进行基本阐述。
2. Hive的定义
Hive是建立在Hadoop上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(Extract-Transform-Load,ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive定义了简单的类SQL查询语言,称为Hive QL,简称HQL,它允许熟悉SQL的用户查询数据。同时,这个语言也允许熟悉MapReduce的开发者开发自定义的Mapper和Reducer程序来处理内建的Mapper和Reducer无法完成的复杂的分析工作。Hive没有专门的数据格式,可以很好地工作在Thrift之上。
3. Hive的设计特征
Hive是一种底层封装了Hadoop的数据仓库处理工具,使用类SQL的Hive QL语言实现数据查询,所有Hive的数据都存储在Hadoop兼容的文件系统(例如AmazonS3、HDFS)中。Hive在加载数据过程中不会对数据进行任何的修改,只是将数据移动到HDFS中Hive设定的目录下,因此,Hive不支持对数据的改写和添加,所有的数据都是在加载时确定的。
Hive的设计特点如下。
- 不同的存储类型,例如纯文本文件、HBase中的文件。
- 将元数据保存在关系数据库中,可大大减少在查询过程中执行语义检查的时间。
- 可以直接使用存储在Hadoop文件系统中的数据。
- 内置大量函数来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF函数来完成内置函数无法实现的操作。
- 类SQL的查询方式,将SQL查询转换为MapReduce的Job在Hadoop集群上执行。
4. Hive伪分布式安装
- 下载、上传、解压
tar -zxvf apache-hive-2.3.3-bin.tar.gz
mv apache-hive-2.3.3-bin hive
- 配置环境变量
vim /etc/profile
export HIVE_HOME=/usr/local/hive
#在PATH后面添加
:$HIVE_HOME/bin
source /etc/profile
5. 安装MySQL
Hive默认使用内嵌的Derby数据库作为存储引擎,存储Hive的元数据信息,但Derby引擎的缺点是一次只能打开一个会话,不能多用户并发访问。所以需要安装MySQL,并将Hive的存储引擎改为MySQL。由于MySQL采用在线安装,所以必须先要配置谷歌域名服务器。
vim /etc/resolv.conf
# 添加
nameserver 8.8.8.8#谷歌域名服务器
nameserver 8.8.4.4#谷歌域名服务器
# 在线安装MySQL
wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum localinstall mysql57-community-release-el7-7.noarch.rpm
yum install mysql-community-server
6. 启动MySQL服务
systemctl start mysqld
# 设置开机自启
systemctl enable mysqld
systemctl daemon-reload
7. 修改root本地登录密码
注意:MySQL老版本默认密码为空,可以跳过查看默认密码步骤。MySQL 5.7安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码,登录MySQL进行修改。
grep 'temporary password' /var/log/mysqld.log
[root@hadoop0 local]# grep 'temporary password' /var/log/mysqld.log
2021-01-15T08:31:49.794573Z 1 [Note] A temporary password is generated for root@localhost: vgez9deYd:dH
# 登陆mysql
mysql -uroot -p
# 输入生成的密码vgez9deYd:dH,然后修改
alter user 'root'@'localhost' identified by 'Hadoop0!!';
MySQL 5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含大小写字母、数字和特殊符号,并且长度不能少于7位,否则会提示
ERROR 1819(HY000): Your password does not satisfy the currentpolicy requirements错误。
8. 授权
-- @后面是访问MySQL的客户端IP地址(或者是主机名),
-- %代表任意的客户端,如果后面填写localhost代表本地
grant all privileges on *.* to 'hive1'@'%' identified by 'Hadoop0!!';
-- 允许远程连接MySQL
grant all privileges on *.* to 'root'@'%' identified by 'Hadoop0!!';
9. 刷新权限
flush privileges;
10. 配置默认编码
vim /etc/my.cnf
# 在[mysqld]下添加
character_set_server=utf8
init_connect='SET NAMES utf8'
systemctl restart mysqld
11. 配置Hive
- 切换到
/usr/local/hive/conf
目录,分别重命名配置模板文件hive-env.sh.template
重命名为hive-env.sh
mv hive-env.sh.template hive-env.sh
- `hive-default.xml.template`重命名为`hive-site.xml`
mv hive-default.xml.template hive-site.xml
- 配置
$HIVE_HOME/bin
的hive-config.sh
cd /usr/local/hive/bin
vim hive-config.sh
# 在最后一行加入配置,明确Java、Hadoop、Hive的安装目录
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export HIVE_HOME=/usr/local/hive
- 复制MySQL驱动到
/usr/local/hive/lib
目录下 - 在
$HIVE_HOME
目录下新建临时目录tmpmkdir /usr/local/hive/tmp
- 配置conf目录下的
hive-site.xml
支持MySQL(使用ctrl+f搜索需要更改的属性)
<property>
<name>Javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property
<property>
<name>Javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property
<property>
<name>Javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property
<property>
<name>Javax.jdo.option.ConnectionPassword</name>
<value>Hadoop0!!</value>
</property
- 替换全部的
${system:Java.io.tmpdir}
为/usr/local/hive/tmp
,共4处 - 替换全部的
${system:user.name}
为root,共3处
12 启动Hive客户端
hive
show tables;
错误分析:
- 如果初始化失败,查看MySQL中是否存在hive的database,如果有,删除,然后重新初始化