学习目标

理解数仓概念、起源由来

理解数仓(OLAP)与数据库(OLTP)区别

掌握数仓分层架构思想

掌握Apache Hive功能与架构组件

理解Apache Hive远程模式部署安装

内容大纲

#数据仓库基础核心知识

1、数据仓库是什么 为何而来?

为了分析数据而来 数据分析的平台

2、数据仓库的特性

3、数据仓库和数据库的区别

OLTP系统

OLAP系统

注意:这里要解决一个核心的误区:数仓绝不是大型数据库。 这么理解就凉凉

4、数据仓库的分层架构

根据数据流入流出特点 进行分层

5、ETL、ELT区别

#大数据最著名的数仓软件--Apache Hive

1、Hive是什么?

基于Hadoop的数仓 如何理解和Hadoop关系?

核心功能:

a、将结构化文件映射成为一张表(Table)

b、基于表提供了SQL分析能力 (Hive SQL HQL,类SQL)

本质:用户HQL--->Hive转换MR--->数据分析

2、Hive的架构组件

3、Hive的安装部署

metadata metastore区别

三种部署模式

课程使用远程模式部署安装

两代客户端使用

IDEA、PyCharm集成操作Hive

4、Hive的初体验

Hive的魅力是什么

01_数据仓库 概念定位、起源由来

(1)数据仓库,中文简称数仓。英文叫做Data WareHouse,简称DW。

(2)数据仓库是面向分析的集成化数据平台,分析的结果给企业提供决策支持; (3)数据仓库本身不生产数据;

其分析的数据来自于企业各种数据源。

企业中常见的数据源:

RDBMS关系型数据库--->业务数据

log file----->日志文件数据

爬虫数据

其他数据

(4)数据仓库本身也不消费数据;

其分析的结果给外部各种数据应用(Data application)来使用。

Data visualization(DV)数据可视化

Data Report 数据报表

Data Mining(DM) 数据挖掘

Ad-Hoc 即席查询

即席查询(Ad Hoc)是用户根据自己的需求,灵活的选择查询条件,系统能够根据用户的选择生成相应的统计报表。即席查询与普通应用查询最大的不同是普通的应用查询是定制开发的,而即席查询是由用户自定义查询条件的。

(5)企业中一般先有数据库,然后有数据仓库,可以没有数据仓库,但是不能没有数据库。

(6)数据仓库不是大型的数据库,只是一个数据分析的平台。

02_数据仓库 四大核心特征

(1)面向主题性(Subject-Oriented)

主题(subject)是一个抽象的概念 数据综合体。一个分析的主题可以对应多个数据源。

在数仓中开展分析,首先确定分析的主题,然后基于主题寻找、采集跟主题相关的数据。

(2)集成性(Integrated)

数仓不是生成数据的平台 其数据来自于各个不同的数据源

当我们确定主题之后 就需要把和主题相关的数据从各个数据源集成过来。

因为同一个主题的数据可能来自不同的数据源 它们之间会存在着差异(异构数据):字段同名不同意、单位不统一、编码不统一;

因此在集成的过程中需要进行ETL(Extract抽取 Transform转换 load加载)

(3)不可更新性(Non-Volatile)

数仓上面的数据几乎没有修改操作,都是分析的操作。

数仓是分析数据规律的平台 不是创造数据规律的平台。

注意:改指的数据之间的规律不能修改。

当下发现有些时间也是需要修改的 数据校正。数据缓慢变化。

#当下所学的侧重于离线数据 分析的数据都是历史数据 过去的数据 t+1 t+7

#后面还会接触实时数仓 kafka+flink

(4)时变性(Time-Variant)

数仓是一个持续维护建设的东西。

站在时间的角度,数仓的数据成批次变化更新。一天一分析(T+1) 一周一分析(T+7)

上述所讲的更多偏向于离线数仓,当下还有比较火的实时数仓。

03_数据仓库 OLTP、OLAP区别

数据库和数据仓库的区别本质的区别就是OLTP 和OLAP系统的区别

OLTP 联机事务处理(On-Line Transaction Processing) Transaction 事务 面向事务支持事务

OLTP系统注重的是数据安全、完整、响应效率。通常指的就是RDBMS关系型数据库。

#面向事务 支持事务

#RDBMS: MySQL ORACLE

