字节-商业化部-数据研发面经【附答案】

近期,有参加春招的同学和我交流了他的面试历程,我针对这些内容进行了细致的总结与梳理,并在此分享出来,希望能助力大家学习与借鉴。

1. 自我介绍

大家好,我是xxx,就读于xxx学校,今天我主要从专业技能和项目经历两个方面来介绍,在学校期间,学习过Hadoop、Spark、Flink等大数据框架以及Spring、SpringBoot等web框架,同时做过一个数仓的项目,整个项目分为3个模块,xxx;曾经在xx家公司工作/实习过xx时间,做的主要工作包括3个部分,分别是xxx;以上就是我的自我介绍,谢谢面试官

2.八股文

1)RDD是什么

全称(Resilient Distributed Dataset)叫做弹性分布式数据集,是一种数据结构,可以理解成是一个集合。在代码中的话,RDD是一个抽象类。还有一个非常重要的特点:RDD是不保存数据的,仅仅封装了计算逻辑,也就是你直接打印RDD是看不见具体值的。

2)你刚刚提到RDD是弹性分布式数据集,弹性指什么

  • 第一、数据容错性,当某个RDD发生故障导致数据丢失时,RDD可以通过其血缘机制重新计算丢失的数据分区,而不需要进行频繁的数据冗余备份和复杂的检查点操作,从而实现数据的自我恢复和容错
  • 第二、动态调整性,RDD的数据可动态划分为多个分区,用户可通过 repartition 或 coalesce 调整分区数量,优化并行度以适应资源变化

3)Spark SQL的Join有几种方式

主要有三种方式,分别是broadcast hash join、shuffle hash join、sort merge join

  • 先说一下hash join吧,这个算法主要分为三步,首先确定哪张表是build table和哪张表是probe table,这个是由spark决定的,通常情况下,小表会作为build table,大表会作为probe table;然后构建hash table,遍历build table中的数据,对于每一条数据,根据join的字段进行hash,存放到hashtable中;最后遍历probe table中的数据,使用同样的hash函数,在hashtable中寻找join字段相同的数据,如果匹配成功就join到一起。这就是hash join的过程
  • broadcast hash join分为broadcast阶段和hash join阶段,broadcast阶段就是将小表广播到所有的executor上,hash join阶段就是在每个executor上执行hash join,小表构建为hash table,大表作为probe table
  • shuffle hash join分为shuffle阶段和hash join阶段,shuffle阶段就是对两张表分别按照join字段进行重分区,让相同key的数据进入同一个分区中;hash join阶段就是对每个分区中的数据执行hash join
  • sort merge join分为shuffle阶段、sort阶段和merge阶段,shuffle阶段就是对两张表分别按照join字段进行重分区,让相同key的数据进入同一个分区中;sort阶段就是对每个分区内的数据进行排序;merge阶段就是对排好序的分区表进行join,分别遍历两张表,key相同就输出,如果左边小,就继续遍历左边的表,反之遍历右边的表

4)Spark的调优方法有哪些

  • 资源分配优化:
  • 合理设置 Executor 数量 :num-executors 参数用于设置应用运行时 Executor 的数量,通常可以根据集群资源和任务需求进行设置。一般建议 num-executors = spark.cores.max / spark.executor.cores,在资源允许的情况下,适当增加 Executor 的数量可以提高任务的并行度,从而提升性能。
  • 调整每个 Executor 的内存 :executor-memory 参数用于设置每个 Executor 的内存大小,对 Spark 作业运行的性能影响很大,适当增加每个 Executor 的内存量,可以提升性能。
  • 设置 Executor 的 CPU 核心数 :executor-cores 参数用于设置每个 Executor 的 CPU 核心数,在资源允许的情况下,增加每个 Executor 的 CPU 核心数可以提高执行 task 的并行度,从而提升性能。
  • AQE(自适应查询执行):在运行时,每当shuffle map阶段执行完毕,AQE会结合这个阶段的统计信息,基于既定的规则动态的调整,修改尚未执行的逻辑计划和物理计划,来完成对原始查询语句的运行时优化动态合并分区:可以在任务开始时设置较多的shuffle分区个数,然后在运行时通过查看shuffle文件统计信息将相邻的小分区合并成更大的分区动态切换join策略:由Sort Merge Join切换成Broadcast Hash Join动态优化join倾斜:将倾斜的分区数据拆分成多个分区

5)你用过Flink吗

用过,Flink是一个分布式的计算框架,主要用于对有界和无界数据流进行有状态计算,其中有界数据流就是指离线数据,有明确的开始和结束时间,无界数据流就是指实时数据,源源不断没有界限,有状态计算指的是 在进行当前数据计算的时候,我们可以使用之前数据计算的结果。Flink还有一个优点就是提供了很多高级的API,比如DataSet API、DataStream API、Table API和FlinkSQL

