分布式数据仓库 Hive

  • 7.1 Hive 概述
  • 7.1.1 Hive 的定义
  • 7.1.2 Hive 的设计特征
  • 7.1.3 Hive 的体系结构
  • 7.2 Hive 的伪分布式安装
  • 7.2.1 安装 Hive 的前提条件
  • 7.2.2 解压并配置环境变量
  • 7.2.3 安装MySQL
  • 7.2.4 配置Hive
  • 7.2.5 验证 Hive
  • 7.3 Hive QL 的基础功能
  • 7.3.1 操作数据库
  • 7.3.2 创建表
  • 7.3.3 数据准备


7.1 Hive 概述

Hive 基于Hadoop

OLAP
OLTP

7.1.1 Hive 的定义

  1. Hive是基于Hadoop的一个数据仓库工具,将结构化数据文件映射为一张数据库表,提供简单的SQL查询功能,将SQL语句转化为MapReduce任务进行运行,适合数据仓库的统计分析。
  2. Hive的最佳使用场合是大数据集的批处理作业
  3. Hive用来进行数据提取转化加载,定义了简单的类SQL查询语言(Hive QL,简称HQL)

7.1.2 Hive 的设计特征

Hive不支持对数据的改写和添加,特点如下:

  1. 不同的存储类型,例如纯文本文件、HBase中的文件;
  2. 将元数据保存在关系数据库中,可大大减少在查询过程中执行语义检查的时间;
  3. 直接使用存储在Hadoop文件系统中的数据;
  4. 内置大量函数,支持用户扩展UDF函数来完成内置函数无法实现的操作
  5. 类SQL的查询方式,将SQL查询转化为MapReduce的job在Hadoop集群上执行

hive能从es取数据吗_hdfs

7.1.3 Hive 的体系结构

  1. USER INTERFACES
    用户接口
  2. Hive QL Process Engine
    Hive QL 处理引擎
  3. Meta Store
    元存储
  4. Execution Engine
    执行引擎
  5. HDFS or HBase Data Storage
    HDFS或HBase数据存储

7.2 Hive 的伪分布式安装

7.2.1 安装 Hive 的前提条件

  • Hadoop已经安装并成功启动
    *注意 Hive的版本和Hadoop的版本必须匹配
jps  //查看hadoop的进程

hive能从es取数据吗_hadoop_02

7.2.2 解压并配置环境变量

1.解压

tar -xvf apache-hive-2.3.7-bin.tar.gz

2.配置环境变量

mv apache-hive-2.3.7-bin /usr/hadoop/hive-2.3.7

vi /etc/profile
export HIVE_HOME=/usr/hadoop/hive-2.3.7
export PATH=$PATH:$HIVE_HONE/bin

3.使环境变量立即生效

source /etc/profile

7.2.3 安装MySQL

  • 修改hive的存储引擎为MySQL
    由于MySQL采用在线安装,所以必须先要配置谷歌域名服务器
vi  /etc/resolv.conf
// 添加  nameserver 8.8.8.8   nameserver 8.8.4.4

1.下载MySQL源安装包

wget -i -c http://dev.mysql.com/get/mysql157-community-release-e17-10.noarch.rmp

2.安装MySQL源

yum -y install mysql157-community-release-e17-10.noarch.rmp

安装MySQL

yum -y install mysql-community-server

4.启动MySQL服务

systemctl start mysqld.service

5.设为开机启动

systemctl enable mysqld
systemctl daemon-reload

6.修改root本地登录密码

grep 'temporary password'  /var/log/mysqld.log
// 登录修改密码
mysql -uroot -p

hive能从es取数据吗_hive_03


hive能从es取数据吗_大数据_04

密码简单会提示错误error MySQL完整的初始密码规则可以通过如下命令查看:

mysql> SHOW VARIABLES LIKE 'validate_password%';

hive能从es取数据吗_hdfs_05

初始情况下第一个的值是ON,validate_password_length是8。可以通过如下命令修改:

mysql> set global validate_password_policy=0;
mysql> set global validate_password_length=1;

hive能从es取数据吗_hive能从es取数据吗_06

此时密码就可以设置的很简单,例如1234之类的。到此数据库的密码设置就完成了。

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

hive能从es取数据吗_hive能从es取数据吗_07

但此时还有一个问题,就是因为安装了Yum Repository,以后每次yum操作都会自动更新,需要把这个卸载掉:

[root@localhost ~]# yum -y remove mysql57-community-release-el7-10.noarch

hive能从es取数据吗_hive能从es取数据吗_08

7.创建用户

mysql> create user 'hive1'@'%' identified by 'Lang1210!!';

hive能从es取数据吗_hive_09

8.授权

mysql>grant all privileges on  *.* to 'hive1'@'%' identified by 'Lang1210!!';

hive能从es取数据吗_hadoop_10


允许远程连接到MySQL

mysql>grant all privileges on  *.* to 'root'@'%' identified by 'Lang1210!!';

hive能从es取数据吗_hive_11

9.刷新权限

mysql>flush privileges;

hive能从es取数据吗_hive能从es取数据吗_12

10.配置默认密码
修改 /etc/my.cnf 配置文件,在[mysqld]下添加编码配置

