已经收到感谢信了. 不过经历两轮一共差不多2小时的面试, 感觉对自己的知识水平清晰很多了. 有些地方比之前自信多了, 有些地方也深刻认识到了不足
面试质量我觉得很高, 方方面面都考察到了, 也一直听说有赞的技术水平很不错, 可能确实是的. 总之面试体验很不错, 两轮面试都有送一瓶水喝, 然后不清楚的地方会引导我, 但有些属实答不上来, 没办法了就
没有笔试, 直接筛简历. 面试之前HR会给同岗位的拉一个群, 我看了一圈, 三四十个人里我的学校是最菜的, 而且还是本科生, 那可能确实还差点意思吧, 无论是能力还是学历上
每个提问后面的括号中是我的回答
一面(大约70分钟). 基础问题为主, 不是很深凿. 给了很大空间自由发挥, 想说多少都基本不打断
- 自我介绍
- 讲讲在大华的实习
- 项目介绍
- 怎么生成项目数据的 (python脚本 + crontab -e的命令. 顺路提到有赞用的Airflow框架, 面试来的路上临时看的)
- (我自己的延伸) Kafka对接Spark Streaming的两种方式, offset管理, checkpoint机制
- 线程安全的理解 (volatile, synchronized, ThreadLocal, final)
- 进程和线程的区别, 进程间通信的方式, 共享变量
- 死锁的定义, 以及如何预防死锁
- HashMap的底层数据结构 (从ArrayList和LinkedList开始讲它们的设计考虑和联系; JDK1.7 & 1.8; ThreadLocal的开放地址法处理哈希冲突、数据库哈希索引的拉链法处理哈希冲突)
- 数据库索引的数据结构 (哈希索引 & B树索引 & B+树索引 & Innodb及其自增主键 & 聚簇索引和非聚簇索引, 全程不打断)
- (场景题) 数据库存储着起始时间字段, 有如下几组数据: <2017.1.1-2018.1.1> <2018.1.1-2019.1.1> <2019.7.1-2019.9.1> 如何找出哪段时间的数据缺失了 (意思是2019.1.1到2019.7.1这里没有连着, 找到它, 能解决就可以, 不需要优化解)
- TCP和UDP的区别 (有状态的连接, 有拥塞控制 & 滑动窗口 & 超时重发等机制)
- 三次握手的过程 (有些序列忘记了, 面试官说没事, 然后我顺带提到了三次握手可能遇到的syn洪水攻击)
- 构造方法说一下 (说了下Java中的构造方法及其重载, 我感觉不够, 于是提了一下Scala语言在Spark源码的coalease和repartition方法中用到了普通方法的重载)
- 你觉得实习哪些地方做得不好, 现在回看的话觉得该怎么去做
- 下一步的学习方向
- 后续的职业发展思考
- (算法题) 图里面找最近的一段距离 (Kruskal算法秒解. 感觉最近图算法被问得很多, 可能是和图数据库有关?)
- 平时学习过程中比较印象深刻的分享一下
- 有什么想问的? (团队组成+我的强弱点. 答基础知识可以, 就是实践经验可能缺少一些)
感觉7和8答得不太好, 但是没有深究, 也让过了, 不过这两问应该是给二面伏笔了
面完去等候室呆了2分钟, 本来想补一下操作系统知识的, 结果在等候室遇到一个来面试的浙大直博生, 出于好奇就聊起来了…
二面(大约55分钟). 不给机会自由发挥, 有岔开话题就打断, 注重实现和细节
- 自我介绍
- 操作系统熟吗? (…不熟)
- 进程和线程的区别
- 单核CPU下, 单线程一定最优吗?
- 线程享有的资源有哪些? 考虑网络IO, 如果单核CPU的一个线程在网络IO时阻塞了, 但是它的资源不调度给其它的线程, 这样情况下仍然是单核CPU单线程最快吗?
- 进程间通信的方式. 共享变量知道吗? 说一下操作系统层面的, 不是编程语言那方面的
- (海量数据处理题) 1~10000共1万个无序不重复的id号, 丢失了2个, 怎么找到? 如何优化? (先讲了可以用到的排序思想, 然后慢慢优化时间复杂度和空间复杂度, 最后用bitmap解决)
- (答出了7之后的延伸) 1~10000000共1000万个呢? 1M空间? 10K空间? (听到10K有点懵… 结束之后重新做了一下, 感觉答对了60%吧, 设计思想都到了, 就是没结合好. 结束后反思的具体解答如下)
- 讲讲在大华的实习
- 数据库三范式 (…临时就忘光了, 无语)
- 数据库索引知道哪些? 不是数据结构那几个索引 (联合索引 & 最左前缀原则 & 索引命中与失效)
- 表的删除操作知道哪些, 它们有什么区别呢 (delete, truncate, drop)
- 项目介绍, 什么时候做的? 说一下你提到的难点
- 为什么要用MySQL管理offset呢? (提到了Spark的checkpoint机制, 以及Spark Streaming对接Kafka的两种模式及其细节对比)
- 项目有实现数据消费的Exactly Once吗 (没有, 知道用幂等或者事务可以实现, 但是实践遇到了点困难)
- 项目中的动态黑名单过滤怎么做的, 黑名单逻辑如果要复杂一点该怎么做?
- (场景题, 从22的延伸) 如果爬虫爬数据, 构思一下对于爬虫流量的黑名单过滤逻辑? 以百度的场景为例, 假设你是搜索引擎公司的员工, 怎样设计逻辑去判断爬虫产生的流量?
- 项目中HBase的row key是怎么设计的, 为什么需要额外设计row key
- 讲一讲HBase的存储结构 (HRegion, StoreFile, HFile, MemStore, HLog)
- 有什么想问的? (团队人数和构成+我的特点+如果能入职是做底层组件开发还是业务. 答基础不太出众, 大数据团队大概70多人, 组里有做源码级开发的人, 做哪块并不一定)
表现不佳(主要是4/6/11答得不好, 8/12/15/16/17还有待进步), 于是就没带去见HR面, 面试官陪我到电梯口去了. 其实面这么久时间也算是给很多机会了, 水平不够是根源
总的来说:
- 操作系统非常菜. 以进程间通信和死锁为首, 老是背了忘忘了背, 还是得花时间理解清楚逻辑才行
- 项目细节还需要加强, 思想到位了但是实践没到位
- 缺乏实战经验, 遇到场景题总觉得不自信, 需要去实际工作场景历练历练