Hive数据仓库工具

一、Hive的概述;

背景:Hive起源于Facebook(一个美国的社交服务网络)。Facebook有着大量的数据,而Hadoop是一个开源的MapReduce实现,可以轻松处理大量的数据。但是MapReduce程序对于Java程序员来说比较容易写,但是对于其他语言使用者来说不太方便。此时Facebook最早地开始研发Hive,它让对Hadoop使用SQL查询(实际上SQL后台转化为了MapReduce)成为可能,那些非Java程序员也可以更方便地使用。hive最早的目的也就是为了分析处理海量的日志;

概述:hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能, Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此Hive并不能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的数据集上执行查询一般有分钟级的时间延迟;

Hive数据仓库工具_第1张图片

 

  Hive可以将sql语句转换为MapReduce任务进行运行。其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析;

 

二、Hive的体系架构;

体系架构:

1.用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。WUI是通过浏览器访问Hive;
2.Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等;
3.解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后有MapReduce调用执行;
4.Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成;

Hive数据仓库工具_第2张图片

 

Hive数据仓库工具_第3张图片

 

Hive执行请求的流程:

Hive数据仓库工具_第4张图片

 

三、探讨Hadoop全家(生态圈);

https://www.sohu.com/a/218420440_505794 ##Hadoop全家

https://www.cnblogs.com/zhangwuji/p/7594725.html ##Hadoop发展史

 

Hive数据仓库工具_第5张图片

Hive数据仓库工具_第6张图片

Hive数据仓库工具_第7张图片

 

 

四、Hive与传统数据库相比;

 由于Hive采用了SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。数据库可以用在Online的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性;

Hive数据仓库工具_第8张图片

 

五、Hive的数据模型;

概述:对于数据存储,Hive没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织Hive中的表,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。Hive中所有的数据都存储在HDFS中,存储结构主要包括数据库、文件、表和视图。Hive中包含以下数据模型:Table内部表、External Table外部表、Partition分区、Bucket桶。自行百度Hive的数据模型;

 

六、搭建Haoop 2.7.6结合hive2.3.3实现数据仓库管理;

案例环境:

系统类型

IP地址

主机名、角色

所需软件

Centos 7.4 1708 64bit

192.168.100.101

master

hadoop:namenode

hive

hadoop-2.7.6.tar.gz  

jdk-8u171-linux-x64.tar.gz

apache-hive-2.3.3-bin.tar.gz

Centos 7.4 1708 64bit

192.168.100.102

slave1

hadoop:datanode

hadoop-2.7.6.tar.gz  

jdk-8u171-linux-x64.tar.gz

Centos 7.4 1708 64bit

192.168.100.103

slave2

hadoop:datanode

hadoop-2.7.6.tar.gz  

jdk-8u171-linux-x64.tar.gz

 

案例步骤:

  • 安装hive软件程序;
  • 准备hive的元数据存储位置Mysql数据库;
  • 准备hive服务需要存储文件的目录;
  • 配置hive的配置文件;
  • 配置hive服务连接mysql数据库的驱动;
  • 初始化hive连接mysql数据库;
  • 启动并连接hive服务;
  • 学习hive中的管理操作;
  • 将文件内容导入到hive的表中;
  • 通过web页面查看HDFS文件系统中的数据;
  • 通过mysql管理控制台验证mysql中存储的hive的元数据;

 

 

  • 安装hive软件程序;

[root@master ~]# ls /root/apache-hive-2.3.3-bin.tar.gz

/root/apache-hive-2.3.3-bin.tar.gz

[root@master ~]# tar zxvf /root/apache-hive-2.3.3-bin.tar.gz

[root@master ~]# mv apache-hive-2.3.3-bin/ /usr/local/hive

[root@master ~]# chown hadoop:hadoop /usr/local/hive/ -R

[root@master ~]# vi /etc/profile

export HIVE_HOME=/usr/local/hive

export PATH=$PATH:$HIVE_HOME/bin

export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.

[root@master ~]# source /etc/profile

 

  • 准备hive的元数据存储位置Mysql数据库;

[root@master ~]# yum -y install mariadb-server mariadb

[root@master ~]# sed -i 's/\[mysqld\]/\[mysqld\]\nskip_name_resolve/g' /etc/my.cnf

##注:需要关闭mysql服务器的反向解析,不然会在初始化myssql数据库时出现反向解析情况,无法初始化

[root@master ~]# systemctl start mariadb

[root@master ~]# systemctl enable mariadb

Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.service to /usr/lib/systemd/system/mariadb.service.

[root@master ~]# mysqladmin -uroot password

[root@master ~]# mysql -uroot -p123123

MariaDB [(none)]> grant all on *.* to root@'192.168.100.101' identified by '123123';

MariaDB [(none)]> flush privileges;

MariaDB [(none)]> exit

 

  • 准备hive服务需要存储文件的目录;

[root@master ~]# su - hadoop

[hadoop@master ~]$ hadoop   fs   -mkdir   -p   /user/hive/warehouse

[hadoop@master ~]$ hadoop   fs   -chmod   777   /user/hive/warehouse

[hadoop@master ~]$ hadoop   fs   -mkdir  -p   /tmp/hive/

[hadoop@master ~]$ hadoop   fs   -chmod  777   /tmp/hive

[hadoop@master ~]$ hadoop   fs   -ls /

Found 2 items

drwxr-xr-x   - hadoop supergroup          0 2018-08-27 20:51 /tmp

drwxr-xr-x   - hadoop supergroup          0 2018-08-27 20:51 /user

[hadoop@master ~]$ mkdir /usr/local/hive/tmp

[hadoop@master ~]$ mkdir /usr/local/hive/tmp/root

 

  • 配置hive的配置文件;

