大数据面试题(校招)

项目

1.介绍电商数仓项目

2.在项目中用的什么数据栈?

3.数据仓库建模几种方式

一般有关系建模和维度建模,关系建模遵循范式,一般有一范式、二范式、三范式、bc范式等。
维度建模一般有星型模型、雪花模型、星座模型。星型模型允许数据冗余但是减少shuffle、雪花模型一般遵循范式,数据冗余少但增多工作量。星座模型与前两种不冲突,由多张事实表汇总。

4.讲一下维度建模,维度表

维度建模有两种表:维度表、事实表。
事实表存储现实发生的操作型事件,每完成一次事件对应增加一次记录。维度表就是一件事件的多个维度。事实表多个外键与维度表关联。
维度建模4个过程:
选择业务过程、声明粒度、确认维度、确认事实。

12.为什么会发生数据倾斜,怎么解决

原因:大量空值、key分布不均。
解决:
1.在map后combine
2.两次mr,第一次map对key加随机前缀,就会平均分配到reducer中,第二次mr去除前缀,性能较低
3.增加reduce个数,提升并行度
4.自定义hash,将key平均分配
5.(hive)groupby代替distinct,distinct只有一个reduce任务
6.(hive)大表join小表:开启map_join,将小表加载到内存,在map端join,否则在reduce端join
7.(hive)大表join大表:a表加随机数,b表扩容,然后ab表聚合

6.提到了map_join代替普通join,面试官问为什么map_join能解决数据倾斜,具体流程怎样

见上

8.数仓分层(各层作用)

ods层:
保持数据不修改、压缩、创建分区表防止全表扫描
dwd层:
去空、过滤无意义数据、将用户行为和业务表一致性处理、脱敏、压缩、列式存储
dws层:
统计各个主题当天行为
dwt层:
以分析的主题对象为建模驱动,基于上层的应用和产品的指标需求,构建主题对象的全量宽表,是累计的度量值
ods层:
对各个指标分析

9.数仓建设的理论(哪两种)为什么用这种?

维度建模:减少关联
关系建模:完整性,准确性,减少冗余,节省存储空间

10.星型模型和雪花模型介绍,各自的适合什么样的数据场景

星型模型:效率高,方便查询
雪花模型:冗余小、规范

13.什么是事务

事务是一组不可再分割的操作集合

hadoop

shuffle,yarn,hdfs读写流程

2.mapreduce从map-shuffle-reduce整个流程

map方法之后,数据首先进入分区方法,标记好分区之后,数据写入环形缓冲区中,环形缓冲区100M,在缓冲区内进行分区和分区内排序,快排,写到80%时,进行反向溢写,溢写会产生大量溢写文件,多个溢写文件采用分区内归并排序,形成大的溢写文件,可自定义combiner方法进行汇总操作,写到磁盘中等待拉取。
reduce task按照自己的分区号拉取各个 MapTask 机器上相应的结果分区数据,数据存到内存中,如果不够就存到硬盘中,然后归并排序, shuffle过程结束,进入reduce方法。

3.HDFS在写入过程中如何保证packet传输的一致性(提了块写完报告NN,数据队列和确认队列,宕机怎么办 但都不是面试官要的 貌似是每个packet传输完如何确认,跟谁报告,怎么报告 要回去翻下权威手册了)

4.基于yarn集群的任务提交过程

大数据面试题(校招)_第1张图片

5.MapReduce的流程,其中有几次排序

最少:map快排、归并、reduce归并三次

