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伪分布式安装

  • 下载、上传、解压
  1. tar -zxvf apache-hive-2.3.3-bin.tar.gz
  2. mv apache-hive-2.3.3-bin hive
  • 配置环境变量
  1. vim /etc/profile
  2. export HIVE_HOME=/usr/local/hive
  3. #在PATH后面添加
  4. :$HIVE_HOME/bin
  5. source /etc/profile

5. 安装MySQL

Hive默认使用内嵌的Derby数据库作为存储引擎,存储Hive的元数据信息,但Derby引擎的缺点是一次只能打开一个会话,不能多用户并发访问。所以需要安装MySQL,并将Hive的存储引擎改为MySQL。由于MySQL采用在线安装,所以必须先要配置谷歌域名服务器。

  1. vim /etc/resolv.conf
  2. # 添加
  3. nameserver 8.8.8.8#谷歌域名服务器
  4. nameserver 8.8.4.4#谷歌域名服务器
  5. # 在线安装MySQL
  6. wget http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
  7. yum localinstall mysql57-community-release-el7-7.noarch.rpm
  8. yum install mysql-community-server

05 分布式数据仓库Hive - 图1

6. 启动MySQL服务

  1. systemctl start mysqld
  2. # 设置开机自启
  3. systemctl enable mysqld
  4. systemctl daemon-reload

7. 修改root本地登录密码

注意:MySQL老版本默认密码为空,可以跳过查看默认密码步骤。MySQL 5.7安装完成之后,在/var/log/mysqld.log文件中给root生成了一个默认密码,登录MySQL进行修改。

  1. grep 'temporary password' /var/log/mysqld.log
  2. [root@hadoop0 local]# grep 'temporary password' /var/log/mysqld.log
  3. 2021-01-15T08:31:49.794573Z 1 [Note] A temporary password is generated for root@localhost: vgez9deYd:dH
  4. # 登陆mysql
  5. mysql -uroot -p
  6. # 输入生成的密码vgez9deYd:dH,然后修改
  7. 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. 授权

  1. -- @后面是访问MySQL的客户端IP地址(或者是主机名),
  2. -- %代表任意的客户端,如果后面填写localhost代表本地
  3. grant all privileges on *.* to 'hive1'@'%' identified by 'Hadoop0!!';
  4. -- 允许远程连接MySQL
  5. grant all privileges on *.* to 'root'@'%' identified by 'Hadoop0!!';

9. 刷新权限

  1. flush privileges;

10. 配置默认编码

  1. vim /etc/my.cnf
  2. # 在[mysqld]下添加
  3. character_set_server=utf8
  4. init_connect='SET NAMES utf8'
  5. systemctl restart mysqld

11. 配置Hive

  • 切换到/usr/local/hive/conf目录,分别重命名配置模板文件
    • hive-env.sh.template重命名为hive-env.sh
  1. mv hive-env.sh.template hive-env.sh
  1. - `hive-default.xml.template`重命名为`hive-site.xml`
  1. mv hive-default.xml.template hive-site.xml
  • 配置$HIVE_HOME/binhive-config.sh
  1. cd /usr/local/hive/bin
  2. vim hive-config.sh
  3. # 在最后一行加入配置,明确Java、Hadoop、Hive的安装目录
  4. export JAVA_HOME=/usr/local/jdk
  5. export HADOOP_HOME=/usr/local/hadoop
  6. export HIVE_HOME=/usr/local/hive
  • 复制MySQL驱动到/usr/local/hive/lib目录下
  • $HIVE_HOME目录下新建临时目录tmp
    mkdir /usr/local/hive/tmp
  • 配置conf目录下的hive-site.xml支持MySQL(使用ctrl+f搜索需要更改的属性)
  1. <property>
  2. <name>Javax.jdo.option.ConnectionURL</name>
  3. <value>jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
  4. </property
  5. <property>
  6. <name>Javax.jdo.option.ConnectionDriverName</name>
  7. <value>com.mysql.jdbc.Driver</value>
  8. </property
  9. <property>
  10. <name>Javax.jdo.option.ConnectionUserName</name>
  11. <value>root</value>
  12. </property
  13. <property>
  14. <name>Javax.jdo.option.ConnectionPassword</name>
  15. <value>Hadoop0!!</value>
  16. </property
  • 替换全部的${system:Java.io.tmpdir}/usr/local/hive/tmp,共4处
  • 替换全部的${system:user.name}为root,共3处

12 启动Hive客户端

  1. hive
  2. show tables;

05 分布式数据仓库Hive - 图2

错误分析:

  • 如果初始化失败,查看MySQL中是否存在hive的database,如果有,删除,然后重新初始化