[hadoop@master ~]$ cp /usr/local/hive/conf/hive-default.xml.template /usr/local/hive/conf/hive-site.xml

[hadoop@master ~]$ mv /usr/local/hive/conf/hive-env.sh.template /usr/local/hive/conf/hive-env.sh

[hadoop@master ~]$ vi /usr/local/hive/conf/hive-site.xml

 364   

 365     hive.metastore.warehouse.dir

 366     /user/hive/warehouse

 367     指定hdfs上存放hive的实体数据位置

 368   

 

  37   

  38     hive.exec.scratchdir

  39     /tmp/hive

  40     指定hdfs上存储hive的临时文件的位置

  41   

 

  73   

  74     hive.exec.local.scratchdir

  75     /usr/local/hive/tmp/root/

  76     指定hive本地服务器的本地目录

  77   

 

  78   

  79     hive.downloaded.resources.dir

  80     /usr/local/hive/tmp/${hive.session.id}_resources

  81     指定hive本地服务器的session会话文件的存储位置

  82   

 

1683   

1684     hive.querylog.location

1685     /usr/local/hive/tmp/root/

1686     指定hive本地服务器的日志文件存放位置

1687   

 

3974   

3975     hive.server2.logging.operation.log.location

3976     /usr/local/hive/tmp/root/operation_logs

3977     指定hive本地服务器的日志文件存放位置

3978   

 

 543   

 544     javax.jdo.option.ConnectionURL

 545     jdbc:mysql://192.168.100.101:3306/hive?createDatabaseIfNotExist=true

 546     指定hive的元数据所存储的mysql的ip、端口、数据库名

 550     

 551   

 

1018   

1019     javax.jdo.option.ConnectionDriverName

1020     com.mysql.jdbc.Driver

1021     指定连接mysql数据库的驱动类型

1022   

 

1043   

1044     javax.jdo.option.ConnectionUserName

1045     root

1046     指定连接mysql数据库的用户名

1047   

 

 528   

 529     javax.jdo.option.ConnectionPassword

 530     123123

 531     指定连接mysql数据库的密码

 532   

 

744   

 745     hive.metastore.schema.verification

 746     false

 747     关闭元数据的文件检查

 753     

 754   

:wq

[hadoop@master ~]$ vi /usr/local/hive/conf/hive-env.sh ##设置hive的环境变量

export  HADOOP_HOME=/usr/local/hadoop

export  HIVE_CONF_DIR=/usr/local/hive/conf

export  HIVE_AUX_JARS_PATH=/usr/local/hive/lib

:wq

 

  • 配置hive服务连接mysql数据库的驱动;

[hadoop@master ~]$ wget https://cdn.mysql.com//Downloads/Connector-J/mysql-connector-java-5.1.46.tar.gz

[hadoop@master ~]$ ls mysql-connector-java-5.1.46.tar.gz

mysql-connector-java-5.1.46.tar.gz

[hadoop@master ~]$ tar zxvf  mysql-connector-java-5.1.46.tar.gz

[hadoop@master ~]$ cp /home/hadoop/mysql-connector-java-5.1.46/mysql-connector-java-5.1.46.jar /usr/local/hive/lib/

[hadoop@master ~]$ ls /usr/local/hive/lib/mysql-connector-java-5.1.46.jar

/usr/local/hive/lib/mysql-connector-java-5.1.46.jar

 

  • 初始化hive连接mysql数据库;

[hadoop@master ~]$ /usr/local/hive/bin/schematool -dbType mysql -initSchema

如果初始化连接数据库失败,大多会是主配置文件错误,或者数据库未授权

 

Hive数据仓库工具_第9张图片

 

  • 启动并连接hive服务;

[hadoop@master ~]$ hive

hive> show databases;

OK

default

Time taken: 4.695 seconds, Fetched: 1 row(s)

 

  • 学习hive中的管理操作;

hive> show functions; ##查看可用函数

OK

!

!=

$sum0

%

&

*

+

-

/

<

<=

...

hive> desc function sum; ##查看函数详细信息

OK

sum(x) - Returns the sum of a set of numbers

Time taken: 0.006 seconds, Fetched: 1 row(s)

hive> create database linuxfan; ##创建数据库linuxfan

OK

Time taken: 0.282 seconds

hive> show databases;

OK

default

linuxfan

Time taken: 0.023 seconds, Fetched: 2 row(s)

hive> use linuxfan;

OK

Time taken: 0.025 seconds

hive> create table t1(id int,name string) row format delimited fields terminated by '\t';

##创建表并且指定字段id和字段name之间的分隔使用\t制表符;

OK

Time taken: 0.581 seconds

hive> show tables;

OK

t1

Time taken: 0.042 seconds, Fetched: 1 row(s)

hive> exit;

 

  • 将文件内容导入到hive的表中;

[hadoop@master ~]$vi ./1.txt ##001和zs之间必须手动敲tab键,不得复制粘贴

001 zs

002 ls

003 ww

004 xm

[hadoop@master ~]$ hive

hive>  load   data  local   inpath   '/home/hadoop/1.txt'   into   table  linuxfan.t1;

Loading data to table linuxfan.t1;

OK

Time taken: 6.277 seconds

hive> select * from linuxfan.t1;

OK

1 zs

2 ls

3 ww

4 xm

Time taken: 1.861 seconds, Fetched: 4 row(s)

hive> exit;

 

  • 通过web页面查看HDFS文件系统中的数据;

Hive数据仓库工具_第10张图片

 

 

Hive数据仓库工具_第11张图片

 

Hive数据仓库工具_第12张图片

 

 

  • 通过mysql管理控制台验证mysql中存储的hive的元数据;

Hive数据仓库工具_第13张图片

 

Hive数据仓库工具_第14张图片

 

 

你可能感兴趣的:(hadoop)