6.介绍下hdfs读写过程(比较关键的能体现出深度的点,写数据时客户端维护发送数据的发送队列、确认队列、容错处理、管道处理,读数据获取分块的地址并按拓扑排序距离返回、读的透明性)

  1. 客户端向namenode请求下载文件
  2. namenode获取第一块block的locations,同一个block有多个副本,按拓扑排序(远近),离客户端最近的排在前面
  3. 客户端会按照locations排序与对应的datanode连接,向datanode请求读数据
  4. datanode向客户端传输数据
  5. 读完第一块,关闭datanode连接,重复,直到读完所有block,这些操作对客户端来说是透明的(也就是用户不需要知道下面都做了什么),客户端的角度看来只是读一个持续不断的流。
  6. 客户端组装所有block

  1. 客户端向namenode发送请求
  2. namenode检查文件路径是否存在、是否重名、权限等
  3. namenode向客户端相应可以发送
    10.客户端把文件切块,块即packet(64k),写到发送队列data queue中,并询问namenode该写在哪
  4. namenode查询datenode信息,规划block存储位置
  5. namenode返回可以存储的ip列表,即pipeline管道
  6. 客户端向管道第一个发送数据,第一个向第二个发送数据,以此类推。
  7. 容错机制:还有一个确认队列ack queue,也是由packet构成,等到所有pipeline中所有的datanode都表示已经收到的时候,ack queue才会删除对应的packet。当某个datanode发生错误的时候,采用以下几步:
    1. pipeline 被关闭掉;
    2. 为了防止丢包 ack queue 里的 packet 会同步到 data queue 里;
    3. 把产生错误的 datanode 上当前在写但未完成的 block 删掉;
    1. block 剩下的部分被写到剩下的两个正常的 datanode 中;
    2. namenode 找到另外的 datanode 去创建这个块的复制(也是三个的)。
      当然,这些操作对客户端来说是无感知的(透明性)。
  8. 关闭写入流

7.知道historyserver吗,有什么作用,处了能记录历史记录尼,它对保留的历史数据的清除策略是怎样的

8.mr、sparkshuffle区别(mr默认排序,spark不一定排序具体看编写时的场景,这里问蛮多,可以引导到spark join底层几种方式,也涉及到排序或者hash跟shuffle时的策略有关系)

9.reduce怎么知道去哪里拉去map结果集

map任务结束后通知MapReduceApplicationMaster,reduce定期向MRAM询问map输出与主机的对应关系。直到获得所有输出位置。

10.MapReduce为什么要排序?

shuffle排序,按字典顺序排序的,目的是把相同的的key可以提前一步放到一起。

shuffle就是把key相同的东西放到一起去,其实不用sort(排序)也能shuffle,那为什么要sort排序呢?

sort是为了通过外排(外部排序)降低内存的使用量:因为reduce阶段需要分组,将key相同的放在一起进行规约,使用了两种算法:hashmap和sort,如果在reduce阶段sort排序(内部排序),太消耗内存,而map阶段的输出是要溢写到磁盘的,在磁盘中外排可以对任意数据量分组(只要磁盘够大),所以,map端排序(shuffle阶段),是为了减轻reduce端排序的压力。

hive

数据倾斜,小文件,优化,hql->mr,四个排序

1.order by和sort by的区别

全局排序,分组排序

2.sort by 和 order by分别是在哪个阶段排序

sort by :reduce前

3.写hive遇到什么问题

4.大表 join 大表数据倾斜怎么办?

a表加随机数,b表扩容,聚合

5.HQL怎样编码成MR(各个流程,详细描述)

sql->AST->query block->operator tree->优化->mr任务树->优化->提交

hiveSQL被parser(解析)成AST(抽象语法树)
AST转化成query block(查询块)
query block被转化成operator tree(操作树)
优化operator tree
operator tree转化成mr任务
优化成最终的mr任务

6.hive调优

mapjoin
行列过滤
列式存储
分区
设置map、reduce个数
小文件:jvm重用、combiner、marge
开启combiner
压缩
换引擎

7.hive使用spark做计算引擎时 sql语句的转换过程 和mr做计算引擎的区别(答的很不理想 前面说了hivesql转换为mr的过程 面试第一次遇到这个问题 一下子就蒙了 八股文的下场)

8.面对特别大的数据量hive怎么去做优化处理

9.udf是怎么在hvie里执行的(打包成jar上传到集群,注册自定义函数,通过类加载器载入系统,在sql解析的过程中去调用函数)

10.编写特别复杂的sql有没有什么好的解决方法(udf)

11.hive 和 spark sql、spark on hive的区别

12.小文件优化

开启combiner
jvm重用
两个mr(marge)

13.hive数据倾斜

1、数据倾斜的原因:
(1)、key分布不均匀。
(2)、业务数据本身的原因。
(3)、建表考虑不周。
(4)、某些SQL本身就有数据倾斜。

2、如何避免数据的倾斜:

(1)给key一个随机的值,打散key。

