数仓面试100题

1. 简述拉链表,流⽔表以及快照表的含义和特点?

1)拉链表
● 维护历史状态, 以及最新状态数据
适⽤情况:
● 数据量⽐较⼤
● 表中的部分字段会被更新
● 需要查看某⼀个时间点或者时间段的历史快照信息
查看某⼀个订单在历史某⼀个时间点的状态
查看某⼀个⽤户在过去某⼀段时间,下单次数
● 更新的⽐例和频率不是很⼤
如果表中信息变化不是很⼤,每天都保留⼀份全量,那么每次全量中会保存很多不变的信息,对存储是
极⼤的浪费
● 优点
● 满⾜反应数据的历史状态
● 最⼤程度节省存储
2)流⽔表
● 对于表的每⼀个修改都会记录,可以⽤于反映实际记录的变更
3)快照表
● 按⽇分区, 记录截⽌数据⽇期的全量数据
● 快照表, 有⽆变化都要报
● 每次上报的数据都是所有的数据(变化的+没有变化的)
● ⼀天⼀个分区

2. 数仓建模的⽅式?

1)选择需要进⾏分析决策的业务过程。业务过程可以是单个业务事件,⽐如交易的⽀付、退款等;也可
以是某个事件的状态, ⽐如当前的账户余额等;还可以是⼀系列相关业务事件组成的业务流程,具体需
要看我们分析的是某些事件发⽣情况,还是当前状态,或是事件流转效率。
2)选择粒度。在事件分析中,我们要预判所有分析需要细分的程度,从⽽决定选择的粒度。粒度是维度
的⼀个组合。
3)识别维表。选择好粒度之后,就需要基于此粒度设计维表,包括维度属性,⽤于分析时进⾏分组和筛
选。
4)选择事实。确定分析需要衡量的指标

3. 什么是事实表,什么是维表?

事实表
事实表( Fact Table)是指存储有事实记录的表,如系统⽇志、销售记录等;事实表的记录在不断地动
态增⻓ ,所以它的体积通常远⼤于其他表。
事实表作为数据仓库建模的核⼼,需要根据业务过程来设计,包含了引⽤的维度和业务过程有关的度
量。
维度表( Dimension Table)或维表,有时也称查找表(Lookup Table),是与事实表相对应的⼀种
表;它保存了维度的属性值,可以跟事实表做关联;相当于将事实表上经常重复出现的属性抽取、规范
出来⽤⼀张表进⾏管理。常见的维度表有: ⽇期表(存储与⽇期对应的周、⽉ 、季度等的属性) 、地点
表( 包含国家、省/州、城市等属性)等。维度是维度建模的基础和灵魂。

4. 如果业务库修改了数据,但是更新时间没⽤修改,这个数据能抽过来吗?应该怎么处理?

抽取不过来, 只能通过监听binlog实时采集

5. datax与sqoop的优缺点?

1)datax:
● 缺点:
○ 单进程多线程
○ 单机压⼒⼤
○ 不⽀持分布式
○ 社区开源不久,不太活跃
● 优点:
○ 能显示运⾏信息,包括运⾏时间,数据量,消耗资源,脏数据稽核等
○ ⽀持流量控制
2)sqoop:
● 优点:
○ 运⾏模式是mr
○ 扩展性好
○ ⽀持分布式
● 缺点:
○ 不⽀持运⾏信息显示
○ 不⽀持流量控制

6. 数据质量管理和元数据管理怎么做的?

数据质量从以下⼏⽅⾯考虑:
完整性、⼀致性、准确性、唯⼀性、关联性、真实性、及时性、逻辑检查、离群值检查、⾃定义规则、
波动稽核
元数据管理主要从以下⼏个⽅⾯考虑:
技术元数据、存储元数据、运⾏元数据、计算元数据、调度元数据、运维元数据、业务元数据、维度、
指标

7. sql⾥⾯on和where有区别吗?

不考虑where条件下,left join 会把左表所有数据查询出来,on及其后⾯的条件仅仅会影响右表的数据(符
合就显示,不符合全部为null)
在匹配阶段,where⼦句的条件都不会被使⽤ ,仅在匹配阶段完成以后,where⼦句条件才会被使⽤,它
将从匹配阶段产⽣的数据中检索过滤
● 所以左连接关注的是左边的主表数据,不应该把on后⾯的从表中的条件加到where后,这样会影响
原有主表中的数据
● where后⾯:是先连接然⽣成临时查询结果,然后再筛选
● on后⾯: 先根据条件过滤筛选,再连接⽣成临时查询结果

8. 如何判断⼀个模型的好坏?

1)模型层的完整度
⽐较好的模型,使⽤⽅是可以直接从该模型获取所有想要的数据的,如果dws,ads,dm层直接引⽤ods
层的表⽐例太⼤,即跨层引⽤率太⾼ ,则该模型不是最优,可以继续优化
2)复⽤度
dw,dws下游直接产出的表的数量
3)规范度
表需要关联上主题域并且需要分层
表命名符合规范(清晰 、⼀致,表名需易于使⽤⽅理解)
字段命名是依赖于词根
4)数据可回滚
重跑数据的情况下,数据结果不变
5)核⼼模型与扩展模型分离
建⽴核⼼模型与扩展模型体系,核⼼模型包括的宇段⽀持常⽤的核⼼业务,扩展模型包括的字段⽀持个
性化或少量应⽤的需要,不能让扩展模型的宇段过度侵⼈核⼼模型, 以免破坏核⼼模型的架构简洁性与
可维护性。

9. 你们需求的开发流程是什么样的?

1)需求分析调研(数据调研,需求调研,业务调研):明确⼝径,评估排期,需求正规流程提交
2) 指标管理:完善指标命名规范,指标同名同义,指标与业务强相关,明确指标构成要素
3)模型设计:完善开发流程规范,标准化业务调研,知识库⽂档集中管理,建⽴模型评审机制
4) ETL开发:ODS->DWD->DW->DWS->ADS
5)数据验证:制定数据测试标准
6)任务调度:规范化调度参数配置
7)上线管理

10. ⼤宽表的优点与缺点?

1)优点:
提⾼查询性能、快速响应、⽅便使⽤,降低使⽤成本、提⾼⽤户满意度
2)缺点
● 由于把不同的内容都放在同⼀张表存储,宽表已经不符合三范式的模型设计规范,随之带来的主要
坏处就是数据的⼤量冗余
● 另外就是灵活性差,就⽐如说线上业务表结构变更,宽表模式改造量也⽐较⼤
● 开发宽表为了避免宽表重复迭代,我们应该去了解业务全流程,得需要知道需扩展哪些维度,沉淀
哪些指标,这样就流程会⽐较⻓,特别是有些业务快速迭代的话,就有点捉襟⻅肘

11. 你们开发规范是怎样的?

分层规范 、表命名规范、字段命名规范、注释规范
数据类型规范、分区规范、词根规范、指标规范
数据抽取规范、码表规范

12. 流量域⼀般怎么做?

⽇志采集,清洗,建模,指标统计

13. 如果你的代码运⾏很慢,你会怎么开始排查?

从服务器资源,数据量,执⾏引擎,数据倾斜,sql调优,执⾏计划等去作答

14. null值怎么打散,打散的伪代码或者sql?

rand()函数

15. 数据清洗做过没?主要做了哪些清洗

做过清洗
● json解析
● 数据脱敏
● 空值给默认值
● 脏数据过滤
● 枚举值统⼀ 1 男 2 ⼥ 0 男 1⼥
● 数据格式统⼀ yyyy/MM/dd yyyy-MM-dd
● 出⽣⽇期转年龄等。

16. ⽣产环境中为什么建议使⽤外部表?

