大数据研发工程师(两年)字节跳动面经

4,910 阅读7分钟

一面

  1. 数据不一致有没有遇到过,怎么解决的。
    回答:遇到过,最常见,同一个指标,多个人多个团队出,口径不一致;或者相同逻辑多个地方维护,复制粘贴,改一个地方另一个地方忘记改

    追问解决办法:

    • 指标体系,复用数据:按照业务线将一个业务线设计到的所有维度和指标统一建模到一张hive表,上层所有应用或者对商分暴露的表都是同源的,且直接取不用再计算
    • 规则引擎,复用逻辑:相同的字段加工逻辑抽离到规则引擎中进行配置,保证一处修改,处处运行
  2. 一道sql的题,一张表,用户id和登录日期,查找连续两天登陆的用户。

    回答:按照用户id group by,编写 UDAF补充红: (性能高),拿到一个用户的所有登录日期,判断是否有连续的

    面试官补充:不用UDAF,就纯SQL,可以用表自关联,关连建为user_id

    select distinct a.uid 
      from tb_log a 
      left join tb_log b 
        on a.uid = b.uid 
       and (a.pdate = date_sub(b.pdate,1) or a.pdate = date_add(b.pdate,1))
    
  3. 怎么定位性能问题对应的是哪段sql

    回答:

    1. spark driver log 看 执行慢的stage(99%)
    2. spark ui 上看 该stage 的task 执行完成比率
    3. spark ui 上看 该stage 对应的 continer id 和 所属job
    4. spark ui 上看 sql 的执行计划 和 执行计划图,最终定位到是哪段sql
  4. 遇到spark性能问题怎么解决的

    回答:分三部分:小文件问题,数据倾斜,其他性能问题分别讨论,这个比较多,就不在这里写了,可以参考https://juejin.cn/post/6844903942766198798

  5. 字节必问的算法问题
    股票的前两道题 考查动态规划 leetcode-cn.com/problems/be… leetcode-cn.com/problems/be…

二面

二面主要就是聊项目了

  1. 项目用了什么存储 回答:分情况说了下hbase,es,kylin,doris 的应用场景

  2. 规则引擎相关的问题。 规则多了怎么管理,有完全相同的规则怎么解决,多个相似的名字怎么解决

  3. 写sql。求一个省份下的uv最高的城市 主要考察窗口函数

select province,
        city
  from (    
        select  province,
                city,
                row_nnumber()over(partition by province order by uv desc ) rank
          from(
                select province,city,
                       count(distinct uid)  uv   
                  from tb_log
                where pdate = {date}
                 group by province,city
           ) a
   ) a1
 where rank = 1

进阶考察: 出现慢结点怎么处理(考察数据倾斜和去重优化),数据倾斜。 一个人多条访问数据

回答: 先去重 group by 省份,城市,userid (预聚合过滤重复数据) 再进行求和,求和的时候对大key分情况处理,加盐

  1. linux 求一个文件出现某个单词的行数 linux做完用spark写

三面

  1. 数据不一致遇到过吗,是什么原因

    回答同一面

  2. 讲一下UA(项目)

    这个就和自己做的相关有关系了,没啥可说的

  3. 报表系统有做过吗

    实际没做过,拿同事做的来说

  4. 一搬用spark还是hadoop

    spark

  5. cache和persisit 的区别

    cache可以选缓存级别,persisit 调用 cache,指定缓存级别为内存

  6. 有优化过Spark执行性能吗,怎么优化的

    根据项目举例子:主要用到,shuffle逻辑下沉,选取合适的存储引擎,合理使用cache,参数调优,优化算法时间复杂度从O(n^2)到O(n),(这里和一面差不多,只是和面试官有更多讨论)

  7. spark on service 用过吗, spark context有退出的问题遇到过吗? 这个知道没用过,所以没答出来,不过通过这个问题能看出来字节大佬还真挺厉害的,三面面试官对技术都这么了解

  8. spark dataframe比rdd性能好,为啥

    不知道,没答出来,反问面试官,面试官说是因为数据结构优化

  9. 堆外内存是干什么用的 netty。结点直接交互数据,spark 最新feature 弃用jvm,直接c++调用内存,都是堆外

  10. 知道什么是 whole stage codengen吗

    面向接口编程太耗时间,主要是方法递归调用,虚函数调用 可以将一个stage的所有task整理成一个方法,并且生成动态字节码 并结合

  11. spark 3.0 特性了解吗

    不了解,😂

  12. 未来一年在技术学习上有什么规划 加强数仓和业务的学习 加强底层原理的学习

  13. 讲了讲字节部门的业务。问有什么问题

HR面

  1. 为什么跳槽
  2. 未来几年的技术规划
  3. 未来几年的个人规划
  4. 期望薪资
  5. 对我们部门有了解吗

经验总结

其实这里才是我最想分享的,问的技术问题都是硬知识,其实没啥可说的,换一个人面可能就是不同的问题了,我觉得更重要的是面试技巧

  1. 面试不是考试,面试是考察你解决问题的能力

    面试的时候难免遇到自己的知识盲区,这时候要能够随机应变。

    比如我在一面的第二个问题上,其实面试官想要的是纯sql的那种答案,但是我最开始没想出来,我也知道他想要的是纯sql的问题,但不能一直卡着呀,无奈执下,写了个麻烦的UDAF,结果最后面试官给了我标准答案的时候,我还跟他讨论了下性能问题,还是UDAF效率高

    如果实在不会的话,你要快点下出自己不会的结论,不会就是不会,直接说,下一个话题,不要磕巴,不要撒谎,不懂装懂,人家一眼就能看出来

    再比如二面的第四个问题,很简单的,可是我就是不咋了解linux啊,我就直接说不会,下一个吧,面试官还想给我解释解释,我说别解释了,真不会,结果面试官意外的说了一句,很棒,要的就是这种速度。

    • 结论1:不能直接解决,想办法也要解决,哪怕是麻烦一点,也能解决问题

    • 结论2:即使真不会,也要让人家知道,你只是这个知识点不会,但是你诚实,果断

  2. 面试要有很好的心态,不要跪舔

    无论你面的是什么公司,都要保持好心态,要自信,不要低三下四的,不然气势上就说了,比如我在一面最后面算法的时候,其实第二题我做错了,但是我看面试官好像也不太会,就生讲,硬是把面试官给忽略过去了。

    由此可见:第一,大厂面试官也不是啥都会,对方也可能是在照着面试题问。第二,心态好了,你能把不可能变成可能

  3. 要知道人家爱听什么

    三面最后一个问题,问我的规划,因为通过前两面我基本猜到了他们是做数仓方向的,而我是应用方向,不是很匹配,但是我灵机一动,就说了为了以后更好的发展,需要更好的了解业务,想做数仓

    而三面快结束的时候,我大概猜到了如果有HR面肯定会问我对部门有什么了解,所以我特意就这个问题像三面面试官进行了深入的套路,最后HR面对答如流

    这个技巧我在刚毕业在美团面试的时候也用过,我本来是面的后台岗位,一面面试官觉得我不错,说他们是大数据部门,问我想不想做,一个刚毕业的孩子肯定对大数据很憧憬呀,我就诚实的说了我想做,但是不会。结果二面面试官又问了我的未来规划,我机智的回答:想转大数据。。。就这样,我一毕业,就进了数据部门

面试硬知识固然重要,但是准备了硬知识的同时,面试技巧也要好好琢磨一下,不然就有可能出现茶壶里煮饺子的情况~更何况我们的饺子其实也不是很饱满呢