#注意 不是NoSQL数据库 没有事务支持: Redis HBase

OLAP 联机分析处理(On-Line Analytical Processing) 中文发音:欧莱普 Analytical 分析 面向分析支持分析

主要指的是数据仓库、数据集市(小型数据仓库):Apache Hive、Apache Impala

注意:在某些场合下,说ORACLE也是OLAP系统,如何理解? 如果把RDBMS只用作数据分析工作,就是OLAP系统。

数据仓库不是大型的数据库,也没有要取代数据库的目标,只是一个数据分析的平台。

04_数据仓库 数仓分层架构(ODS、DW、DA)

1)数仓本身不生产数据也不消费数据,按照数据流入流出的特点,对平台进行分层

2)最基础最核心的3层架构,企业实际应用中,可以结合需要添加不同分层。

3)核心3层架构

(1)ODS 操作型数据层、源数据层、临时存储层

其数据来自于各个不同的数据源 临时存储 和数据源解耦合 之间有差异 一般不直接用于分析

(2)DW 数据仓库

其数据来自于ODS经过层层的ETL变成各种模型的数据 数据干净规则 统一

基于各种模型开展各种分析

企业中根据业务复杂度 继续在DW中继续划分子层。 存储大量的中间结果。其数据来自于ODS经过层层ETL得出 企业中可以根据需求在DW中继续分层。

(3)DA 数据应用层

最终消费DW数据的各种应用。

4)分层好处

(1)清晰数据结构:每一个数据分层都有它的作用域,在使用表的时候能更方便地定位和理解

(2)数据血缘追踪:简单来说,我们最终给业务呈现的是一个能直接使用业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围

(3)减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算

(4)把复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复

(5)屏蔽原始数据的异常:屏蔽业务的影响,不必改一次业务就需要重新接入数据

05_数据仓库 案例:数仓建设实践

https://tech.meituan.com/2017/05/26/hotel-dw-layer-topic.html

06_数据仓库 ETL、ELT区别

理论规范在实际的应用中,一定要灵活变通。不同局限于文字表面。

07_Apache Hive 概述、功能、与Hadoop关系

1)Hive是Facebook开源出来,后来贡献给力Apache。宗旨是:提高分析数据的能力降低分析数据的开发成本。

2)Hive是基于 Hadoop 的一个数据仓库工具,用于分析数据的。

为什么说Hive是基于Hadoop的呢?

#作为一款数据仓库软件,应该要具备哪些能力?

具备存储数据的能力

具备分析数据的能力

Hive作为数仓软件,当然具备上述两种能力?

#Hive使用Hadoop HDFS作为数据存储系统

#Hive使用Hadoop MapReduce来分析数据

基于此说Hive是基于Hadoop的数仓软件。

3)在此过程中,Hive做了什么?其最大的魅力在哪里?

可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能。

结构化数据:具有schema约束的数据 便于程序解读解析

映射 y=2X+1 当x=1 y=3 映射表示的就是一种对应关系。

映射成为表之后 提供了类SQl查询分析功能。 SQL叫做声明式编程,程序员不用关系过程,利于数据分析。

08_Apache Hive 如何模拟实现Hive的实现

09_Apache Hive 架构、组件、与MySQL的差异

9.1 Hive的架构组件

(1)客户端用户接口

所谓的客户端指的是给用户一种方式编写Hive SQL

目前常见的客户端:CLI(命令行接口 shell)、Web UI、JDBC|ODBC

(2)Hive Driver驱动程序

hive的核心

完成从接受HQL到编译成为MR程序的过程。

sql解释 编译 校验 优化 制定计划

(3)metadata

元数据存储。 描述性数据。

对于hive来说,元数据指的是表和文件之间的映射关系。

(4)Hadoop

HDFS 存储文件

MapReduce 计算数据

YARN 程序运行的资源分配

【附】Q:Hive是分布式的软件吗?

Hive不是分布式软件。只需要在一台机器上部署Hive服务即可;

Hive的分布式处理能力是借于Hadoop完成的。HDFS分布式存储 MapReduce分布式计算。

9.2 Hive和Mysql的区别

(1)从外表、形式模型、语法各层面上看 ,hive和数据库(Mysql)很类似

(2)底层应用场景是完全不一样的

(3)hive属于olap系统 是面向分析的侧重于数据分析(select)