● 安全性:避免误操作导致数据丢失
● 共享性:多个不同表可以共⽤同⼀份数据源进⾏不同的ETL逻辑处理
● 灵活性: 当对表结构进⾏调整时,⽆需额外备份数据

17. Union 和 Union all的区别?

Union去重,Union all 不去重,在性能上 Union all要⾼⼀些
40

18. 简单描述⼀下Hive的功能?⽤Hive创建表有⼏种⽅式?Hive表有⼏种?

Hive主要是做离线分析的
Hive建表有三种⽅式
● 直接建表法
● 查询建表法(通过AS 查询语句完成建表:将⼦查询的结果存在新表⾥,有数据,⼀般⽤于中间表)
● like建表法(会创建结构完全相同的表 ,但是没有数据)
Hive表有2种:内部表和外部表

19. 简述delete,drop,truncate的区别?

delete :删除数据
drop :删除表
truncate :摧毁表结构并重建

20. order by, sort by, distributeby, clusterby的区别?

order by : 发⽣在reduce端,全局排序,需要经过shuffle。
sort by: 发⽣在reduce之前,分区内排序,即局部有序,提⾼在进⼊reduce之后排序效率
distribute by : 通常和sort by 结合使⽤,⽤来控制某些数据分配到哪些reduce端,只是单纯的做数据分
散⼯作
cluster by : distribute by 和sort by 字段⼀样的时候组合起到的作⽤
group by : 按照指定字段进⾏分组,相同的key会分到相同的reduce,后续操作是聚合

21. udf udaf udtf区别?

● UDF:操作单个数据⾏,产⽣单个数据⾏,即可理解为处理⼀条数据返回⼀条数据,类似于map操作
● UDAF:操作多个数据⾏,产⽣⼀个数据⾏,其中sum,avg,max,min等聚合函数就是UDAF
● UDTF:操作单个数据⾏,产⽣多个数据⾏,如lateral view explode实现的列转⾏操作

22. ⼤表join⼩表产⽣的问题,怎么解决?

该问题其实可以衍⽣出mapjoin的原理、数据倾斜,sql优化等常⻅题。
可能造成数据倾斜以及解决⽅案:
(1)join因为空值导致⻓尾(key为空值是⽤随机值代替)
(2)join因为热点值导致⻓尾, 也可以将热点数据和⾮热点数据分开处理,最后合并
(3)可能由于map端读取⽂件不均匀,这⾥需要对源⽂件做⼀些合并操作
(4) 当出现distinct操作时,map端⽆法做⼀次聚合,需要把所有的数据分配到reduce端,那么有可能会
出现key数据分发不均匀, 这时需要替换为groupby操作
可能会出现OOM,这⾥需要知道的是⼤⼩表关联会转换为mapjoin,如果⼩表不是那么的⼩会造成内存爆
满, 可以调节Hive.auto.convert.join.nonconditionaltask.size参数来控制⼩表的⼤⼩来决定是否转换为
mapjoin

23. 如何解决Hive数据倾斜的问题,Hive数据倾斜解决思路

⾸先要知道的是数据倾斜的本质是数据分配不均匀,那么造成不均匀的原因有很多,⽐如热点key,⾮热
点key分布不均匀等。
那么需要定位到具体发⽣原因,才能对症下药。从技术层⾯来说
(1) ⾸先怀疑的是数据热点key,这⾥可以根据采样统计来判断是否有部分key记录过多
(2)如果是热点key,则可以采⽤单独处理或者⼆次聚合等⽅法来处理
(3)如果不是热点key,那么有可能是key本身分布不均匀导致的,那么可以采⽤随机前缀、groupby替代
distinct、mapjoin、空值处理等⼀些⼿段来将key进⾏随机分区
从业务层⾯来说,有可能是提供计算⼝径有问题导致的倾斜问题,例如订单和⽀付关联,正常应该是
100w,但是从explain来看,关联得到的结果是1000w或者更多,可需要考虑逻辑⼝径是否有问题。
以上两种⼿段再结合⼀些参数化的配置可以彻底解决倾斜问题

24. Hive ⾥边字段的分隔符⽤的什么?为什么⽤\t?有遇到过字

段⾥ 边有\t 的情况吗,怎么处理的?为什么不⽤ Hive 默认的分
隔符,默认的分隔符是什么?
Hive 默认的字段分隔符为 ascii 码的控制符\001(^A),建表的时候⽤ fields terminated by ‘\001’

遇到过字段⾥边有\t 的情况, ⾃定义 InputFormat,替换为其他分隔符再做后续处理

25. 分区分桶的区别,为什么要分区?

1)⼀个是分⽂件夹,另⼀个是分⽂件。
分区表:原来的⼀个⼤表存储的时候分成不同的数据⽬录进⾏存储。如果说是单分区表,那么在表
的⽬录下就只有⼀级⼦⽬录,如果说是多分区表,那么在表的⽬录下有多少分区就有多少级⼦⽬
录。不管是单分区表,还是多分区表,在表的⽬录下,和⾮最终分区⽬录下是不能直接存储数据⽂
件的
分桶表:原理和hashpartitioner ⼀样,将Hive中的⼀张表的数据进⾏归纳分类的时候,归纳分类规
则就是hashpartitioner。(需要指定分桶字段,指定分成多少桶)
2)分区表和分桶的区别除了存储的格式不同外,最主要的是作⽤:
分区表:细化数据管理, 缩⼩mapreduce程序 需要扫描的数据量。
分桶表:提⾼join查询的效率 ,在⼀份数据会被经常⽤来做连接查询的时候建⽴分桶,分桶字段就是
连接字段;提⾼采样的效率。
3)有了分区为什么还要分桶?
(1)获得更⾼的查询处理效率。桶为表加上了额外的结构,Hive在处理有些查询时能利⽤这个结
构。
(2)使取样( sampling)更⾼效。在处理⼤规模数据集时,在开发和修改查询的阶段,如果能在数
据集的⼀⼩部分数据上试运⾏查询,会带来很多⽅便。
分桶是相对分区进⾏更细粒度的划分。分桶将表或者分区的某列值进⾏hash值进⾏区分,如要按照
name属性分为3个桶,就是对name属性值的hash值对3取摸,按照取模结果对数据分桶。
与分区不同的是,分区依据的不是真实数据表⽂件中的列,⽽是我们指定的伪列,但是分桶是依据
数据表中真实的列⽽不是伪列

26. Hive开发中遇到什么问题?

(1)存储格式问题(如使⽤parquet、rcfile、text)等遇到的问题
(2)数据问题(如遇到Null值时排序没有达到理想要求,或者遇到表情包问题,或者分隔符导致数据错
位)
(3)数据倾斜问题(常⻅问题)
(4)⼩⽂件问题(常⻅问题)
43
(5)乱码问题(如中⽂)
(6)元数据问题(如出现数据不⼀致问题,可能是元数据未及时更新)

27. Hive的join底层mr是如何实现的?

Map阶段
读取表的数据, Map输出时候以 Join on 条件中的列为key,如果Join有多个关联键,则以这些关联键的
组合作为key;
Map输出的 value 为 join 之后需要输出或者作为条件的列;同时在value中还会包含表的 Tag 信息,⽤
于标明此value对应的表;按照key进⾏排序
Shuffle阶 段
根据key取哈希值,并将key/value按照哈希值分发到不同的reduce中
Reduce阶段
根据key的值完成join操作,并且通过Tag来识别不同表中的数据。在合并过程中,把表编号扔掉. 28. Hive中内连接和外连接的区别
内连接两个表能关联上的才会保留
外连接返回满⾜连接条件的所有记录,匹配不上的另⼀个表⽤null显示。
因此, 内连接可能会导致数据丢失。

28. 建好了外部表,⽤什么语句把数据⽂件加载到表⾥?