(2)Hive中的参数调节:
①hive.map.aggr = true---------------作用Map 端部分聚合,相当于Combiner
②hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为 true,生成的查询计划会有两个 MR Job。第一个 MR Job 中,Map 的输出结果集合会随机分布到 Reduce 中,每个 Reduce 做部分聚合操作,并输出结果,这样处理的结果是相同的 Group By Key 有可能被分发到不同的 Reduce 中,从而达到负载均衡的目的;第二个 MR Job 再根据预处理的数据结果按照 Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个 Reduce 中),最后完成最终的聚合操作。

(3)SQL语句的调节:1、选用join key分布最均匀的表作为驱动表。2、大小表join的时候,让维度较小的表先进内存。3、大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上。4、count distinct大量相同特殊值。

14.hive 四种文件类型和压缩情况

TEXTFILE,
Hive数据表的默认格式,存储方式:行存储。
可以使用Gzip压缩算法,但压缩后的文件不支持split
在反序列化过程中,必须逐个字符判断是不是分隔符和行结束符,因此反序列化开销会比SequenceFile高几十倍。
SEQUENCEFILE
压缩数据文件可以节省磁盘空间,但Hadoop中有些原生压缩文件的缺点之一就是不支持分割。支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。Sequence File是可分割的文件格式,支持Hadoop的block级压缩。
Hadoop API提供的一种二进制文件,以key-value的形式序列化到文件中。存储方式:行存储。
sequencefile支持三种压缩选择:NONE,RECORD,BLOCK。Record压缩率低,RECORD是默认选项,通常BLOCK会带来较RECORD更好的压缩性能。
优势是文件和hadoop api中的MapFile是相互兼容的
RCFILE
存储方式:数据按行分块,每块按列存储。结合了行存储和列存储的优点:
RCFile 保证同一行的数据位于同一节点,因此元组重构的开销很低
像列存储一样,RCFile 能够利用列维度的数据压缩,并且能跳过不必要的列读取
数据追加:RCFile不支持任意方式的数据写操作,仅提供一种追加接口,这是因为底层的 HDFS当前仅仅支持数据追加写文件尾部。
行组大小:行组变大有助于提高数据压缩的效率,但是可能会损害数据的读取性能,因为这样增加了 Lazy 解压性能的消耗。而且行组变大会占用更多的内存,这会影响并发执行的其他MR作业。 考虑到存储空间和查询效率两个方面,Facebook 选择 4MB 作为默认的行组大小,当然也允许用户自行选择参数进行配置。
ORCFILE
存储方式:数据按行分块,每块按照列存储。
压缩快,快速列存取。效率比rcfile高,是rcfile的改良版本。

压缩工具对比
大数据面试题(校招)_第2张图片

15.hive常用函数

一、常用日期函数

  1. unix_timestamp:返回当前或指定时间的时间戳
    select unix_timestamp();
    select unix_timestamp(“2020-10-28”,‘yyyy-MM-dd’);

  2. from_unixtime:将时间戳转为日期格式
    select from_unixtime(1603843200);

  3. current_date:当前日期
    select current_date;

  4. current_timestamp:当前的日期加时间
    select current_timestamp;

  5. to_date:抽取日期部分
    select to_date(‘2020-10-28 12:12:12’);

  6. year:获取年
    select year(‘2020-10-28 12:12:12’);

  7. month:获取月
    select month(‘2020-10-28 12:12:12’);

  8. day:获取日
    select day(‘2020-10-28 12:12:12’);

  9. hour:获取时
    select hour(‘2020-10-28 12:13:14’);

  10. minute:获取分
    select minute(‘2020-10-28 12:13:14’);

  11. second:获取秒
    select second(‘2020-10-28 12:13:14’);

  12. weekofyear:当前时间是一年中的第几周
    select weekofyear(‘2020-10-28 12:12:12’);

  13. dayofmonth:当前时间是一个月中的第几天
    select dayofmonth(‘2020-10-28 12:12:12’);

  14. months_between: 两个日期间的月份
    select months_between(‘2020-04-01’,‘2020-10-28’);

  15. add_months:日期加减月
    select add_months(‘2020-10-28’,-3);

  16. datediff:两个日期相差的天数
    select datediff(‘2020-11-04’,‘2020-10-28’);

  17. date_add:日期加天数
    select date_add(‘2020-10-28’,4);

  18. date_sub:日期减天数
    select date_sub(‘2020-10-28’,-4);

  19. last_day:日期的当月的最后一天
    select last_day(‘2020-02-30’);

  20. date_format(): 格式化日期
    select date_format(‘2020-10-28 12:12:12’,‘yyyy/MM/dd HH:mm:ss’);

