阿里巴巴大数据开发高频面试题及答案【互联网回暖了!!!】

推荐阅读文章列表:大数据开发面试笔记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,主要是解决NameNodeResourceManager的单点故障问题,所以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. 事实表的设计流程

  1. 选择业务过程以及确定事实表类型
  2. 声明粒度
  3. 确定事实
  4. 确定维度
  5. 冗余维度

15. 在10亿个整数中找出不重复的整数

采用2bit的bitmap(00表示不存在,01表示出现1次,10表示出现多次,11表示无意义),共需内存 2^32*2bit=1GB内存,可以接受,然后扫描这10亿个整数,查看bitmap中相对应的位,如果是00变01、01变10或者10保持不变,扫描完后,查看bitmap,把对应为是01的整数输出

#数据人的面试交流地##我发现了面试通关密码##阿里巴巴信息集散地#
全部评论

相关推荐

7 58 评论
分享
牛客网
牛客企业服务