● 从本地导⼊: load data local inpath /home/liuzc into table ods.test ● 从hdfs导⼊:load data inpath /user/Hive/warehouse/a.txt into ods.test

29. Hive的执⾏流程?(Hive的底层运⾏原理)

● ⽤户提交查询等任务给Driver。
● 编译器获得该⽤户的任务Plan。
● 编译器Compiler根据⽤户任务去MetaStore中获取需要的Hive的元数据信息。
● 编译器Compiler得到元数据信息,对任务进⾏编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划( MapReduce), 最后选择最佳的策略。
● 将最终的计划提交给Driver。
● Driver将计划Plan转交给ExecutionEngine去执⾏,获取元数据信息,提交给JobTracker或者
SourceManager执⾏该任务 ,任务会直接读取HDFS中⽂件进⾏相应的操作。
● 获取执⾏的结果。
● 取得并返回执⾏结果。

30. Hive的元数据信息存储在哪?

● 默认存储在derby, 我们是把它存在了mysql数据库
● 默认存储⽅式:内存数据库derby,安装⼩,但是数据存在内存,不稳定
● 外部存储⽅式:mysql数据库,数据存储模式可以⾃⼰设置,持久化好,查看⽅便。

31. On 和where的区别?

where后⾯:是先连接然⽣成临时查询结果,然后再筛选
on后⾯:先根据条件过滤筛选,再连接⽣成临时查询结果

32. Hive和传统数据库之间的区别?

1)写时模式和读时模式
● 传统数据库是写时模式,在load过程中,提升了查询性能,因为预先解析之后可以对列建⽴索引,
并压缩 ,但这样也会花费更多的加载时间。
● Hive是读时模式,1 oad data⾮常迅速, 因为它不需要读取数据进⾏解析,仅仅进⾏⽂件的复制或
者移动。
2)数据格式。Hive中没有定义专⻔的数据格式, 由⽤户指定,需要指定三个属性:列分隔符,⾏分隔
符, 以及读取⽂件数据的⽅法。数据库中,存储引擎定义了⾃⼰的数据格式。所有数据都会按照⼀定的
组织存储
3)数据更新。Hive的内容是读多写少的,因此,不⽀持对数据的改写和删除,数据都在加载的时候中确
定好的。数据库中的数据通常是需要经常进⾏修改
4)执⾏延迟。Hive在查询数据的时候, 需要扫描整个表(或分区),因此延迟较⾼,只有在处理⼤数据是
才有优势。数据库在处理⼩数据是执⾏延迟较低。
5)索引。Hive⽐较弱,不适合实时查询。数据库有。
6)执⾏ 。Hive是 Mapreduce,数据库是 Executor
7)可扩展性。Hive⾼,数据库低
8)数据规模。Hive⼤,数据库⼩

33. Hive中导⼊数据的4种⽅式。

从本 地导 ⼊: load data local inpath / home/ liuzc into table ods. test
从hdfs导⼊:load data inpath /user/Hive/warehouse/a.txt into ods.test
查询导⼊ :create table tmp_ test as select * from ods.test
查询结果导⼊ :insert into table tmp.test select * from ods.test

34. where跟having都有筛选数据的作⽤,两者有什么区别?

where是作⽤在表的所有字段,having是作⽤在查询的字段上
在where⼦句中不能使⽤聚组函数,在having语句中可以使⽤聚组函数

35. 你们数仓⽤的是Hive还是Spark,你平常怎么选择?

Hive和Spark都需要⽤,平常使⽤的时候就看跑的数据量及紧急性,数据量不⼤或者需要及时产出的,会
选择Spark。

36. Hive开发过程中,你⼀般会怎么调优?

● 数据的压缩与存储格式
● 合理利⽤分区分桶
● Hive参数优化
● sql优化
● 数据倾斜处理
● 合并⼩⽂件

37. Hive做过哪些参数的优化?

设置jvm重⽤

1 、JVM重⽤对hive的性能具有⾮常⼤的影响,特别是对于很难避免⼩⽂件的场景或者task特别多的
场景,
2 这类场景⼤多数执⾏时间都很短。jvm的启动过程可能会造成相当⼤的开销,尤其是执⾏的job包含有
成千上
3 万个task任务的情况。
4 set mapred.job.reuse.jvm.num.tasks=10;

合理设置reduce的数⽬

1 // ⽅法1:调整每个reduce所接受的数据量⼤⼩
2 set hive.exec.reduce rs.bytes.per.reduce r=500000000; (500M)
3 // ⽅法2:直接设置reduce数量
4 set mapred.reduce.tasks = 20
5 // map端聚合,降低传给reduce的数据量
6 set hive.map.aggr=true
7 // 开启hive内置的数倾优化机制
8 set hive.groupby.skewindata=true

38. Hive去重的⼏种⽅法?

distinct
group by
开窗取第⼀条

39. row number, rank, dense rank区别?

row_number:不管排名是不是有相同的,都按照顺序1,2,3……n
rank:排名相同的名次⼀样,同⼀排名有⼏个,后⾯排名就会跳过⼏次,如1 2 2 2 5 6 6 8
dense_rank:排名相同的名次⼀样,且后⾯名次不跳跃 如 1 2 2 2 3 4 4 5

40. 处理⼩⽂件的参数是什么?

map输⼊的⼩⽂件合并:

1 set mapred.max.split.size=256000000;
2 //⼀个节点上split的⾄少的⼤⼩(这个值决定了多个DataNode上的⽂件是否需要合并)
3 set mapred.min.split.size.per.node=100000000;
4 //⼀个交换机下split的⾄少的⼤⼩(这个值决定了多个交换机上的⽂件是否需要合并)
5 set mapred.min.split.size.per.rack=100000000;
6 //执⾏Map前进⾏⼩⽂件合并
7 set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

设置map输出和reduce输出进⾏合并的相关参数:

1 //设置map端输出进⾏合并,默认为true
2 set hive.merge.mapfiles = true
3 //设置reduce端输出进⾏合并,默认为false
4 set hive.merge.mapredfiles = true
5 //设置合并⽂件的⼤⼩
6 set hive.merge.size.per.task = 256*1000*1000
7 //当输出⽂件的平均⼤⼩⼩于该值时,启动⼀个独⽴的MapReduce任务进⾏⽂件merge。
8 set hive.merge.smallfiles.avgsize=16000000

41. 什么是rdd?

RDD是Spark中最基本的数据抽象,是⼀个弹性分布式数据集,全称是Resilient Distributed DataSet

42. rdd的三⼤基本特性说⼀下?

分区,不可变,并⾏操作

43. rdd的五⼤特性说⼀下?

1)RDD是由⼀系列partition组成,textFile底层调⽤的是MR 读取HDFS上的数据的⽅法
2) 函数作⽤在每⼀个partition(split)上
3)RDD之间有⼀系列的依赖关系(容错机制)
4)分区器作⽤在K,V 格式的RDD 上
5)RDD 提供⼀系列最佳的计算位置

44. 三个表进⾏join连接时,会产⽣⼏个MR join?

如果每个on ⼦句都使⽤相同的连接键的话,那么只会产⽣1 个MapReduce job,不相同的连接键的话 是
2 个MapReduce job。

45. 事实表有哪些分类,以及他们的⽤途?