二、常用取整函数
21. round: 四舍五入
select round(3.14);
select round(3.54);

  1. ceil: 向上取整
    select ceil(3.14);
    select ceil(3.54);

floor: 向下取整
23. select floor(3.14);
select floor(3.54);

三、常用字符串操作函数
24. upper: 转大写
select upper(‘low’);

  1. lower: 转小写
    select lower(‘low’);

  2. length: 长度
    select length(“atguigu”);

  3. trim: 前后去空格
    select trim(" atguigu ");

  4. lpad: 向左补齐,到指定长度
    select lpad(‘atguigu’,9,‘g’);

  5. rpad: 向右补齐,到指定长度
    select rpad(‘atguigu’,9,‘g’);

  6. regexp_replace:使用正则表达式匹配目标字符串,匹配成功后替换!
    SELECT regexp_replace(‘2020/10/25’, ‘/’, ‘-’);

四、集合操作
31. size: 集合中元素的个数
select size(friends) from test3;

  1. map_keys: 返回map中的key
    select map_keys(children) from test3;

  2. map_values: 返回map中的value
    select map_values(children) from test3;

  3. array_contains: 判断array中是否包含某个元素
    select array_contains(friends,‘bingbing’) from test3;

  4. sort_array: 将array中的元素排序
    select sort_array(friends) from test3;

五、多维分析
36. grouping sets:多维分析

16.hive的复杂数据类型

Array,Map,Struct

spark

0.rdd算子

1.spark运行流程

大数据面试题(校招)_第3张图片

大数据面试题(校招)_第4张图片

2.rdd宽窄依赖

3.spark在rdd转换时如何确认数据块的来源(答分RDD由不同分区组成,每个分区对应一4.个数据块,通过分区索引区分数据块。 但好像不太满意)

5.Spark的优点是什么

6.spark提交过程

7.spark和hive的联系