[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'

hive能从es取数据吗_大数据_13

11.重新启动MySQL服务

systemctl restart mysqld

hive能从es取数据吗_hadoop_14

以上步骤完成则MySQL安装完成

7.2.4 配置Hive


切换到hive的配置目录 /usr/hadoop/hive-2.3.7/conf 将hive-env.sh.template 重命名为 hive-env.sh ,将 hive-default.xml.template 重命名为 hive-site.xml

mv hive-env.sh.template hive-env.sh 
mv hive-default.xml.template hive-site.xml

hive能从es取数据吗_hive能从es取数据吗_15


hive能从es取数据吗_hive_16

1.配置 $HIVE_HOME/bin 的 hive-config.sh

export JAVA_HOME=/usr/java
 export HADOOP_HOME=/usr/hadoop/hadoop-2.10.0
 export HIVE_HOME=/usr/hadoop/hive-2.3.7

hive能从es取数据吗_大数据_17

2.复制MySQL驱动
下载MySQL的JDBC驱动包 mysql-cnnector-Java-5.1.45-bin.jar 并复制移动到$HIVE_HOME/bin 目录下

cp  mysql-connector-Java-5.1.23-bin.jar  /usr/hadoop/hive-2.3.7/lib/

hive能从es取数据吗_hive能从es取数据吗_18


hive能从es取数据吗_hadoop_19

3.$在HIVE_HOME/ 下新建tmp临时目录

mkdir /usr/hadoop/hive-2.3.7/tmp

hive能从es取数据吗_hive能从es取数据吗_20

4.配置$HIVE_HOME/conf的 hive-site.xml 支持MySQL
修改 ConnectionURL、ConnectionDriverName、ConnectionUserName、ConnectionPassword 4个属性

// j将默认Derby数据库的连接配置改成MySQL数据库的连接配置,具体配置如下。
<property>
	<name>Javax.jdo.option.ConnectionURL</name>
	<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true</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>Lang1210!!</value>
</property>

hive能从es取数据吗_hive能从es取数据吗_21


5.配置$HIVE_HOME/conf的hive-site.xml

替换全部的 ${system:Java.io.tmpdir} 为 /usr/hadoop/hive/tmp

共4处

hive能从es取数据吗_hadoop_22


hive能从es取数据吗_大数据_23

配置$HIVE_HOME/conf的hive-site.xml 替换全部的 ${system:user.name} 为 root

共3处

hive能从es取数据吗_大数据_24


hive能从es取数据吗_hdfs_25

7.2.5 验证 Hive

1. 数据库初始化

schematool -dbType mysql -initScheam

hive能从es取数据吗_hadoop_26

2.启动 Hive 客户端

shell# hive   //启动Hive客户端命令工具

hive能从es取数据吗_hive_27


3.输入 show databases

hive>show databases;

hive能从es取数据吗_hive_28

4.输入 show tables

hive>show tables;

hive能从es取数据吗_hadoop_29

7.3 Hive QL 的基础功能

7.3.1 操作数据库

使用 Hive QL 创建、显示、打开、删除数据库

hive>create database student;
// 查看database 信息
hive>describe database lang; or hive>desc database lang

hive能从es取数据吗_hdfs_30

新建的数据库在HDFS上的存储路径为与hdfs://master:9000/user/hive/warehose/student.db目录 改变默认数据库命令

hive>use student;
//删除数据库
hive>drop database student;
//再重新创建数据库
create databae student;

hive能从es取数据吗_hive能从es取数据吗_31

7.3.2 创建表

hive> use student

hive> create table emp (ename string, deptid int,degree int)
row format delimited fields terminated by '|';

hive能从es取数据吗_hdfs_32

hive>load data local inpath '/usr/hadoop/hive-2.3.7/examples/files/emp.txt' into table emp;

hive能从es取数据吗_hadoop_33

hive>create table dept (deptid int,dname string) row format  delimited fields terminated by '|';

hive能从es取数据吗_hive_34

hive>load data local inpath '/usr/hadoop/hive-2.3.7/examples/files/dept.txt' into table dept;

hive能从es取数据吗_大数据_35

查看表

hive>show tables;
//or
hive>show tables in lang;
//or
hive>show tables 'em*'

hive能从es取数据吗_hive_36

查看表结构

hive>describe student.emp;
// or
hive>desc student.emp
//查看数据库苦
hive>show databases;
//查看数据库信息
hive>describe database student;
//or
desc database student;

hive能从es取数据吗_hdfs_37

进一步使用hadoop fs 命令查看

hadoop fs -ls -R hdfs://master:9000/user/hive/warehouse/student.db
//or
hadoop fs -ls -R hdfs://master:9000/user/hive/warehouse

hive能从es取数据吗_大数据_38

7.3.3 数据准备

家在数据,local 表示本机目录,如果不加则表示是HDSF上的目录 overwrite 关键字表示删除目标目录,没有时则保留,但会覆盖同名旧目录

hive>load data local inpath '/usr/hadoop/hive-2.3.7/examples/files/dept.txt' into table dept;
hive>load data local inpath '/usr/hadoop/hive-2.3.7/examples/files/dept.txt' into table dept;

hive能从es取数据吗_hive能从es取数据吗_39


连续执行多次加载数据操作,结果如下

hive能从es取数据吗_大数据_40


发现数据重复

用overwrite 第三次重新加载数据

load data local inpath '/usr/hadoop/hive-2.3.7/examples/files/dept.txt' overwrite into table dept;

hive能从es取数据吗_hive能从es取数据吗_41


结果发现重复数据会删除

hive能从es取数据吗_大数据_42


接下来我们创建一个与dept结构一样的表dept2

create table dept2 (deptid int,dname string) row format  delimited fields terminated by '|';

hive能从es取数据吗_hive_43


将dept的数据导入dept2

查看dept2中的数据

再次将dept 的数据导入到dept2

查看dept2中的数据

发现数据重复