● 事务事实表
● 周期快照事实表
● 累计快照事实表
事务事实表 记录的事务层⾯的事实,保存的是最原⼦的数据,也称“原⼦事实表”。事务事实表中的数据
在事务事件发⽣后产⽣,数据的粒度通常是每个事务记录⼀条记录。⼀旦事务被提交,事实表数据被插
⼊,数据就不再进⾏更改,其更新⽅式为增量更新。
周期快照事实表 以具有规律性的、可预⻅的时间间隔来记录事实,时间间隔如每天、每⽉ 、每年等等。
典型的例⼦如销售⽇快照表、库存⽇快照表等。它统计的是间隔周期内的度量统计,如历史⾄今、⾃然
年⾄今、季度⾄今等等。周期快照表没有粒度的概念,取⽽代之的是周期+状态度量的组合,如历史⾄今
的订单总数, 其中历史⾄今是⼀个周期,订单总数是度量。
累积快照事实表 和周期快照事实表有些相似之处,它们存储的都是事务数据的快照信息。但是它们之间
也有着很⼤的不同,周期快照事实表记录的确定的周期的数据,⽽累积快照事实表记录的不确定的周期
的数据。累积快照事实表代表的是完全覆盖⼀个事务或产品的⽣命周期的时间跨度,它通常具有多个⽇
期字段,⽤来记录整个⽣命周期中的关键时间点。例如订单累计快照事实表会有付款⽇期,发货⽇期,
收货⽇期等时间点。

46. 常见的建模⽅法有哪⼏种?

三范式建模和维度建模。
三范式建模主要是在数据库中使⽤,维度建模⼀般在数仓中使⽤ 。
范式建模:能够结合业务系统的数据模型,较⽅便的实现数据仓库的模型;同⼀份数据只存放在⼀个地
⽅,没有数据冗余,保证了数据⼀致性;数据解耦,⽅便维护。但同时也带来了缺点:表的数量多;查
询时关联表较多使得查询性能降低。
维度建模:模型结构简单,⾯向分析,为了提⾼查询性能可以增加数据冗余,反规范化的设计,开发周
期短,能够快速迭代。缺点就是数据会⼤量冗余,预处理阶段开销⼤,后期维护麻烦;

47. 说⼀下你们数仓的建模过程?

DWD 层需构建维度模型,⼀般采⽤星型模型,呈现的状态⼀般为星座模型。
维度建模⼀般按照四个步骤实施:具体是
选择业务过程 -> 声明粒度 -> 确定维度 -> 确定事实。
● 选择业务过程:
思路:详细分析需求,对业务的整个⽣命周期进⾏分析,明确关键的业务步骤,从⽽选择与需求有关的
业务过程;
1)分析业务的⽣命周期:
明确关键的业务步骤:该订单流转的业务过程有 4 个:创建订单 → 买家付款 → 卖家发货 → 买家确认
收货;
2)根据业务需求,选择与维度建模有关的业务过程;
如,是选择 “买家付款” 这个业务过程,还是选择 “创建订单” 和 “买家付款” 这两个业务过程,具体根
据业务情况来定;
3)根据所选的业务过程确定事实表类型;
如,选择 “买家付款” 这个业务过程,则事实表类型应为只包含买家付款这⼀个业务过程的 “单事务事实
表”;
如,选择了所有 4 个业务过程,并且需要分享各业务过程的时间间隔,则事实表类型应为包含了所有 4
个业务过程的 “累积快照事实表”;
● 声明粒度:
1)粒度的作⽤:
a)粒度的声明,意味着精确定义事实表的每⼀⾏所表示的业务含义;
b)明确的粒度能够确保对实表中⾏的意思的理解不会产⽣混淆,保证所有的事实按照同样的细节层次记
录;
2)粒度的选择:
尽量选择最细级别的原⼦粒度, 以确保事实表的应⽤具有最⼤的灵活性;
a)灵活性:⽀持⽆法预期的各种细节层次的⽤户需求;
b)对于订单级别,粒度可以定义为最细的订单级别;(如,⽗⼦订单,事实表的粒度可以定 “⼦订单级
别” ;)
● 确定维度:

完成了粒度声明,就意味着确定了主键,对应的维度组合以及相关的维度字段也可以确定了;
选择维度的原则:应该选择能够描述清楚业务过程所处的环境的维度信息;
如,淘宝订单 “付款事务事实表” 中,粒度为 “⼦订单”,相关的维度有买家、卖家、商品、收货⼈信
息、业务类型、订单时间等;
● 确定事实:
确定原则:选择与业务过程有关的所有事实,且事实的粒度要与所声明的事实表的粒度⼀致;
思路:可以通过回答 “过程的度量是什么” 来确定;
注意:将不可加性事实分解为可加的组件;(分解的原则:可以通过分解后的可加的属性值,计算得到
不可加性事实)

48. Hive开窗函数排序sum统计有什么特点?

分组内排序,且从第⼀⾏到当前⾏的求和。

49. 数仓分层、模型、每层都是做什么的?为什么这么做?(按照⾃⼰的项⽬讲)

ODS层:
贴源层,与业务库保持⼀致,不做任何处理
CDM层:
数据公共层CDM(Common Data Model,⼜称通⽤数据模型层),包括DIM维度表、DWD,DW和
DWS, 由ODS层数据加⼯⽽成。主要完成数据加⼯与整合,建⽴⼀致性的维度,构建可复⽤的⾯向分析
和统计的明细事实表, 以及汇总公共粒度的指标
公共维度层(DIM):
基于维度建模理念思想,建⽴企业⼀致性维度。降低数据计算⼝径和算法不统⼀⻛险。公共维度层的表
通常也被称为逻辑维度表,维度和维度逻辑表通常⼀⼀对应。
明细粒度事实层(DWD):
对数据进⾏规范化编码转换, 清洗,统⼀格式,脱敏等,不做横向整合
主题宽表层(DW)对dwd各种信息进⾏整合,输出主题宽表(⾯向业务过 程,不同业务过程的信息不冗余
建设,采⽤外键形式)
公共汇总粒度事实层(DWS):
以分析的主题对象作为建模驱动,基于上层的应⽤和产品的指标需求,构建公共粒度的汇总指标事实
表, 以宽表化⼿段物理化模型。构建命名规范、⼝径⼀致的统计指标,为上层提供公共指标,建⽴汇总
宽表、明细事实表。
公共汇总粒度事实层的表通常也被称为汇总逻辑表,⽤于存放派⽣指标数据。
ADS层:
数据应⽤层ADS(Application Data Service):
⾯向业务需求定制开发,存放数据产品个性化的统计指标数据。
为什么要分层?
1)清晰数据结构:每⼀个数据分层都有它的作⽤域, 这样我们在使⽤表的时候能更⽅便地定位和理
解。
2)数据⾎缘追踪:简单来讲可以这样理解,我们最终给业务呈现的是⼀张能直接使⽤的张业务表,
但是它的来源有很多,如果有⼀张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚
它的危害范围。
3)减少重复开发:规范数据分层,开发⼀些通⽤的中间层数据,能够减少极⼤的重复计算。
4)把复杂问题简单化:将⼀个复杂的任务分解成多个步骤来完成,每⼀层只处理单⼀的步骤, ⽐较
简单和容易理解。⽽且便于维护数据的准确性, 当数据出现问题之后,可以不⽤修复所有的数据,
只需要从有问题的步骤开始修复。

50. 交叉维度的解决⽅案?(可以⽤在:在项⽬中遇到最难的问题)(不懂的慎⽤)

处理多值维度最好的办法是降低事实表的粒度。这种处理⽅式也是维度建模的⼀个原则,即事实表应该
建⽴在最细粒度上 。这样的处理,需要对事实表的事实进⾏分摊。
但是有些时候,事实表的粒度是不能降低的,多值维度的出现是⽆法避免的。如上述交叉维度,事实表
与⽤户维度没有直接的关系,不能将数据粒度进⾏细分,即使细分的话帐户余额也很难分摊。这时,可
以采⽤桥接表技术进⾏处理。在帐户维度表和⽤户维度表之间建⽴个帐户-⽤户桥接表。这个桥接表可以
解决掉帐户维度和⽤户维度之间的多对多关系,也解决掉的帐户维度表的多值维度问题。