6)Flink的双流Join有哪几种

主要有四种方式,分别是:滚动窗口Join、滑动窗口Join、会话窗口Join、时间区间Join

  • Tumbling Window Join:滚动窗口 Join,窗口无重叠,固定大小,以固定的时间间隔滑动。例如,每 5 秒为一个窗口,每隔 5 秒滑动一次。这种 Join 适用于对时间窗口内数据进行固定周期的聚合或关联操作。
  • Sliding Window Join:滑动窗口 Join,窗口有重叠,以固定的时间间隔滑动,窗口大小和滑动间隔可配置。比如窗口大小为 10 秒,滑动间隔为 5 秒,这样窗口之间会有 5 秒的重叠部分。它可以在不同的时间窗口上进行数据关联,获取更灵活的分析结果。
  • Session Window Join:会话窗口 Join,基于会话的窗口 Join,窗口的开始和结束由数据的活动间隔决定。当数据在一定时间内没有新的事件发生时,会话窗口就会关闭。这种 Join 适合对用户会话等具有自然边界的数据进行关联分析。
  • Interval Join :时间区间Join,允许在一个流的时间范围内与另一个流进行 Join。例如,可以根据某个事件的时间范围,将两个流中在这个时间范围内的数据进行关联。这种 Join 类型适用于处理具有时间相关性的数据,如根据某个时间段内的订单数据和库存数据进行关联分析

7)数仓分层的优势是什么

  • 第一、复杂需求简单化;我们通过将复杂的问题分解为多个步骤来完成,每一层只处理单一的步骤,比较容易和理解
  • 第二、提高数据的复用性;比如在已经得到最终结果之后,又需要中间层的一些数据,我可以直接查询中间层的数据,不必重新进行计算

8)数仓建模的方法有哪些

  • ER模型是Inmon提出的,这个模型是符合3NF的,他的出发点就是整合数据,将各个系统中的数据以整个企业角度按主题进行分类,但是不能直接用于分析决策
  • 维度模型是Kimball提出的,这个人和Inmon算是数仓的两个流派,他的出发点就是分析决策,为分析需求服务,而现在多数的数仓的搭建都是基于维度模型进行搭建的。
  • 区别:ER模型冗余更少,但是在大规模数据跨表分析中,会造成多表关联,这会大大降低执行效率

9)OLAP数据库用过哪些

主要用过Kylin、Druid、ClickHouse等

10)ClickHouse为什么查询快

  • 第一、ClickHouse 采用列存储方式,将数据按列存储在磁盘上,分析查询可以大大减少读取数据量,提高查询效率
  • 第二、ClickHouse支持分布式部署,数据可以在多个节点之间进行分片存储和并行处理,充分利用集群资源来提高查询性能
  • 第三、ClickHouse为每个表构建了稀疏索引,查询时可通过索引快速定位到需要读取的数据块,减少磁盘IO操作
  • 第四、ClickHouse在查询处理过程中采用了向量化技术,将数据以向量的形式进行处理,而不是逐行处理,提高数据处理速度

3.项目

1)你做过最复杂的项目是什么,详细介绍一下

2)在项目中遇到过的最大的难点是什么

4.刷题

SQL题

题目:计算部门平均工资(要求去除部门最高和最低工资)

参考答案:

SELECT 
  dept_name, 
  AVG(salary) avg_salary 
FROM 
  (
    SELECT 
      emp_id, 
      dept_name, 
      salary, 
      ROW_NUMBER() OVER(
        PARTITION BY dept_name 
        ORDER BY 
          salary
      ) AS rk1, 
      ROW_NUMBER() OVER(
        PARTITION BY dept_name 
        ORDER BY 
          salary desc
      ) AS rk2 
    FROM 
      dwd_emp_info_dd
  ) a 
WHERE 
  rk1 != 1 AND rk2 != 1 
GROUP BY 
  dept_name;

算法题:

题目:最长回文子串(LeetCode第5题)

参考答案:

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        int start = 0, maxLen = Integer.MIN_VALUE;
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i; j < n; j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    if (j - i <= 2 || dp[i + 1][j - 1])
                        dp[i][j] = true;
                }
                if (dp[i][j] == true && j - i + 1 > maxLen) {
                    start = i;
                    maxLen = j - i + 1;
                }
            }
        }
        return s.substring(start, start + maxLen);
    }
}
#大数据开发##大家都开始春招面试了吗##数据人的面试交流地##牛客创作赏金赛#
全部评论
👍
点赞 回复 分享
发布于 今天 11:41 山东
点赞 回复 分享
发布于 今天 14:18 陕西

相关推荐

评论
2
4
分享

创作者周榜

更多
牛客网
牛客企业服务