阿里巴巴大数据开发高频面试题及答案【互联网回暖了!!!】
推荐阅读文章列表:大数据开发面试笔记V4.0 || 面试聊数仓第一季 || 小白大数据学习路线
一、前言
阿里巴巴2024届校园招聘正式开启,注意1+6+N分开招聘,机会变多了
冲起来,兄弟姐妹们,我帮大家整理好了大数据开发的高频面试题,希望对你有用!!!
注意:以下仅涉及大数据开发的知识,并不是说面试只会问这些,一般还会问java和计算机基础的八股文
二、高频面试题总结
1. MapReduce Shuffle为什么要将数据写入环形缓冲区
Map的输出结果是由collector处理的,每个Map任务不断地将键值对输出到在内存中构造的一个环形数据结构中。使用环形数据结构是为了更有效地使用内存空间,在内存中放置尽可能多的数据。
2. MapReduce Shuffle为什么容易发生数据倾斜
因为key分布不均匀,在shuffle的时候,大量的key可能分配到某一个reduce当中,这就会产生数据倾斜
3. MapReduce 实现join
public class Job_JoinDriver { // mapper static class Job_JoinMapper extends Mapper<LongWritable, Text, Text, Text> { Text k = new Text(); Text v = new Text(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { // 通过切片获取到当前读取文件的文件名 InputSplit inputSplit = context.getInputSplit(); FileSplit fileSplit = (FileSplit) inputSplit; String path = fileSplit.getPath().getName(); // 定义 sid 用于存放获取的 学生ID String sid; String[] split = value.toString().split("\\s+"); // 判断文件名 if (path.startsWith("student")) { // 学生表的 ID 在第一位 sid = split[0]; // 将整条数据作为 vlaue,并添加 Stu 的标识 v.set("Stu" + value); } else { // 成绩表的 ID 在第二位 sid = split[1]; // 将整条数据作为 vlaue,并添加 Sco 的标识 v.set("Sco" + value); } k.set(sid); context.write(k, v); } } // reducer static class Job_JoinReducer extends Reducer<Text, Text, Text, Text> { @Override protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 用于存放获取到的学生信息 String stuContext = ""; // 用于存放学生的各科成绩 LinkedList<String> scoContext = new LinkedList<>(); for (Text value : values) { String res = value.toString(); // 根据添加的标识,来区分学生信息和成绩 if (res.startsWith("Stu")){ stuContext = res.substring(3); } else { scoContext.add(res.substring(3)); } } for (String score : scoContext) { // 将学生成绩与学生信息拼接 Text v = new Text(stuContext + " " + score); context.write(key, v); } } } }
4. Hadoop HA架构
Hadoop的HA应该分为HDFS 的 HA 和 YARN 的 HA,主要是解决NameNode和ResourceManager的单点故障问题,所以HA就是通过配置Active/Standby两个实例来解决单点故障
5. Hadoop HA当一个namenode挂掉,会有数据丢失吗
不会丢失,当Active挂了之后,Standby节点会变为Active节点,其中ZKFC即ZKFailoverController,作为独立进程存在,负责控制NameNode的主备切换
6. Hadoop和Spark的区别,Spark做了哪些优化
区别这里就不提了,之前文章发过很多次。做的优化有:内存管理中间结果、优化数据格式、优化执行策略...
7. Spark有哪几种运行模式
Local、standalone、yarn
8. Spark的stage划分是怎么实现的
从最后一个RDD往前推,遇到窄依赖的父RDD时,就将这个父RDD加入子RDD所在的stage;遇到宽依赖的父RDD时就断开,父RDD被划分为新的stage。每个Stage里task的数量由Stage最后一个RDD中的分区数决定。如果Stage要生成Result,则该Stage里的Task都是ResultTask,否则是ShuffleMapTask。
9. SQL中on和where的区别
on和where后都是查询条件,ON 语句用于在进行多表查询的时候确定两个表之间的连接关系,WHERE 语句用于在单表查询或多表查询的时候筛选数据;如果同时存在,on先执行,where后执行
10. Left join和 Left semi join区别
- Left join:主表记录全部有,如果从表多行的话,主表数据就被重复了一次。
- Left semi join:不重复,主表找到第一条就返回记录,如果找不到就不显示,说白了就等价于exists或者in。
11. semi join如何去优化
使用in子查询,并且将子查询进行物化
12. 请问你用过哪些HQL函数
面试需要解释每个函数的意思
get_json_object、collect_set、rank、row_number、lag、lead、first_value....
13. 请问你遇到过数据倾斜吗
请看前面的文章,面试必问!!!
14. 事实表的设计流程
- 选择业务过程以及确定事实表类型
- 声明粒度
- 确定事实
- 确定维度
- 冗余维度
15. 在10亿个整数中找出不重复的整数
采用2bit的bitmap(00表示不存在,01表示出现1次,10表示出现多次,11表示无意义),共需内存 2^32*2bit=1GB内存,可以接受,然后扫描这10亿个整数,查看bitmap中相对应的位,如果是00变01、01变10或者10保持不变,扫描完后,查看bitmap,把对应为是01的整数输出。
#数据人的面试交流地##我发现了面试通关密码##阿里巴巴信息集散地#