数据仓库面试题总结

2年前 (2022) 程序员胖胖胖虎阿
428 0 0

根据尚硅谷电商数仓4教程进行总结

目录

    • 1 Hadoop常用压缩方式
    • 2 HDFS存在大量小文件的问题与处理
    • 3 flume零点漂移问题
    • 4 数据冗余的优缺点
    • 5 同步策略
    • 6 关系建模与维度建模
    • 7 维度建模的四个过程
    • 8 数据分层
    • 9 LZO索引文件失效
    • 10 hive严格模式
    • 11 hive中解析json串
    • 12 全外连的第二种解决方式
    • 13 原始数据扩展n倍
    • 14 解决insert into产生小文件问题
    • 15 sqoop导出update模式
    • 16 即席查询
    • 17 OLTP和OLAP概念

1 Hadoop常用压缩方式

常见的压缩格式有:gzip、bzip2、lzo、lz4、Snappy
其中支持切片的压缩方式有bzip2和lzo。lzo是hadoop中最流行的压缩方式。
lzo优点:压缩和解压速度比较快,比较合理的压缩率。支持切片,使用方便
lzo缺点:hadoop本身不支持,需要安装。lzo虽然支持切片,但是需要对lzo文件创建索引,否则Hadoop只会把lzo文件看成一个普通文件。为了支持split需要建索引,需要指定inputformat为lzo格式

2 HDFS存在大量小文件的问题与处理

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秒时会滚动生成新文件

3 flume零点漂移问题

零点漂移就是flume在采集日志的过程中,使用当前系统的时间,由于网络、磁盘的延迟,导致数据在每天零点之前没有正常的传输到下游,而这些数据会被推迟到第二天进行统计,造成当天的数据统计出现误差。解决方法就是,在flume拦截器中获取日志中的时间,并使用该时间进行统计。

4 数据冗余的优缺点

优点:查询效率高,不需要join
缺点:占用额外的磁盘空间,难以保证数据的一致性。一旦某个冗余的字段内容有改动,所涉及到的地方都需要改动

5 同步策略

数据同步策略的类型包括:

  1. 全量同步
  2. 增量同步
  3. 新增及变化同步
  4. 特殊情况

全量表:存储完整的数据。适合数据量少,数据既有新增也有变化的表
增量表:存储新增加的数据。适合数据变化大,而且只会新增不会变化
新增及变化表:存储新增加的数据和变化的数据。适合数据变化大,既有新增也有变化
特殊表:只需要同步一次。比如:地区表、省份表等。特殊表一般不会发生变化

6 关系建模与维度建模

  1. 关系建模一般是把复杂的数据抽象成两个概念,实体和关系。并使用规范化的方式将其表现出来。关系模型严格遵守范式理论。数据冗余程度较低,数据的一致性很容易得到保证。遵循三范式会造成表的数量较多,松散。使得复杂查询时需要大量的join表,在大数据场景下,查询效率相对低下。

  2. 维度建模以数据分析作为出发点,不遵循范式理论,存在着一定的冗余。维度模型一般分为事实表和维度表,表的结构简单,查询效率高。

7 维度建模的四个过程

维度建模一般在DIM层和DWD层来完成。一般采用星型模型。维度建模一般有四个步骤:

  1. 选择业务过程
    在业务系统中,逐个最各个业务线(下单、支付、退款、物流等)构建事实表。一条业务线对应一个事实表
  2. 声明粒度
    数据粒度指数据仓库中保存的数据细化程度或综合程度。声明粒度意味着精确定义事实表的一行数据表示什么。在实际的生产过程中,一般选择最小粒度,以满足在开发过程中各种各样的需求。
  3. 确认维度
    维度主要用于描述事实。比如“某时某地买了一件衣服花了100元“ 其中”某时” ”某地“就是维度。”衣服100元“就是事实。
    维度字段的确定根据后续需求分析是否需要该维度字段。常见的维度有:时间维度、地区维度、用户维度。
  4. 确认事实
    事实指的是一次业务中的度量值。“某时某地买了一件衣服花了100元“表示一次业务,其中”衣服100元“就是度量值,即事实。