51. 聊⼀下数据资产

数据资产个⼈认为有维度、指标、数据源、词根、字典、词典、数据表、⽅案、标准等。

53. 怎么进⾏数据建模?

选择需要进⾏分析决策的业务过程。业务过程可以是单个业务事件, ⽐如交易的⽀付、退款等;也可以
是某个事件的状态, ⽐如当前的账户余额等;还可以是⼀系列相关业务事件组成的业务流程,具体需要
看我们分析的是某些事件发⽣情况,还是当前状态,或是事件流转效率。
选择粒度。在事件分析中,我们要预判所有分析需要细分的程度,从⽽决定选择的粒度。粒度是维度的
⼀个组合。
识别维表。选择好粒度之后,就需要基于此粒度设计维表,包括维度属性,⽤于分析时进⾏分组和筛
选。
选择事实。确定分析需要衡量的指标

54. 内外部表的区别、优缺点?

每天采集的ng⽇志和埋点⽇志,在存储的时候建议使⽤外部表, 因为⽇志数据是采集程序实时采集进来
的,⼀旦被误删,恢复起来⾮常麻烦。⽽且外部表⽅便数据的共享。
抽取过来的业务数据,其实⽤外部表或者内部表问题都不⼤,就算被误删,恢复起来也是很快的,如果
需要对数据内容和元数据进⾏紧凑的管理, 那还是建议使⽤内部表
在做统计分析时候⽤到的中间表,结果表可以使⽤内部表,因为这些数据不需要共享,使⽤内部表更为
合适。并且很多时候结果分区表我们只需要保留最近3天的数据,⽤外部表的时候删除分区时⽆法删除数
据。
我们ods层统⼀⽤外部表,指标层⼀般⽤内部表。

55. Hive的存储格式和压缩⽅式有哪些?选择哪些存储和压缩⽅式?为什么?

存储格式有:textfile, orc和parquet
压缩格式有:snappy, bzip2,gzip和lzo这些。
● 我们数仓ods层⽤的是parquet的存储格式和bzip2的压缩⽅式, 因为bzip2的压缩⽐⽐较⼤,⽽且
ods层对数据操作的⽐较少。
● 指标层⽤的是textfile的存储格式,不⽤压缩⽅式 。因为ads层数据⽐较少,可以不⽤压缩⽅式,使⽤
textfile的原因是要保证数据能成功的导⼊到数据库中。
● 其余的各层使⽤的是snappy加parquet,原因是snappy的压缩⽐和解压缩⽐是⽐较好的。

56. 列式存储是什么?⾏数⽐较⼤的情况,⽐如说上亿,那么列式存储是怎么做的?列式存储是为了解决什么问题?

列存储不同于传统的关系型数据库, 其数据在表中是按列存储的。
列⽅式所带来的重要好处之⼀就是, 由于查因此整个数据库是⾃动
索引化的。
按列存储每个字段的数据聚集存储,在查询只需要少数⼏个字段的时候,能⼤⼤减少读取的数据量,⼀
个字段的数据聚集存储,那就更容易为这种聚集存储设计更好的压缩/解压算法。
列式数据库在分析需求(获取特点——每次查询⼏个维度,通常是)时候,不仅搜索时间效率占优势,
其空间效率也是很明显的。特别是针对动辄按T计算的数据量来说,在分布式环境中能进⾏压缩处理能节
省宝贵的内部带宽,从⽽提⾼整个计算任务性能。

57. Shell的单引号、双引号、反引号的区别

