有事,短更。

这篇文章是因为今天面试了一个同学,最终没通过,记录一些细节。

我问了一些问题,最核心的几个问题如下:

基础部分

  1. 一个Java对象的内存分配流程是怎么样的?

  2. 集群线上JVM的主要参数有哪些?垃圾回收器用的CMS还是G1,为什么选择G1?

  3. 业务上多线程如何创建线程池,一些核心的参数设定。Spark是多进程模型还是多线程模型?MapReduce呢?大概讲一下一个Spark任务提交会产生哪些进程和线程?

数据组件部分

  1. 产生数据倾斜的根本原因是什么?你是怎么发现产生数据倾斜的以及解决的办法。

  2. Spark如何管理内存的?Spark用到的内存有哪些?以及什么情况下会用到堆外内存?

  3. 你了解的任何一个实时计算框架的任务调度是如何做的?

其他

  1. 设计一个系统,能承担每天百万级别的任务调度。

  2. Spark的back-pressure限流器怎么实现的?你能自己实现一个限流器吗?说说思路。

以上8道题,能回答上来6个就可以了。

但是很遗憾确实相差的有点远。

整体的感觉是,面试者对组件停留在会用层面,在一些简单的业务场景或者成熟的平台下开发完全没有问题,但是遇到难题恐怕难以解决。

另外知识点有些分散,什么意思呢?这也是很多同学的通病,也就是对一个组件没有整体的概念,不清楚来龙去脉,只是停留在使用层面。

每当学习一个组件,一个比较好的学习路径是,了解背景,熟悉常用功能,上手做一个简单的项目,熟悉一个源码和各个模块,然后了解组件本身在使用中会遇到的问题。有些问题你可能没遇到过,那么就需要去社区或者论坛找一下相关资料,看看别人遇到了什么问题,自己尝试复现并解决一下。

另外,最近准备发起一个阅读源码的项目,针对某一个框架的某一个小模块,以学习小队的形式以周或者双周为单位报名进行阅读。我会出一些题目,要求参与人能自己在源码中找到答案,最后产出一篇学习笔记或者博客,不按时完成有惩罚措施。每周抽出2个小时阅读源码,少打一会游戏。坚持下来,相信你会不一样。

你好,我是王知无,一个大数据领域的硬核原创作者。

做过后端架构、数据中间件、数据平台&架构、算法工程化。

专注大数据领域实时动态&技术提升&个人成长&职场进阶,欢迎关注。