8 数据分层

ODS层:原始数据层,存放原始数据,直接加载原始日志、数据;数据保持原样不做处理
DWD层:对ODS层数据进行清洗,比如:去除空值、脏数据、超过极限范围的数据、脱敏等。保存业务事实明细,一行信息代表一次业务行为。比如一次下单
DIM层:维度层,保存维度数据,主要是对业务事实的描述信息(DIM层包括DWD、DWS、DWT层)
DWS层:以DWD层为基础,按天进行轻度汇总
DWT层:以DWS层为基础,对数据进行主题汇总,累计汇总
ADS层:为各种统计报表提供数据

数据分层的好处:

  1. 把复杂的问题简单化。将复杂的任务分解成多层来完成,每一层只处理简单任务,方便定位问题。
  2. 减少重复开发。规范数据分层,通过中间层,能够极大的减少重复计算,增加计算结果的复用性
  3. 隔离原始数据。无论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开

9 LZO索引文件失效

在使用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)>

10 hive严格模式

设置严格模式和非严格模式命令
set hive.mapred.mode=strict;
set hive.mapred.mode=nostrict;

严格模式下hive会有以下限制:

  1. 对分区表的查询,必须要使用where对分区字段进行过滤(防止查询的数据量过大)
  2. 使用orderby查询时,必须使用limit限制(防止reduce执行的时间过长)
  3. 限制笛卡尔积查询
  4. 严格模式下会要求动态分区时必须有一个静态分区字段

11 hive中解析json串

需要使用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

12 全外连的第二种解决方式

full join 连接比较慢,可以使用union all的方式间接实现full join。实现方式:将需要连接的多个表字段进行补全对齐,一般使用0进行填充。补齐之后使用union all就可以将多个表进行纵向连接。

13 原始数据扩展n倍

在特定的需求下,需要将原始数据扩展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天的数据放到同一张表,以便于后面的分析统计。

14 解决insert into产生小文件问题

insert into 是向表中追加数据,每执行一次insert into操作,都会生成一个新文件,长期下来就会产生大量小文件。而使用insert overwrite会覆盖之前的数据,显然也是不可行的。那么解决方法是:先将表中的所有数据查询出来,然后再与新的数据进行union操作,最后将union后的结果insert overwrite到原表中。

15 sqoop导出update模式

使用sqoop将hdfs中的文件导出到MySQL中时,默认使用insert导出,即直接往mysql中插入数据,如果每天导出的数据存在重复数据,会造成MySQL中存储大量重复数据造成冗余。在此场景下可以将sqoop导出模式修改为update,此时新增的数据会直接插入,修改的数据会使用update进行修改,从而避免数据冗余。
需要在sqoop导出语句中加入以下参数:

--update-mode allowinsert
--update-key (指定主键)

16 即席查询

即席查询是用户根据自己的需求,灵活的选择查询条件,系统能根据用户的选择生成相应的统计报表。即席查询与普通应用查询的区别:普通应用查询的需求是定制的、可预知的。即席查询的需求是未知的,并且要求查询反应速度快,并且能够实现交互式(秒级返回)

17 OLTP和OLAP概念

OLTP(online Trancation Processing) 联机事务处理,其特点就是高并发且数据量级不大的查询,主要用于管理事务的系统,此类系统主要的操作有INSERT, UPDATE, DELETE。通常存在此类系统中的数据都是以实体对象模型来存储数据,并满足3NF(数据库第三范式)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。

OLAP(online Analytical Processing) 联机分析处理,是一种软件技术。其特点是查询频率较OLTP系统更低,但通常会涉及到非常复杂的聚合计算。 OLAP系统以维度模型来存储历史数据,其主要存储描述性的数据并且在结构上都是同质的。OLAP使分析人员能够迅速、一致、交互的从各个方面观察信息,以达到深入理解数据的目的。从各方面观察信息,也就是从不同维度分析数据,因此OLAP也成为多维分析。

版权声明:程序员胖胖胖虎阿 发表于 2022年11月8日 下午11:48。
转载请注明:数据仓库面试题总结 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...