1)单引号不取变量值
2)双引号取变量值
3)反引号`,执⾏引号中命令
4)双引号内部嵌套单引号,取出变量值
5)单引号内部嵌套双引号,不取出变量值

58. 数据仓库数据源都有哪些

爬⾍数据
业务库数据
埋点⽇志

59. udf 、udaf 、udtf区别?

UDF:操作单个数据⾏,产⽣单个数据⾏,即可理解为处理⼀条数据返回⼀条数据,类似于map操作
UDAF:操作多个数据⾏,产⽣⼀个数据⾏,其中sum,avg,max,min等聚合函数就是UDAF
UDTF:操作单个数据⾏, 产⽣多个数据⾏,如lateral view explode实现的列转⾏操作

60. ⽣产环境中为什么建议使⽤外部表?

1)安全性:避免误操作导致数据丢失
2) 共享性:多个不同表可以共⽤同⼀份数据源进⾏不同的ETL逻辑处理
3) 灵活性:当对表结构进⾏调整时,⽆需额外备份数据

61. Hive的判断函数有哪些?

● case when
● if ● coalesce()
● nvl ● isnull ● isnotnull

62. mapjoin的原理?

场景:适⽤于⼤表关联⼩表的场景,其中⼩表是可以能够放到内存中的。
⼤概流程: 当发⽣mapjoin(即在map端完成join操作)的时候 ,⼩表会被复制分发到map端(这⾥会封装到
HashTable),并被加载到内存中(上传到Distributed Cache中),然后顺序扫描⼤表根据key在内存中依次
进⾏关联完成join,避免了shuffle过程 。但需要注意的是mapjoin没有reduce,所以⽂件的数量和map的
个数有关系,这⾥要注意下⼩⽂件问题。⽽map的数量和源⽂件的存储分布有关系。

63. 创建rdd的⼏种⽅式?

1)集合并⾏化创建(有数据)
复制代码
1 val ar r = Array(1,2,3,4,5)
2 val rdd = sc.parallelize(arr)
3 val rdd =sc.makeRDD(arr) //底层调⽤了parallelize⽅法
2)读取外部⽂件系统,如hdfs,或者读取本地⽂件(最常⽤的⽅式)(没数据)

1 val rdd2 = sc.textFile("hdfs://hdp-01:9000/words.txt")
2 // 读取本地⽂件
3 val rdd2 = sc.textFile(“file:///root/words.txt”)
3)从⽗RDD转换成新的⼦RDD
调⽤Transformation类的⽅法,⽣成新的RDD

64. Spark运⾏流程?

(1)Spark-submit命令执⾏时,会根据指定的master地址去向 Master发送请求,Master接收到Driver
端(具体根据提交模式来判断Driver启动的地⽅)的任务请求之后,根据任务的请求资源进⾏调度,(采⽤
打散的策略),尽可能的把任务资源平均分配,然后向WOrker发送指令
(2)Worker收到Master的指令之后, 就根据相应的资源,启动executor(cores,memory)
(3)executor会向dirver端建⽴请求,通知driver,任务已经可以运⾏了
(4) driver运⾏任务的时候,会把任务发送到executor中去运⾏。

65. sortBy 和 sortByKey的区别?

sortBy既可以作⽤于RDD[K] ,还可以作⽤于RDD[(k,v)],底层会调⽤sortByKey
sortByKey 只能作⽤于 RDD[K,V] 类型上。

66. cache和checkPoint的⽐较?

相同点:都是做 RDD 持久化的
⽐较:
(1)cache:是在触发action之后,把数据写⼊到内存或者磁盘中。不会截断⾎缘关系
(设置缓存级别为memory_only:内存不⾜,只会部分缓存或者没有缓存,缓存会丢
失,memory_and_disk :内存不⾜ ,会使⽤磁盘)
(2)checkpoint 也是在触发action之后,执⾏任务。单独再启动⼀个job,负责写⼊数据到hdfs中。
(把rdd中的数据, 以⼆进制⽂本的⽅式写⼊到hdfs中,有⼏个分区,就有⼏个⼆进制⽂件)
(3)某⼀个RDD被checkpoint之后,他的⽗依赖关系会被删除,⾎缘关系被截断,该RDD转换成了
CheckPointRDD, 以后再对该rdd的所有操作,都是从hdfs中的checkpoint的具体⽬录来读取数据。缓
存之后,rdd的依赖关系还是存在的。
(4) Cache在程序结束后会被清除,Checkpoint的RDD在程序结束后依然存在,不会被删除。

67. 简述map和flatMap的区别和应⽤场景?

● map是对每⼀个元素进⾏操作, 常⽤于简单转换操作
● flatmap是对每⼀个元素操作后并压平,常⽤于如词频统计等场景。
示例对以下语句进⾏拆分:
“hello world"," how are you” map操作对上⾯的元素做单词切分会得到[hello,world],[how,are you]
flatmap操作对上⾯的元素做切分会得到[hello,world,how,are,you]
68. 描述⼀下RDD,DataFrame,DataSet的区别?
RDD的优点:
RDD是Spark最基本的数据结构,具有很⾼的灵活性和扩展性。由于它是不可变的,所以可以实现容错
性。另外,RDD可以在不同的计算节点上并⾏处理,因此可以加速数据处理和分析。
RDD的缺点:
RDD的操作是基于函数的,需要编写⼤量的代码,⽽且不容易优化。此外,RDD没有内置的优化器,因
此可能⽆法有效地处理⼤型数据集。
DataFrame的优点:
DataFrame提供了⼀种更⽅便的查询和操作表格数据的⽅式 。由于DataFrame有内置的优化器, 因此可
以提⾼查询性能。此外,DataFrame还提供了很多内置的函数和操作, 以便⽤户进⾏数据清洗、处理和
转换。
DataFrame的缺点:
DataFrame的类型安全性不如DataSet, 因为它使⽤了动态类型。此外,DataFrame只能处理结构化数
据, ⽆法处理半结构化或⾮结构化数据。
DataSet的优点:
DataSet是Spark中最新的数据结构,它结合了RDD和DataFrame的优点。与DataFrame相⽐,它具有更
⾼的类型安全性,因此可以避免在运⾏时出现错误。与RDD相⽐,它可以使⽤内置的优化器,因此可以
提⾼性能。
DataSet的缺点:
由于DataSet是Spark中较新的数据结构,因此缺乏⼴泛的社区⽀持和⽂档。此外,与DataFrame相⽐,
DataSet的学习曲线较陡峭, 需要更多的编程技能和经验。
总的来说,RDD、DataFrame和DataSet都有其优点和缺点,⽤户应根据实际需求选择最适合⾃⼰的数
据结构 。RDD适⽤于需要灵活性和扩展性的场景,DataFrame适⽤于结构化数据处理和查询场景,⽽
DataSet适⽤于需要类型安全和性能优化的场景。

69. 描述⼀下Spark中stage是如何划分的?描述⼀下shuffle的概念?

Stage的划分是根据宽依赖, 当触发action算⼦时,按照从后往前的回溯算法, 当遇到会发⽣shuffle算⼦
的时候,就会切分stage。
Stage的划分本质是shuffle,即当遇到会发⽣shuffle算⼦的时候划分Stage。
Shuffle⼜称洗牌,即将相同key按照⼀定的分配策略划分到同⼀个task中进⾏计算。当不同的节点上存在
相同key的时候, 这⾥会发⽣⽹络IO传输。
在⼤数据各种计算引擎技术中,⼀般都会遵循“移动数据不同移动计算”的原则。所以尽量减少shuffle的
发⽣,因为会涉及到⽹络传输、序列和反序列等耗时操作,降低处理效率。

70. RDD中的数据在哪?

RDD中的数据在数据源,RDD只是⼀个抽象的数据集,我们通过对RDD的操作就相当于对数据进⾏操
作。

71. 如果对RDD进⾏cache操作后,数据在哪⾥?

数据在第⼀执⾏cache算⼦时会被加载到各个Executor进程的内存中, 第⼆次就会直接从内存中读取⽽
不会区磁盘。

72. 哪⼀些算⼦会引起shuffle?

1)⼤部分含有byKey的算⼦都会发⽣shuffle,如reduceByKey、groupByKey、
sortByKey,combineByKey 等
2) 重分区类的算⼦:如repartition( 其底层调⽤的是coalesce(shuffle=true)),coalesce等
3)join类的算⼦:⽐如join、cogroup等
58
4)去重类算⼦,如distinct

73. stage的划分依据?

这⾥不仅需要说明划分的本质,还要知道为什么要划分,划分有什么好处?
⾸先stage的划分根据宽依赖来决定,说⽩了就是当遇到会发⽣shuffle算⼦的时候就会开始切分stage。
同⼀个Stage可以有多个task并⾏执⾏ 。那么这⾥需要知道宽窄依赖的区分:
● 宽依赖:⽗RDD的⼀个分区被⼦RDD的多个分区所依赖;且必须等到上⼀个阶段的计算完成后才能
计算下⼀个阶段
● 窄依赖:⽗RDD的⼀个分区只能被⼀个⼦RDD的⼀个分区所依赖,因此多个分区可以并⾏计算,⽽
且当⼀个分区的数据如果丢失,那么只需要重新计算对应的分区即可。
划分的核⼼算法就是回溯,反向解析,从触发action操作的那个rdd开始从后往前推,遇到窄依赖就加⼊到
本Stage中, 遇到宽依赖就进⾏划分
划分的好处:并⾏执⾏计算; 当发⽣容错时不需要全部重新计算,基于rdd⾎缘依赖只需重新计算相关分
区进⾏回溯即可。

74. 简述宽依赖和窄依赖概念,

groupByKey,reduceByKey,map,filter,union五种操作哪些会导
致宽依赖,哪些会导致窄依赖?
宽依赖:⽗RDD的⼀个分区被⼦RDD的多个分区所依赖;且必须等到上⼀个阶段的计算完成后才能计算
下⼀个阶段。
窄依赖:⽗RDD的⼀个分区只能被⼀个⼦RDD的⼀个分区所依赖,因此多个分区可以并⾏计算,⽽且当
⼀个分区的数据如果丢失,那么只需要重新计算对应的分区即可。
其中groupByKey,reduceByKey是会发⽣shuffle的 ,会导致宽依赖进⾏划分stage. map,filter,union不会发⽣shuffle,属于窄依赖。

75. Spark streaming如何保证7*24⼩时运⾏机制?

事前保证:
⾸先要考虑的是SparkStreaming内部容错,如Driver容错、Worker容错、Master⾼可⽤ 、断点续传等机
制。
59
然后再考虑程序的鲁棒性和扩展性, 集群组件的稳定性
事中监控:
程序上线运⾏后,需要时刻监测活跃状态以及处理的情况,做到及时告警。如在程序中嵌⼊
StreamListener时刻监控程序的异常情况。
事后修复:
程序重试机制,如当遇到系统崩溃或者对接组件挂掉导致程序不可⽤,那么需要及时进⾏切换重试,留
出恢复时间

76. 共享变量和累加器?

累加器( accumulator)是 Spark 中提供的⼀种分布式的变量机制,其原理类似于mapreduce,即分布
式的改变,然后聚合这些改变。累加器的⼀个常⻅⽤途是在调试时对作业执⾏过程中的事件进⾏计数。
⽽⼴播变量⽤来⾼效分发较⼤的对象。
共享变量出现的原因:
通常在向 Spark 传递函数时,⽐如使⽤ map() 函数或者⽤ filter() 传条件时,可以使⽤驱动器程序中定
义的变量,但是集群中运⾏的每个任务都会得到这些变量的⼀份新的副本,更新这些副本的值也不会影
响驱动器中的对应变量。
Spark 的两个共享变量,累加器与⼴播变量,分别为结果聚合与⼴播这两种常⻅的通信模式突破了这⼀
限制。

77. 缓慢渐变维的解决办法?

我们是使⽤拉量表,还可以使⽤全量快照和额外数据列保存历史状态。

78. 统计⽤户七天内连续登录的思路?

整体实现思路:
1)⽤户每天可能不⽌登陆⼀次,将登录⽇期去重,取出当⽇登陆成功的⽇期,row_number()函数分组排
序并计数
2) ⽇期减去计数得到值
3) 根据每个⽤户count(值)判断连续登陆天数
4) 最后取连续登陆天数⼤于等于7天的⽤户
60

79. 在测试中或者⽣产中,计算结果错误或者给到业务⼈员那边出错,该怎么解决?

1)第⼀ :我会与业务⼈员沟通,计算结果为什么错了,结果多了还是少了,多的话,多多少,少的话,
少多少?
2)第⼆:重新理解需求,看看是不是理解错误,若业务理解错误,则修改相关代码,并查看其余部分代
码是否有问题。
3)第三步:若是业务理解没出问题,那我们可以看SQL代码;有问题,改;没问题,查看数据源以及向
项⽬汇报,若是数据源出问题,则交给上游处理。

80. HBase了解吗?

个⼈在空闲时间了解过⼀些: ⽐如Hbase的调优,rowkey和列族怎么创建,HBase跟Hive的区别等。
HBase调优:
● ⾼可⽤
● 预分区
● 优化rowkey设计
● 内存优化
● 压缩
● column数优化
● 开启布隆过滤器
rowkey和列族怎么创建?
⼀个列族在数据底层是⼀个⽂件,所以将经常⼀起查询的列放到⼀个列族中,列族尽量少,减少⽂件的
寻址时间。
Hive跟hbase的区别是?
HiveSql 默认情况下会转换成MapReduce进⾏计算,所以⽐较慢,只能做离线数据分析,不能做实时查

HBase 是NoSql数据库,是物理表,不是逻辑表,虽然数据是存储在hdfs,但是读写速度⾮常快,适合
做⼤数据量的即时查询

81. 说⼀下hdfs的体系结构?

Hdfs由namenode、secondraynamenode、datanode组成。
NameNode 负责管理和记录整个⽂件系统的元数据
DataNode 负责管理⽤户的⽂件数据块,⽂件会按照固定的⼤⼩(blocksize)切成若⼲块后分布式存储
在若⼲台datanode上,每⼀个⽂件块可以有多个副本,并存放在不同的datanode上,Datanode会定期
向Namenode汇报⾃身所保存的⽂件block信息, ⽽namenode则会负责保持⽂件的副本数量
HDFS的内部⼯作机制对客户端保持透明, 客户端请求访问HDFS都是通过向namenode申请来进⾏
secondraynamenode 负责合并⽇志

82. hadoop 的 namenode 宕机,怎么解决?

先分析宕机后的损失,宕机后直接导致client⽆法访问, 内存中的元数据丢失,但是硬盘中的元数据应该
还存在,如果只是节点挂了,重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就
要找到原因修复了。但是最终的解决⽅案应该是在设计集群的初期就考虑到这个问题,做namenode的
HA。

83. 元数据的checkpoint?

每隔⼀段时间 ,会由secondary namenode将namenode上积累的所有edits和⼀个最新的fsimage下载到
本地,并加载到内存进⾏merge(这个过程称为checkpoint)。
namenode和secondary namenode的⼯作⽬录存储结构完全相同,所以, 当namenode故障退出需要重
新恢复时, 可以从secondary namenode的⼯作⽬录中将fsimage拷贝到namenode的⼯作⽬录, 以恢复
namenode的元数据。

84. hadoop中combiner和partition的作⽤?

combiner是发⽣在map的最后⼀个阶段,⽗类就是Reducer,意义就是对每⼀个maptask的输出进⾏局
部汇总, 以减⼩⽹络传输量,缓解⽹络传输瓶颈,提⾼reducer的执⾏效率。
partition的主要作⽤将map阶段产⽣的所有kv对分配给不同的reducer task处理, 可以将reduce阶段的
处理负载进⾏分摊。

85. ⽤mapreduce怎么处理数据倾斜问题?

数据倾斜:map /reduce程序执⾏时,reduce节点⼤部分执⾏完毕,但是有⼀个或者⼏个reduce节点运
⾏很慢,导致整个程序的处理时间很⻓,这是因为某⼀个key的条数⽐其他key多很多(有时是百倍或者
千倍之多),这条key所在的reduce节点所处理的数据量⽐其他节点就⼤很多,从⽽导致某⼏个节点迟迟
运⾏不完,此称之为数据倾斜。
1)局部聚合加全局聚合。
第⼀次在 map 阶段对那些导致了数据倾斜的 key 加上 1 到 n 的随机前缀,这样本来相
同的 key 也会被分到多个 Reducer 中进⾏局部聚合,数量就会⼤⼤降低。
第⼆次 mapreduce,去掉 key 的随机前缀,进⾏全局聚合。
思想:⼆次 mr,第⼀次将 key 随机散列到不同 reducer 进⾏处理达到负载均衡⽬的。第
⼆次再根据去掉 key 的随机前缀,按原 key 进⾏ reduce 处理。
这个⽅法进⾏两次 mapreduce,性能稍差。
2)增加 Reducer,提升并⾏度
JobConf.setNumReduceTasks(int)
3)实现⾃定义分区
根据数据分布情况, ⾃定义散列函数,将 key 均匀分配到不同 Red

86. Mapreduce 的 map 数量 和 reduce 数量是由什么决定的 , 怎么配置?

map的数量由输⼊切⽚的数量决定, 128M切分⼀个切⽚,只要是⽂件也分为⼀个切⽚,有多少个切⽚就
有多少个map Task。
reduce数量⾃⼰配置。

87. 分别举例什么情况要使⽤ combiner,什么情况不使⽤?

求平均数的时候就不需要⽤combiner,因为不会减少reduce执⾏数量。在其他的时候,可以依据情况,
使⽤combiner,来减少map的输出数量,减少拷贝到reduce的⽂件,从⽽减轻reduce的压⼒,节省⽹络
开销,提升执⾏效率。

88. HDFS数据安全性如何保证?

存储在HDFS系统上的⽂件,会分割成128M⼤⼩的block存储在不同的节点上,block的副本数默认3份,
也可配置成更多份;

第⼀个副本⼀般放置在与client(客户端)所在的同⼀节点上(若客户端⽆datanode,则随机放),第⼆
个副本放置到与第⼀个副本同⼀机架的不同节点,第三个副本放到不同机架的datanode节点, 当取⽤时
遵循就近原则;
datanode已block为单位, 每3s报告⼼跳状态,做10min内不报告⼼跳状态则namenode认为block已死
掉, namonode会把其上⾯的数据备份到其他⼀个datanode节点上,保证数据的副本数量;
datanode会默认每⼩时把⾃⼰节点上的所有块状态信息报告给namenode;

89. Hadoop优化有哪些⽅⾯?

1)HDFS ⼩⽂件影响
(1)影响 NameNode 的寿命,因为⽂件元数据存储在 NameNode 的内存中
(2)影响计算引擎的任务数量, ⽐如每个⼩的⽂件都会⽣成⼀个 Map 任务
2)数据输⼊⼩⽂件处理
(1)合并⼩⽂件:对⼩⽂件进⾏归档(Har) 、⾃定义 Inputformat 将⼩⽂件存储成SequenceFile ⽂
件。
(2)采⽤ ConbinFileInputFormat 来作为输⼊,解决输⼊端⼤量⼩⽂件场景。
(3)对于⼤量⼩⽂件 Job,可以开启 JVM 重⽤ 。
3)Map 阶段
(1)增⼤环形缓冲区⼤⼩。由 100m 扩⼤到 200m
(2)增⼤环形缓冲区溢写的⽐例。由 80%扩⼤到 90%
(3)减少对溢写⽂件的 merge 次数。(10 个⽂件,⼀次 20 个 merge)
(4)不影响实际业务的前提下, 采⽤ Combiner 提前合并,减少 I/O。
4)Reduce 阶段
(1)合理设置 Map 和 Reduce 数:两个都不能设置太少,也不能设置太多。太少,会导致 Task 等
待, 延⻓处理时间;太多,会导致 Map、Reduce 任务间竞争资源,造成处理超时等错误。
(2)设置 Map、Reduce 共存:调整 slowstart.completedmaps 参数,使 Map 运⾏到⼀定程度后,
Reduce 也开始运⾏,减少 Reduce 的等待时间。
(3)规避使⽤ Reduce,因为 Reduce 在⽤于连接数据集的时候将会产⽣⼤量的⽹络消耗。
(4)增加每个 Reduce 去 Map 中拿数据的并⾏数
(5)集群性能可以的前提下,增⼤ Reduce 端存储数据内存的⼤⼩。
5)IO 传输
(1)采⽤数据压缩的⽅式,减少⽹络 IO 的的时间。安装 Snappy 和 LZOP 压缩编码器。
(2)使⽤ SequenceFile ⼆进制⽂件
6)整体
(1) MapTask 默认内存⼤⼩为 1G,可以增加 MapTask 内存⼤⼩为 4-5g
(2)ReduceTask 默认内存⼤⼩为 1G,可以增加 ReduceTask 内存⼤⼩为 4-5g
(3) 可以增加 MapTask 的 cpu 核数,增加 ReduceTask 的 CPU 核数
(4)增加每个 Container 的 CPU 核数和内存⼤⼩
(5)调整每个 Map Task 和 Reduce Task 最⼤重试次数

90. 列出正常⼯作的hadoop集群中hadoop都分别启动哪些进程以及他们的作⽤?

1)NameNode它是hadoop中的主服务器,管理⽂件系统名称空间和对集群中存储的⽂件的访问,保存
有metadate。
2)SecondaryNameNode它不是namenode的冗余守护进程,⽽是提供周期检查点和清理任务。帮助
NN合并editslog,减少NN启动时间。
3) DataNode它负责管理连接到节点的存储(⼀个集群中可以有多个节点) 。每个存储数据的节点运⾏
⼀个datanode守护进程。
4) ResourceManager(JobTracker)JobTracker负责调度DataNode上的⼯作 。每个DataNode有⼀个
TaskTracker, 它们执⾏实际⼯作。
5) NodeManager(TaskTracker)执⾏任务
6) DFSZKFailoverController⾼可⽤时它负责监控NN的状态,并及时的把状态信息写⼊ZK。它通过⼀个
独⽴线程周期性的调⽤NN上的⼀个特定接⼝来获取NN的健康状态。FC也有选择谁作为Active NN的权
利, 因为最多只有两个节点, ⽬前选择策略还⽐较简单(先到先得,轮换)。
JournalNode ⾼可⽤情况下存放namenode的editlog⽂件.

91. yarn的三⼤调度策略?

FIFO Scheduler 把应⽤按提交的顺序排成⼀个队列,这是⼀个先进先出队列,在进⾏资源分配的时候,
先给队列中最头上的应⽤进⾏分配资源,待最头上的应⽤需求满⾜后再给下⼀个分配, 以此类推。
65
Capacity(容量)调度器,有⼀个专⻔的队列⽤来运⾏⼩任务,但是为⼩任务专⻔设置⼀个队列会预先
占⽤⼀定的集群资源,这就导致⼤任务的执⾏时间会落后于使⽤FIFO调度器时的时间。
在Fair(公平)调度器中,我们不需要预先占⽤⼀定的系统资源,Fair调度器会为所有运⾏的job动态的
调整系统资源 。当第⼀个⼤job提交时,只有这⼀个job在运⾏ ,此时它获得了所有集群资源;当第⼆个
⼩任务提交后,Fair调度器会分配⼀半资源给这个⼩任务,让这两个任务公平的共享集群资源。
92. 维度建模的模型有哪⼏种,他们有什么区别?
星型模型, 雪花模型,星座模型三种。
区别:
星型模式的核⼼是⼀个⼤的中⼼表(事实表),⼀组⼩的附属表(维表)。
● 星型模式是维度模型最简单的形式,也是数仓以及数据集市使⽤最⼴泛的形式。
● 维表只和事实表关联, 维表之间没有关联;
● 每个维表的主码为单列,且该主码放置在事实表中,作为两边连接的外码;
● 以事实表为核⼼,维表围绕核⼼呈星形分布。
雪花模式是星型模式的扩展,所谓的 “雪花化”就是将星型模式中的维度表进⾏规范化处理,进⼀步分解
到附加表(维表)中。
● 将维度表进⾏规范化的具体做法:把低基数的属性从维度表中移除并形成单独的表。
● 如主键列具有唯⼀值,所以有最⾼的基数,⽽像性别这样的列基数就很低。
● 在雪花模式中,⼀个维度被规范化成多个关联的维度表,⽽在星型模式中,每⼀个维度由⼀个单⼀
的维度表所表示 。⼀个规范化的维度对应⼀组具有层次关系的维度表,⽽事实表作为雪花模式的⼦
表,存在具有层次关系的多个⽗表。
星座模型中数据仓库由多个主题构成,包含多个事实表。
● ⽽维表是公共的,可以共享,这种模式可以看做星型模式的汇集,因⽽称作星系模式或者事实星座
模式。
● 事实星座模式是数据仓库最⻓使⽤的数据模式, 尤其是企业级数据仓库( EDW)。
● 这也是数据仓库区别于数据集市的⼀个典型的特征,
● 从根本上⽽⾔, 数据仓库数据模型的模式更多是为了避免冗余和数据复⽤,套⽤现成的模式,
● 是设计数据仓库最合理的选择 。在业务发展后期,绝⼤部分维度建模都采⽤的是星座模式。

93. Shuffle针对的是同⼀类型的数据还是不同类型的数据?

在Hive中,Shuffle指的是将Map任务的输出结果根据某个键进⾏重新分区的过程, 以便于将同⼀键的数
据发送到同⼀个Reduce任务进⾏处理。
Shuffle针对的是具有相同键的数据,⽽不是同⼀类型的数据。在Hive中,键是⽤户指定的⼀个或多个字
段,⽤于将数据分组到不同的Reduce任务中。因此,只要两个数据⾏的键相同,它们就可以被认为是同
⼀组数据, ⽆论它们的数据类型是什么。

94. orc存储和parquet存储的区别?

orc不⽀持嵌套结构(但可以通过复杂数据类型如map<k,v>间接实现),parquet⽀持嵌套结构。
orc与Hive的兼容性强 ,作为Hive的常⽤存储格式。
orc相⽐parquet的存储压缩率⽐较⾼。
orc导⼊数据和数据查询的速度⽐parquet快。

95. Hive的存储格式有哪⼏种?

TextFile, RCFile, ORCFile, parquetFil

96. 实际⼯作流程?

1)领取任务,需求分析,与产品或业务讨论,确定⼝径(维度),看报表的各个数据来⾃哪些表。
2)将业务逻辑过程设计好,与产品确定好后开发。
3) 开发出报表的SQL脚本,先跑测试,再跑⼏天历史数据,观察⽐对结果,并与产品确认数据是否有问
题。
4) 将SQL脚本放⼊调度任务中,第⼆天给产品经理看结果与可视化报表。
5)⽤调度器每天定时的跑脚本,周期性的将表结果导出或是导⼊到后台,⽣产可视化报表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值