有事,短更。
这篇文章是因为今天面试了一个同学,最终没通过,记录一些细节。
我问了一些问题,最核心的几个问题如下:
基础部分
- 一个Java对象的内存分配流程是怎么样的?
- 集群线上JVM的主要参数有哪些?垃圾回收器用的CMS还是G1,为什么选择G1?
- 业务上多线程如何创建线程池,一些核心的参数设定。Spark是多进程模型还是多线程模型?MapReduce呢?大概讲一下一个Spark任务提交会产生哪些进程和线程?
数据组件部分
- 产生数据倾斜的根本原因是什么?你是怎么发现产生数据倾斜的以及解决的办法。
- Spark如何管理内存的?Spark用到的内存有哪些?以及什么情况下会用到堆外内存?
- 你了解的任何一个实时计算框架的任务调度是如何做的?
其他
- 设计一个系统,能承担每天百万级别的任务调度。
- Spark的back-pressure限流器怎么实现的?你能自己实现一个限流器吗?说说思路。
以上8道题,能回答上来6个就可以了。
但是很遗憾确实相差的有点远。
整体的感觉是,面试者对组件停留在会用层面,在一些简单的业务场景或者成熟的平台下开发完全没有问题,但是遇到难题恐怕难以解决。
另外知识点有些分散,什么意思呢?这也是很多同学的通病,也就是对一个组件没有整体的概念,不清楚来龙去脉,只是停留在使用层面。
每当学习一个组件,一个比较好的学习路径是,了解背景,熟悉常用功能,上手做一个简单的项目,熟悉一个源码和各个模块,然后了解组件本身在使用中会遇到的问题。有些问题你可能没遇到过,那么就需要去社区或者论坛找一下相关资料,看看别人遇到了什么问题,自己尝试复现并解决一下。
另外,最近准备发起一个阅读源码的项目,针对某一个框架的某一个小模块,以学习小队的形式以周或者双周为单位报名进行阅读。我会出一些题目,要求参与人能自己在源码中找到答案,最后产出一篇学习笔记或者博客,不按时完成有惩罚措施。每周抽出2个小时阅读源码,少打一会游戏。坚持下来,相信你会不一样。
项目细节还在思考中,大家有兴趣可以加我微信等细节敲定了酌情报名参加。我的微信号:whispererrr。