8.groupbykey、reducebykey区别(1、groupByKey算子的功能固定,只能输出相同key值的序列,reduceByKey适用于分组排序过程中有数据聚合操作(sum)的情形,在其他场景下可能不适用。

9.reduceByKey算子在分区内会进行数据聚合操作,因此针对有sum的数据聚合操作,效率会更高一些。(groupByKey算子也能实现类似sum的数据聚合操作,相当于进行groupByKey操作后还需进行map类算子的sum操作)

10.spark sql怎么转换成java

11.spark SQL的优化

12.spark资源调度任务调度

13.hive构建数据仓库为什么要使用spark引擎

14.Spark运行架构、优化

15.flink和spark的区别

16.spark广播变量

17.sparkstreaming微批处理会吗

18.提升spark运行效率的方法

19.spark stage划分

20.Flink和Sparkstreanming区别

21.Spark运行过程

22.你们集群多大,spark中怎么给资源的,还有就是你们给资源是根据啥的

23.spark怎么查看数据是倾斜的

24.说说你对spark的理解

25.Hive on spark与SparkSql的区别

26.SparkStreaming和flink有什么区别;

27.Kafka和ZK的关系,Kafka元数据还能存哪

28.spark跑批和hive跑批处理问题的时候有什么不一样吗

29.spark的任务流程调度

30.spark相关的算子

java

1.Java面向对象三大特性

封装:属性方法私有化
继承:相同的属性方法提取出来
多态:同一个对象,在不同时刻表现出来的不同状态。

2.什么时候用多态

多态
(1)同一个对象,在不同时刻表现出来的不同状态。
(2)前提:
A:有继承或者实现关系。
B:有方法的重写。
C:有父类(接口)的引用指向子类对象。
(3)多态中的成员使用特点:
Fu fz = new Zi();
多态时,所有表现形式都是父类的表现形式,
只有调用方法时,运行的是子类重写的方法
A:成员变量
编译看左边,运行看左边。
B:成员方法
编译看左边,运行看右边。
(4)多态中的转型:
A:向上转型
把子类对象赋值给父类(接口)的引用
B:向下转型
把父类(接口)的引用强制转换成子类对象
(5)多态的好处及弊端:
A:好处
提高了程序可维护性和可扩展性。
B:弊端
不能使用子类特有内容。
要想使用,要么向下转型,要么重新创建子类对象。
instanceof 关键字:用于引用数据类型判断
格式: 对象名 instanceof 类名
返回值: true, false
作用: 判断某个对象是否属于某种数据类型

多态的例子
大数据面试题(校招)_第5张图片
String.valueOf()可以将对象转化为字符串,它的入参是Object,设想一下,如果没有多态,那么String.valueOf()函数内部就需要判断入参Object对象到底是Integer,还是HashMap,还是Thread,还是用户自定义类等等,然后调用对应类的toString(),这显然十分麻烦,而这个问题用多态就可以解决,因为所有类都默认继承了Object类,所以只需要一句obj.toString()就可以,无需关心入参到底是Object的哪个子类,在运行时用户传入对象后jvm会判断到底该调用哪个类的toString()方法。

3.Java中的反射

4.Java集合的框架体系图

5.Hashmap和Treemap的区别

HashMap的底层结构是Node的数组
TreeMap的底层是一个Entry,他的实现是一个红黑树,方便用来遍历和搜索。

hashmap不排序
treemap排序

HashMap可以允许一个null key和多个null value。
TreeMap不允许null key,但是可以允许多个null value。

HashMap的底层是Array,所以HashMap在添加,查找,删除等方法上面速度会非常快。TreeMap的底层是一个Tree结构,在添加和删除节点的时候会进行重排序,所以速度会比较慢。

HashMap因为要保存一个Array,所以会造成空间的浪费,
TreeMap只保存要保持的节点,所以占用的空间比较小。

HashMap如果出现hash冲突的话,效率会变差,不过在java 8进行TreeNode转换之后,效率有很大的提升。

6.哈希表

7.jvm内存模型

大数据面试题(校招)_第6张图片

8.如果打破双亲委派机制,加载了不同系统同名的类会出现什么问题

9.双亲委派机制大数据面试题(校招)_第7张图片

大数据面试题(校招)_第8张图片

10.创建类的几种方式,他们的区别

11.java遇到过内存溢出吗,怎么解决的。给他扯到跑spark遇到过,driver、executor、堆内堆外内存调优

12.使用线程池有什么好处

13.有几种创建线程池的方法

14.有两个包名、类名相同的类能不能正确加载会出现哪些问题(编写自定义类加载器来实现)

15.final关键字

16.String能不能被继承

17.Java中抽象类和接口的区别

抽象类(抽象类就是为了被继承):抽象类中的抽象方法必须定义为protected或者public,因为如果我们将其定义为私有的话,就无法被子类继承(其实也不是不好继承,而是不好调用);抽象类中的抽象方法如果没有在某一个子类中实现,那这个子类也要声明为抽象类;抽象类是不可以实例化的;一个类只能继承一个抽象类
接口(为了方法而生):接口中可以有变量和方法,但是接口中的变量是被强制置为public static final 的,并且只能为该类型;接口中的方法,能且只能是public abstract方法,而且对于接口中的方法都不能有具体实现;一个列可以多继承接口

oom

类加载机制

关于java面试题,请看https://www.bilibili.com/video/BV12b4y167Mb

数据结构和算法

1.动态规划原理

2.时间复杂度为nlog(n)的排序方法有哪些

快排、归并、堆
大数据面试题(校招)_第9张图片

3.快排原理

常见sql题

计算机网络、数据库理论

其他

1.flume和kafka是怎么配置的

2.kafka在什么地方需要用到zookeeper

kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。zookeeper中存储的信息有broker,consumer等重要znode信息;kafka节点broker的选举也是通过zookeeper来实现,主要流程是在zookeeper创建/controller临时节点来实现leader选举,并在该节点中写入当前broker的信息,利用Zookeeper的强一致性特性,一个节点只能被一个客户端创建成功,创建成功的broker即为leader,即先到先得原则,leader也就是集群中的controller,负责集群中所有大小事务

反问

你可能感兴趣的:(项目,大数据)