根据尚硅谷电商数仓4教程进行总结
常见的压缩格式有:gzip、bzip2、lzo、lz4、Snappy
其中支持切片的压缩方式有bzip2和lzo。lzo是hadoop中最流行的压缩方式。
lzo优点:压缩和解压速度比较快,比较合理的压缩率。支持切片,使用方便
lzo缺点:hadoop本身不支持,需要安装。lzo虽然支持切片,但是需要对lzo文件创建索引,否则Hadoop只会把lzo文件看成一个普通文件。为了支持split需要建索引,需要指定inputformat为lzo格式
hdfs存在大量小文件会出现的问题:
元数据层面:每个小文件都有一份元数据,其中包括了文件路径、文件名、所有者、所属组、权限、创建时间等信息。这些信息都保存在namenode的内存中。所以小文件过多,会占用namenode大量的内存,影响namenode的性能和使用寿命。
计算层面:默认情况下MR对每个小文件都会启动一个Map计算任务,非常影响计算性能。同时也影响了磁盘寻址时间。
处理小文件的方式
(1)采用HAR(Hadoop Archives)的归档方式。
HAR为构建在其它文件系统上用于文件存档的文件系统,通常将hdfs中的多个文件打包成一个存档文件,减少namenode内存的使用,可以直接使用hadoop archive命令创建HAR文件。创建HAR的过程是在运行一个mr作业。
har在对小文件进行存档后,原文件不会被删除,且创建之后不能改变,文件名中也不能有空格存在,否则会报异常。
(2)采用CombineFileInputFormat
CombineFileInputFormat是一种新的inputformat,用于将多个文件合成一个单独的split,而且它还可以考虑数据的存储位置
(3)开启JVM重用
大量的小文件会启动大量的map任务,默认每一个任务会启动一个JVM,频繁的启停JVM会造成大量的内存开销。
JVM重用可以使得JVM实例在同一个job中重新使用N次,N的值可以在hadoop的mapred-site.xml文件中进行配置,通常在10-20之间。如果没有小文件,不要开启JVM重用,因为会一直占用使用到的task卡槽造成其他job无法使用,直到任务完成才释放。
flume在数据采集时对HDFS小文件的处理
按照下面这三个参数默认值配置,写入HDFS后会产生小文件,hdfs.rollInterval、hdfs.rollSize、hdfs.rollCount
将这三个参数的值按照如下方式设置,就会减少小文件的产生hdfs.rollInterval=3600
hdfs.rollSize=134217728
hdfs.rollCount =0
几个参数综合作用,效果如下:
①文件在达到128M时会滚动生成新文件
②文件创建超3600秒时会滚动生成新文件
零点漂移就是flume在采集日志的过程中,使用当前系统的时间,由于网络、磁盘的延迟,导致数据在每天零点之前没有正常的传输到下游,而这些数据会被推迟到第二天进行统计,造成当天的数据统计出现误差。解决方法就是,在flume拦截器中获取日志中的时间,并使用该时间进行统计。
优点:查询效率高,不需要join
缺点:占用额外的磁盘空间,难以保证数据的一致性。一旦某个冗余的字段内容有改动,所涉及到的地方都需要改动
数据同步策略的类型包括:
全量表:存储完整的数据。适合数据量少,数据既有新增也有变化的表
增量表:存储新增加的数据。适合数据变化大,而且只会新增不会变化
新增及变化表:存储新增加的数据和变化的数据。适合数据变化大,既有新增也有变化
特殊表:只需要同步一次。比如:地区表、省份表等。特殊表一般不会发生变化
关系建模一般是把复杂的数据抽象成两个概念,实体和关系。并使用规范化的方式将其表现出来。关系模型严格遵守范式理论。数据冗余程度较低,数据的一致性很容易得到保证。遵循三范式会造成表的数量较多,松散。使得复杂查询时需要大量的join表,在大数据场景下,查询效率相对低下。
维度建模以数据分析作为出发点,不遵循范式理论,存在着一定的冗余。维度模型一般分为事实表和维度表,表的结构简单,查询效率高。
维度建模一般在DIM层和DWD层来完成。一般采用星型模型。维度建模一般有四个步骤:
ODS层:原始数据层,存放原始数据,直接加载原始日志、数据;数据保持原样不做处理
DWD层:对ODS层数据进行清洗,比如:去除空值、脏数据、超过极限范围的数据、脱敏等。保存业务事实明细,一行信息代表一次业务行为。比如一次下单
DIM层:维度层,保存维度数据,主要是对业务事实的描述信息(DIM层包括DWD、DWS、DWT层)
DWS层:以DWD层为基础,按天进行轻度汇总
DWT层:以DWS层为基础,对数据进行主题汇总,累计汇总
ADS层:为各种统计报表提供数据
数据分层的好处:
在使用hive查询数据时执行MR任务,会先经过hive.input.format,其默认值是CombineHiveInputFormat。它可以将多个小文件合并成一个分片,LZO的索引文件也会被当成小文件进行合并,这会导致LZO文件无法切片。只需要将hive.input.format设置成HiveInputFormat即可。
hive (default)> set hive.input.format;
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
解决办法
hive (default)> set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
hive (default)> set hive.input.format;
hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat
hive (default)>
设置严格模式和非严格模式命令
set hive.mapred.mode=strict;
set hive.mapred.mode=nostrict;
严格模式下hive会有以下限制:
需要使用hive内置的函数get_json_object() 该函数的参数格式为:
get_json_object(string json_string, string path)
第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;如果输入的json字符串无效,那么返回NULL。
每次只能返回一个数据项。
SELECT get_json_object('[{"name":"大郎","sex":"男","age":"25"},{"name":"西门庆","sex":"男","age":"47"}]',"$[0].age");
结果是:25
full join 连接比较慢,可以使用union all的方式间接实现full join。实现方式:将需要连接的多个表字段进行补全对齐,一般使用0进行填充。补齐之后使用union all就可以将多个表进行纵向连接。
在特定的需求下,需要将原始数据扩展n倍。比如要统计最近1天、最近7天、最近30天的日活量,这些需求统计逻辑基本相同,只是统计天数不同;按照常规方法则需要写三份逻辑相同的sql,会造成代码的冗余并且一致性难以保证。所以可以使用later view侧写表的方式将数据进行扩展。
基本sql如下:
select *
from dwd_page_log lateral view explode(array(1, 7, 30)) tmp as recent_days
where dt >= date_add('2020-06-14', -recent_days + 1);
这样就可以将最近1天、7天、30天的数据放到同一张表,以便于后面的分析统计。
insert into 是向表中追加数据,每执行一次insert into操作,都会生成一个新文件,长期下来就会产生大量小文件。而使用insert overwrite会覆盖之前的数据,显然也是不可行的。那么解决方法是:先将表中的所有数据查询出来,然后再与新的数据进行union操作,最后将union后的结果insert overwrite到原表中。
使用sqoop将hdfs中的文件导出到MySQL中时,默认使用insert导出,即直接往mysql中插入数据,如果每天导出的数据存在重复数据,会造成MySQL中存储大量重复数据造成冗余。在此场景下可以将sqoop导出模式修改为update,此时新增的数据会直接插入,修改的数据会使用update进行修改,从而避免数据冗余。
需要在sqoop导出语句中加入以下参数:
--update-mode allowinsert
--update-key (指定主键)
即席查询是用户根据自己的需求,灵活的选择查询条件,系统能根据用户的选择生成相应的统计报表。即席查询与普通应用查询的区别:普通应用查询的需求是定制的、可预知的。即席查询的需求是未知的,并且要求查询反应速度快,并且能够实现交互式(秒级返回)
OLTP(online Trancation Processing) 联机事务处理,其特点就是高并发且数据量级不大的查询,主要用于管理事务的系统,此类系统主要的操作有INSERT, UPDATE, DELETE。通常存在此类系统中的数据都是以实体对象模型来存储数据,并满足3NF(数据库第三范式)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
OLAP(online Analytical Processing) 联机分析处理,是一种软件技术。其特点是查询频率较OLTP系统更低,但通常会涉及到非常复杂的聚合计算。 OLAP系统以维度模型来存储历史数据,其主要存储描述性的数据并且在结构上都是同质的。OLAP使分析人员能够迅速、一致、交互的从各个方面观察信息,以达到深入理解数据的目的。从各方面观察信息,也就是从不同维度分析数据,因此OLAP也成为多维分析。