(4)数据库属于oltp系统 是面向事务的 侧重于数据时间交互(CRUD)

(5)Hive绝不是大型数据库 也不是为了要取代MySQL这样的数据库

10_Apache Hive metadata、metastore

#Metadata 元数据

对于hive来说,元数据主要指的是表和文件之间的映射关系。

元数据也是数据,存储在哪里呢?Hive当下支持两种地方存储元数据。

1、存储在Hive内置的RDBSM中,Apache Derby(内存级别轻量级关系型数据库)

2、存储在外界第三方的RDBMS中,比如:MySQL。 企业中常用的方式。

#metastore 元数据访问服务

专门用于操作访问metadata的一种服务,对外暴露服务地址给各个不同的客户端使用访问Hive的元数据。

并且某种程度上保证了metadata的安全。

11_Apache Hive 3种部署模式(推荐掌握远程模式)

11.1 如何区别,关键在于两个问题?

metadata元数据是存储在哪里的?内置derby还是外置的Mysqlmetastore服务是否需要单独配置,单独手动启动?

11.2 具体来说

11.2.1 内嵌模式

(1)元数据存储在内置的derby

(2)不需要单独配置metastore 也不需要单独启动metastore服务

(3)安装包解压即可使用。

(4)适合测试体验。实际生产中没人用。适合单机单人使用。

11.2.2 本地模式

(1)元数据使用外置的RDBMS,常见使用最多的是MySQL。

(2)不需要单独配置metastore 也不需要单独启动metastore服务

11.2.3 远程模式

(1)元数据使用外置的RDBMS,常见使用最多的是MySQL。

(2)metastore服务单独配置 单独手动启动 全局唯一。

(3)这样的话各个客户端只能通过这一个metastore服务访问Hive

(4)企业生产环境中使用的模式,支持多客户端远程并发操作访问Hive 也是我们课程中使用的模式。

11.3 对比

metadata存储在哪metastore服务如何内嵌模式Derby不需要配置启动本地模式MySQL不需要配置启动远程模式MySQL单独配置、单独启动

12_Apache Hive 远程模式安装部署 基础环境、与Hadoop整合

安装参考手册:

Python+大数据:hadoop离线阶段\05–数据仓库、Apache Hive\2、软件\hive 3.1.2\Hive3安装.md

(1)安装Hadoop

启动hive之前,需要保证Hadoop启动且服务正常可用。想一下,什么叫做可用?

1、等待安全模式结束启动Hive

2、在Hadoop中设置用户代理,注意3台机器都需要修改,重启生效

vim etc/hadoop/core-site.xml

hadoop.proxyuser.root.hosts

*

hadoop.proxyuser.root.groups

*

(2)安装MySQL

Linux课程阶段安装的MySQL即可。

主要考虑的就是MySQL Hive版本的兼容性 和jdbc驱动版本

在Centos7环境下如何安装MySQL

13_Apache Hive 远程模式安装部署 配置文件与初始化

(1)安装Hive (选择node1安装)

#apache-hive-3.1.2-bin.tar.gz

上传、解压

tar zxvf apache-hive-3.1.2-bin.tar.gz

【附】解决Hive与Hadoop之间guava版本差异

cd /export/server/apache-hive-3.1.2-bin/

rm -rf lib/guava-19.0.jar

cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar ./lib/

(2)hive-env.sh

cd /export/server/apache-hive-3.1.2-bin/conf

mv hive-env.sh.template hive-env.sh

vim hive-env.sh

export HADOOP_HOME=/export/server/hadoop-3.3.0

export HIVE_CONF_DIR=/export/server/apache-hive-3.1.2-bin/conf

export HIVE_AUX_JARS_PATH=/export/server/apache-hive-3.1.2-bin/lib

(3)hive-site.xml

vim hive-site.xml

javax.jdo.option.ConnectionURL

jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8

javax.jdo.option.ConnectionDriverName

com.mysql.jdbc.Driver

javax.jdo.option.ConnectionUserName

root

javax.jdo.option.ConnectionPassword

hadoop

hive.server2.thrift.bind.host

node1

hive.metastore.uris

thrift://node1:9083

hive.metastore.event.db.notification.api.auth

false

(4)上传Mysql jdbc驱动到Hive安装包的Lib目录下

mysql-connector-java-5.1.32.jar

