课堂学习笔记
讲解的是数据管理,以及数仓的定义、以及Hive的使用。Hive偏向于操作。
数据管理&数据仓库
数据文件管理真谛
- 文件管理的真谛在于方便保存和迅速提取,所有的数据文件将通过某种属性分类被很好地组织起来,放在最能方便找到的地方。
解决这个问题目前最理想的方法就是分类管理。 - 会部署一个文件服务器,来统一管理文件。这样可以对企业管理带来如下好处:
定时集中对文件进行备份;
可以统一制定文件安全访问权限策略;
可以统一进行文件服务器防病毒管理。 - ftp 文件服务
Samba 文件服务
NFS 文件服务 - FTP是一个文件传输的协议,采用 Client/Server 架构。用户可以通过各种不同的 FTP客户端程序,借助FTP协议,来连接FTP服务器,以上传或者下载文件。它使用两个连接与客户端通信。
文件管理规范
- FTP 服务进行跨部门文件共享的相关规范。以数据库数据文件导出至ftp文件服务器共享为例,目录下会存在以下3种格式文件。
1.1 接口新增数据文件
正常数据:文件类型标示_源系统数据库类型简写.源系统数据库.表名称_数据日 期_重传序号.lzo
如正常数据为:
增量(上次导出之后的新数据):
i_s.Peking.orders_20130711_000.lzo 全量(表中所有的数据): a_s.Peking.orders_20130711_000.lzo
1.2 接口控制校验文件
正常数据:增全量标示_源系统数据库类型简写.源系统数据库.表名称_数据日期 _重传序号.md5
如正常数据为:
增量:
i_s.peking.orders_20130711_000.md5 全量: a_s.peking.orders_20130711_000.md5
控制校验文件的存在意义在于标识数据的完整性校验,预防上传丢失导致其他使用者获取不完整数据。
1.3 2.3. 接口表结构文件
正常数据:增全量标示_源系统数据库类型简写.源系统数据库.表名称_数据日期 _重传序号.xml
如正常数据为:
增量:
i_s.peking.orders_20130711_000.xml 全量: a_s.peking.orders_20130711_000.xml
表结构文件存在意义在于: 便于数据的使用人员快速的了解本批次数据的大
致内容,也方便后续回头对数据进行检测时作为依照。
数据质量检测
- 数据的完整性、数据的一致性(统一的格式,数据是否符合逻辑)、准确性、及时性。
数据仓库–为什么出现数据仓库–为了分析
- 概念:数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的 目的是构建面向分析的集成化数据环境,为企业提供决策支持(Decision Support)。它出于分析性报告和决策支持目的而创建。
- 数据库是支持业务,是面向业务的。而数仓是面向分析的,不生产数据,不消耗数据。
- 四大主要特征:数据仓库是面向主题的(Subject-Oriented )、集成的(Integrated)、非 易失的(Non-Volatile)和时变的(Time-Variant )数据集合,用以支持管理 决策 。
数据仓库和数据库的区别
- 数据库与数据仓库的区别实际讲的是 OLTP 与 OLAP 的区别。
操作型处理,叫联机事务处理 OLTP(On-Line Transaction Processing,), 也可以称面向交易的处理系统,它是针对具体业务在数据库联机的日常操作,通 常对少数记录进行查询、修改。用户较为关心操作的响应时间、数据的安全性、 完整性和并发支持的用户数等问题。传统的数据库系统作为数据管理的主要手段, 主要用于操作型处理。
分析型处理,叫联机分析处理 OLAP(On-Line Analytical Processing)一 般针对某些主题的历史数据进行分析,支持管理决策。 - 首先要明白,数据仓库的出现,并不是要取代数据库。
数据库是面向事务的设计,数据仓库是面向主题设计的。
数据库一般存储业务数据,数据仓库存储的一般是历史数据。
数据库设计是尽量避免冗余,一般针对某一业务应用进行设计,比如一张简单的 User 表,记录用户名、密码等简单数据即可,符合业务应用, 但是不符合分析。数据仓库在设计是有意引入冗余,依照分析需求,分析维度、分析指标进行设计。
数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
数据仓库的分层架构
1、源数据层(ODS):此层数据无任何更改,直接沿用外围系统数据结构和数据,不对外开放;为临时存储层,是接口数据的临时存储区域,为后一步的数据处理做准备。
2、数据仓库层(DW):也称为细节层,经过ETL(抽取 Extra, 转化 Transfer, 装载 Load)的过程,DW 层的数据应该是一致的、准确的、干净的数据,即对源系统数据进行了清洗(去除了杂质)后的数据。
3、数据应用层(DA 或 APP):前端应用直接读取的数据源;根据报表、专题分析需求而计算生成的数据。
为什么要对数据仓库分层?
用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据;不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。
通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了 多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作。
数据仓库的元数据管理
- 元数据:记录数据仓库在维护过程中的点点滴滴,数据仓库的主题,数据从哪里来的,用什么工具ETL,数据当中有什么。数据当中的字段。
- 管理数据仓库的元数据目的:使数据仓库的设计、部署、操作和管理达成协同和一致。
Apache Hive
- Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为 一张数据库表,并提供类 SQL 查询功能。
- 本质是将 SQL 转换为 MapReduce 程序。 主要用途:用来做离线数据分析,比直接用 MapReduce 开发效率更高。
- 直接使用 Hadoop MapReduce 处理数据所面临的问题: 人员学习成本太高
MapReduce 实现复杂查询逻辑开发难度太大
使用 Hive :
操作接口采用类 SQL 语法,提供快速开发的能力 避免了去写 MapReduce,减少开发人员的学习成本 功能扩展很方便
- Hive 与 Hadoop 的关系
Hive 利用 HDFS 存储数据,利用 MapReduce 查询分析数据。
启动
命令分别
1:在export/script中,sh zk.sh(保证zk启动)
2:还在这个目录,sh journalnode.sh (journalnode启动,咱的是高可用哈,一般线上都是高可用)
3:不管在哪个目录,start-all.sh(启动hadoop,以设置全局)
4:不管在哪,直接输入hive,回车即可(启动hive,以设计全局
直观感受hive & 重点体会映射
-
hive几种使用方式:
1.Hive交互shell bin/hive 2.Hive JDBC服务(参考java jdbc连接mysql) 3.hive启动为一个服务器,来对外提供服务 bin/hiveserver2 nohup bin/hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & 启动成功后,可以在别的节点上用beeline去连接 bin/beeline -u jdbc:hive2://mini1:10000 -n root 或者 bin/beeline ! connect jdbc:hive2://mini1:10000 4.Hive命令 hive -e ‘sql’ bin/hive -e 'select * from t_test' ```
-
create table t_t2(id int,name string,age int) row format delimited fields terminated by ',';
-
映射:
1、结构化文件不能乱放
/user/hive/warehouse/库名/表名
2、hive database <–>/user/hive/warehouse/下的文件夹
hive下面的表 <–> /user/hive/warehouse/库名.db /下的文件夹
3、文件中结构化数据的类型要和定义的table类型一致。个数需要对应上,顺序对应上。
4、结构化数据的分隔符需要指定。
create table t_t2(id int,name string,age int) row format delimited fields terminated by ',';
Apache Hive–DDL–建表语句–hive支持的数据类型
- 难点在于hive的sql语句学习
- DDL操作:数据定义语言,表 库 字段 结构问题
- DML:数据操作语言 表数据CRUD,只不过数据仓库没有修改操作
- create table table_name;
- CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], …)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)]
[CLUSTERED BY (col_name, col_name, …)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS]
[STORED AS file_format]
[LOCATION hdfs_path] - hive不仅支持sql数据类型,还支持java数据类型,支持复杂类型(array, struct, map), 大小写不敏感。
Apache Hive–DDL–建表语句–hive分隔符的指定
- ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char] | SERDE serde_name [WITH SERDEPROPERTIES
(property_name=property_value, property_name=property_value,…)] - row format: 指定分隔符
delimited: 使用hive内置默认的分隔符类
serde: 使用其他分隔符的类 - row format delimited | serde
- 例子:
zhangsan beijing,shanghai,tianjin,hangzhou
wangwu shanghai,chengdu,wuhan,haerbin
1,zhangsan,唱歌:非常喜欢-跳舞:喜欢-游泳:一般般create table complex_array(name string,work_locations array<string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ',';
2,lisi,打游戏:非常喜欢-篮球:不喜欢create table t_map(id int,name string,hobby map<string,string>) row format delimited fields terminated by ',' collection items terminated by '-' map keys terminated by ':' ;
Apache Hive–DDL–建表语句–hive默认分隔符
- hive 建表的时候默认的分割符是’\001’,若在建表的时候没有指明分隔符, load 文件的时候文件的分隔符需要是’\001’;若文件分隔符不是’001’,程序不会 报错,但表查询的结果会全部为’null’;
用 vi 编辑器 Ctrl+v 然后 Ctrl+a 即可输入’\001’ -----------> ^A
Apache Hive–DDL–建表语句–hive分区表
两个表的内容同时显示在table t_4- 如果表t_user有三个字段: id name country
select * from t_user where country=‘china’;
需要遍历所有表中的字段,才能显示出最终符合条件的结果。效率低
为了避免select查询全表的问题,hive提出 分区表(partitioned by) 概念。给文件归类,打上标识。
真实字段 2个 + 标识 - hive的分区就是以文件夹的形式把文件管理的更加清晰,不同的分区代表着不同的文件夹。
- 没有分区的建表语句
create table t_user(id int,name string) row format delimited fields terminated by ',';
下面是有分区建表语句
create table t_user2(id int,name string) partitioned by (country string) row format delimited fields terminated by ',';
- 当表是分区表的时候 直接往表的目录下放数据已经不行了 得通过分区表特有的加载数据方式
load data local inpath '/root/hivedata/china.txt' into table t_user2 partition(country='China');
不仅加载了数据 还指定本次数据是属于哪个分区的(是那个文件夹下)
- 分区总结:
1、为了减少查询时的全表扫描。
2、分区表是在表的文件夹下多一个文件夹,文件夹的名字就是分区 字段=分区名
3、分区字段的值在查询的时候 会显示出来 但是并不代表结构化数据中有这个字段 分区字段是一个虚拟字段 只是用来标识文件
方便用户查询的时候 根据这个标识进行过滤 从而减少了全局扫描
4、分区表的数据通过load data的方式加载 加载的时候要指定分区的值(这个分区的值就是这批数据文件夹名字的值)
5、关于分区字段一定不会是表中存在的字段 如果是直接编译报错 体会什么叫给数据打标识
Apache Hive–DDL–建表语句–hive多分区表
- 双分区表
create table day_hour_table (id int, name string) partitioned by (year string, month string) row format delimited fields terminated by ‘,’;
加载双分区数据
load data local inpath ‘/root/hivedata/china.txt’ into table day_hour_table partition(year=‘2017’,month=‘06’);
Apache Hive–DDL–建表语句–hive分桶表
-
下面是分桶表的操作:
1、分桶的功能默认不开启 需要自己手动开启
set hive.enforce.bucketing = true;
2、分成几桶 也需要自己指定
set mapreduce.job.reduces=N;
3、建表语句
create table stu_buck(Sno int,Sname string,Sex string,Sage int,Sdept string)
clustered by(Sno)
into 4 buckets
row format delimited
fields terminated by ‘,’; -
下面分桶表的导入:目标(数据映射成功 数据分成4个桶)
猜想:
方式一: hadoop fs -put? 只满足映射成功 不满足分桶需求 这个方法 pass
方式二: 莫非跟分区一样?load data?
load data local inpath '/root/hivedata/student.txt' into table stu_buck cluster(Sno);
missing EOF at ‘cluster’ near ‘stu_buck’ (state=42000,code=40000)
不认识这个sql中的字段 cluster 直接编译就出错 这个方法 pass
真正分桶表的数据导入方式:insert+select insert数据来自于后select查询的结果
insert overwrite table stu_buck
select * from student cluster by(Sno);
-
举例子
建studentcreate table students(Sno int,Sname string,Sex string,Sage int,Sdept string) row format delimited fields terminated by ',';
把数据映射到student
load data local inpath '/root/hivedata/students.txt' into table students;
打开分桶表:
set hive.enforce.bucketing = true;
set mapreduce.job.reduces=4;
insert+select insert数据来自于后select查询的结果
insert overwrite table stu_buck
select * from student cluster by(Sno);
-
分桶表总结:
1、分桶表在文件层面 把数据分开了 至于按照什么分开 分开成几个部分
clustered by(字段) into N buckets
其中的字段的必须是表中已经存在的字段
2、默认是按照如何规则分开的呢默认分桶规则: hash_func(字段) % 桶的个数
当字段是int类型的时候 hash_func(字段)=字段本身
如果是其他类型 比较复杂 字段值哈希 % 桶的个数
但是能保证尽量把数据平均分在几个桶当中
3、分桶分成几个部分 实际上就是reducetask执行的个数
个数是几 桶就是几 最终文件就是几个部分
因为分桶的数据要想成功必须执行mr程序 有mr程序才会有reducaTask
Apache Hive–DDL–建表语句–hive分桶表的意义
- 分桶表的出现 提高join查询时的效率 减少了笛卡尔积的数量
使用规则:把左右两边按照join的字段分桶即可