(5)手动执行命令初始化Hive的元数据

cd /export/server/apache-hive-3.1.2-bin/

bin/schematool -initSchema -dbType mysql -verbos

#初始化成功会在mysql中创建74张表

(6)在hdfs创建hive存储目录(可选)

hadoop fs -mkdir /tmp

hadoop fs -mkdir -p /user/hive/warehouse

hadoop fs -chmod g+w /tmp

hadoop fs -chmod g+w /user/hive/warehouse

14_Apache Hive metastore服务启动、第一代客户端

14.1 metastore服务

(1)前台启动

#前台启动

/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore

#前台启动开启debug日志

/export/server/apache-hive-3.1.2-bin/bin/hive --service metastore --hiveconf hive.root.logger=DEBUG,console

#前台启动关闭方式 ctrl+c结束进程

(2)后台挂起启动

nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &

#后台挂起启动 结束进程

使用jps查看进程 使用kill -9 杀死进程

#nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下

14.2 Hive的客户端

Hive的第一代客户端

bin/hive 直接访问metastore服务 配置

hive.metastore.uris

thrift://node1:9083

弊端: 第一代客户端属于shell脚本客户端 性能友好安全方面存在不足 Hive已经不推荐使用

官方建议使用第二代客户端beeline

15_Apache Hive HS2服务启动、beeline客户端使用

Hive的第二代客户端

bin/beeline 无法访问metastore服务,只能够访问Hiveserver2服务 使用 # 拷贝node1上 hive安装包到beeline客户端机器上(node3)

scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/

#1、在安装hive的服务器上 首先启动metastore服务 再启动hiveserver2服务

nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service metastore &

nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 &

#2、在任意机器(如node3)上使用beeline客户端访问

[root@node3 ~]# /export/server/apache-hive-3.1.2-bin/bin/beeline

beeline> ! connect jdbc:hive2://node1:10000 #jdbc访问HS2服务

Connecting to jdbc:hive2://node1:10000

Enter username for jdbc:hive2://node1:10000: root #用户名 要求具备HDFS读写权限

Enter password for jdbc:hive2://node1:10000: #密码可以没有

16_Apache Hive 初体验 如何才能映射成功文件

(1)体验目标:在hive中如何才能够将一份结构化的数据文件映射成为一张表,然后使用SQL分析?

--结构化文件

1,allen,18

2,james,24

3,anna,45

--在hive中建表

create table t_1(id int,name string,age int);

(2)猜想1:只要在hive中创建表,那么在HDFS就会有一个文件夹与之对应。

(3)难道把结构化文件放置在这个目录下,才能映射成功吗? 不一定

```

/user/hive/warehouse/itcast.db/t_1

hadoop fs -put 1.txt /user/hive/warehouse/itcast.db/t_1

```

(4)猜想2:难道要指定分隔符? 不一定

```sql

create table t_1(id int,name string,age int);

create table t_2(id int,name string,age int) row format delimited fields terminated by ','; --指定分隔符为逗号

```

(5)猜想3:建表的时候字段类型要不要和文件中数据保持一致? 一定要保持一致

(6)如果不一致,hive会尝试进行转换,但是不保证成功,如果不成功显示null。

create table t_3(id int,name int,age string) row format delimited fields terminated by ',';

+---------+-----------+----------+--+

| t_3.id | t_3.name | t_3.age |

+---------+-----------+----------+--+

| 1 | NULL | 18 |

| 2 | NULL | 24 |

| 3 | NULL | 45 |

+---------+-----------+----------+--+

(7)当我们映射成功之后,会如何?

就可以基于表写Hive SQL 开展数据分析,心里美滋滋。再也不用写MapReduce。

0: jdbc:hive2://node1:10000> select * from t_2 where age >18;

+---------+-----------+----------+--+

| t_2.id | t_2.name | t_2.age |

+---------+-----------+----------+--+

| 2 | james | 24 |

| 3 | anna | 45 |

+---------+-----------+----------+--+

2 rows selected (0.722 seconds)

0: jdbc:hive2://node1:10000>

0: jdbc:hive2://node1:10000> select count(*) from t_2 where age >18;

WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.

+-----+--+

| c0 |

+-----+--+

| 2 |

+-----+--+

1 row selected (67.76 seconds)

查看原文