最近忙于部门招人,为了能够较好地进行招聘和筛选,搞了这个指南。
一、岗位职责
- 自身具有一定的相关知识储备。了解分布式系统的概念和理论,比如CAP,BASE,FLP,sharding和replicate机制,一致性算法
- 熟悉公司的大数据平台,能够基于平台开发实现数据处理和加工应用,与算法工程师或者数据挖掘工程师一起实现算法落地和数据管道搭建
- 解决大数据量下的程序性能问题,提高和优化数据处理和加工效率
- 了解数据仓库概念,熟悉数据仓库构建过程和部门数据仓库架构设计,能够基于公司大数据平台实现和改进数据仓库
- 清楚自身在整个数据治理过程中的角色和定位,了解上下游的工作内容。充分发挥自己在质量过程中的作用
二、 硬实力(80%)
1. 编程能力(50%)
主要考察面试者程序编写能力水平和常用语言的熟悉程度。侧面反映面试者的知识深度和广度、学习能力和性格。
考察点:
- 数据结构(15%):
- 常见数据结构有哪些,有哪些操作?给你一个数组,你能实现哪些数据结构
- jdk中的实现和使用
- 现实项目中使用过的数据结构介绍
- 给出一个实际应用场景,设计相应的数据结构
- (可选) 你见过哪些设计精妙的数据结构,能否讲讲精妙之处
- 算法(15%):
- 算法设计有哪些模式,算法复杂度是指什么,如何评估一个算法
- 经典算法包括排序和搜索,各举一个例子进行说明
- jdk中的算法
- 现实项目中使用过的算法介绍
- 给出一个实际应用场景(给定时间复杂度或者空间复杂度),给出相应的算法
- (可选) 听过哪些机器学习算法,能够详细说明一个
- (可选) 大数据环境下使用过哪些算法,遇到哪些问题,怎么解决的
- 并发/并行(20%):
- 什么是并发,什么是并行,有什么区别。比如在单核和多核(甚至多CPU)机器上
- 常见的一些并发模式,比如生成者,消费者,线程池等,常见的并发问题和解决方法。比如线程的多少如何决策、线程饥饿、线程池停止、惊群现象等
- 什么是悲观锁和乐观锁?java中是哪种锁机制?CAS(CompareAndSwap)是什么,有哪些问题(ABA)?java有哪些实现?内存屏障是什么?
- jdk中和并发相关的组件,比如对象锁、CountDownLatch、Cyclicbarrier、executor、并发容器、Fork/Join等.
- java中的线程状态有哪些?它们之间的状态是如何转换的?新建、运行、等待、阻塞和结束
- java中有哪些线程安全的类?这些类一定是线程安全的吗?如果不是,能否举个例子?
- 什么是异步,什么是同步,何时使用,举个例子。BIO/NIO/AIO是什么,说一下区别?
- 实现过哪些并行程序,和并发的区别,有什么特点?
- (可选) 给出一个实际应用场景(比如HTTP server),如何利用并发或者并行来提高性能
- (可选) 除了通过锁机制解决并发问题,还有哪些方法可解决这类问题
- Java(40%):
- 介绍一下Java,强类型,静态类型,显式,支持面向对象和部分函数范式
- jdk目前最新正式版本是多少,能否说一下1.7、1.8、1.9中引入的一些新特性
- jvm有几种模式,32位和64位有什么区别
- 能说一下jvm中的内存分配策略和回收机制吗,哪些启动参数会影响gc
- jdk中有哪些命令行工具,用过哪些呢
- 内存模型,原子性、可见性和有序性,volatile变量作用是什么,什么是happens-before
- 简述类加载机制,举个例子
- 自动装箱、拆箱(空指针问题)
- 泛型及类型擦除和PECS(Producer extend, Consumer super)
- 重载和重写,各自的判断依据是什么
- 序列化和反序列化机制,如何实现层级较深类的序列化和反序列化
- java是值传递还是引用传递
- 反射机制,有哪些应用
- 说一说,java IO包的内容
- (可选) 能说一下JVM-Based语言吗?Clojure, Groovy, Scala, JRuby, Jython
- 设计模式(10%):
- 说几个设计原则(SOLID):开闭原则、里氏替换、单一责任、依赖倒置、接口隔离、迪米特法则
- 模式总体来说分为哪几类:创建类、结构类和行为类
- jdk中用到的设计模式
- 日常使用的框架、程序库或者生活中发现过哪些设计模式的应用
- 设计一个单例或者其它设计模式应用实例
- (可选) 设计模式对比,比如命令模式和责任链模式、观察者模式和中介者模式
加分项(10%):
- 了解和使用过其他语言,并能够和常用语言进行对比,对计算机语言概念有了解
- 参加过线下/线上编程竞赛
- 实现过编译器或者DSL
- 了解函数式编程
- 项目中通过设计和实现过数据结构和算法解决过问题
2. 大数据(30%)
主要考察面试者大数据方面相关知识和应用水平,以及”数据感”。
考察点:
数据相关(10%):
- 接触过或者处理过最大的数据量是多少,做过何种处理
- 数据主要来源是什么?互联网是否爬取过数据?爬取规模多大,遇到过哪些反爬虫机制,如何解决的
- 说一下数据在各存储介质中的传输速率,能否说明计算机的存储体系。数据从磁盘如何到CPU进而被处理,处理后的数据如何写入到磁盘。比如缺页中断,磁盘块大小等
- 磁盘随机写和顺序写有什么不同,什么时候使用同步IO,什么时候使用异步IO
大数据基础(10%):
- 是否阅读过Google三大论文:GFS、MapReduce和BigTable,三者的作用
- 介绍一下hadoop生态,听过哪些,用过哪些,能否简单介绍一下其中的一两个。比如hdfs、hbase、YARN、Zookeeper、Mapreduce、Spark、Hive、Flume、Kafka等
- 大数据处理时为解决存储和计算的问题,使用的是横向扩展还是纵向扩展,这样做会引入什么问题,如何解决的
- 说一下CAP/BASE,引申出一致性问题
- 说一下sharding和replication有什么区别,各自解决什么问题
- 什么是计算本地化?
文件系统/HDFS(15%):
- 说一下HDFS的基本框架(Master/Slaver)
- 数据写入/读取流程,一个进程写入文件时,其它进程何时才能可见/可读。这里读写一致性如何?HDFS集群最小需要多少台机器
- NameNode中存储哪些信息,为什么这么做? HDFS存储文件数有上限吗,是什么原因导致的(是否有解决方案呢)。NameNode是如何保证这些存储的信息安全的?为什么要引入SecondaryNameNode,它的工作是什么,解决了单点故障吗?那如何解决单点故障问题呢?Zookeeper + QJM
- DataNode中存储什么信息?选择副本存储位置时采用什么策略(机架感知),为什么这么做?DataNode上存储的块一般大于64MB,这样做有什么好处?写入数据时,副本是如何进行的?
- HDFS对小文件支持如何,原因有哪些?
- HDFS是否哪些文件操作?
- HDFS有哪些命令?
- 是否还知道哪些其它的分布式文件系统,比如Ceph, Amazon 3S, Alluxio等
计算框架(20%):
- MapReduce属于哪种计算范式,Spark呢?还有哪些计算范式?批量、迭代、流式、交互式、实时。每种范式能否给出一个开源框架
- 说明一下MapReduce基本流程,map, sort, shuffle, merge, reduce。这种方式有什么局限性
- Spark基本流程,和MapReduce相比,有什么优势
- 在MapReduce和Spark上实现TopN算法
- MapReduce二次排序如何实现,使用场景
- 项目中使用过哪些计算框架或者范式,结合业务说明使用场景
- (可选) 实际项目中实现过哪些ETL,是否使用过工作流框架(比如Oozie,Cascading)
协作(5%):
- 知道哪些分布式一致性算法,它们都是用来做什么的?
- zookeeper的基本架构和使用场景,你接触的哪些大数据系统中使用它,它承担什么角色?统一命名服务、配置管理、集群管理(选主和资源定位)、共享锁等。能说一下其中的ZAB算法吗?zookeeper提供哪些保证?顺序一致性、原子性、及时性。
- zookeeper提供哪些操作?其中的节点分为哪几种类型?
数据存储(10%):
- 什么是NOSQL,知道哪些?能挑出两个说说它们有什么区别吗?
- 说明一下HBase架构,它的一致性如何?CAP中满足哪两个?HBase读写流程,初次读写时有何不同?HBase有哪些优化手段,表设计时需要注意哪些?可以结合实际项目说明。大批量数据入HBase时,比如一天几十亿数据,怎么实现?是否了解二级索引?有没有哪些场景HBase不适用呢?事务,join
- 是否了解图存储,图的基本概念:度、子图、连通性,有哪些类型的图?图的存储表示有哪些?图的遍历及相关算法?Dijkstra’s 算法,Bellman-Ford算法
- 是否使用过Solr或者ElasticSearch,介绍一下全文检索,基础概念:比如正排和倒排、相似度(编辑距离、余弦相似度等)、词频(TF)/逆文词频(IDF)、查全/查准、分词(需要做哪些处理)、文档相关度等
数据集成(10%):
- 是否使用过Flume、Sqoop、Kafka或者Logstash,使用场景是什么?
- 如何与计算框架进行集成的?
数据分析(5%):
- 使用过哪些数据分析相关:Hive,Spark SQL,Pig,Mahout等
- 进行过什么数据分析,支撑过什么业务?
- hive中sort by, order by, distribute by, cluster by功能和区别
- (可选) 你熟悉哪些机器学习算法,能详细讲解一下吗?
加分项(15%):
- 参与过数据仓库或者数据挖掘相关项目
3. Dev/Ops(20%)
考察面试者在工程化方面的经验,反应面试者的综合素质。
- 操作系统/Linux(40%):
- 听过哪些发行版本?使用过哪些发现版本?两大常见版本:Debian系和Red Hat系
- 简述一下Linux的目录结构,每个目录存储内容
- 使用方式是什么?图像界面还是终端,用过哪些终端命令?(文本操作、进程监控、网络等)是否写过Bash Script?
- 是否安装过软件,如何安装的?什么是包管理器,用过哪些
- 如何知道程序是否允许正常,资源使用情况?如果出现性能问题,如何排查性能瓶颈?内存使用、磁盘读写、网络流量、系统中断调用等
- 是否在Linux的集群上搭建过大数据相关平台,比如Hadoop,Spark等
- 软件工程(40%):
- 版本如何管理?你用过哪些版本管理工具?能说一下他们的有缺点吗?
- 如何保证代码质量的?checkstyle,findbugs?是否写过单元测试?使用过哪些测试框架?CI/CD?做过代码评审吗?
- Java项目是如何管理的,maven? Gradle? 为什么要使用
- 听过这些吗?KISS(Keep it simple and stupid), YAGNI(You aren’t gonna need it), DRY(Don’t repeat youself)
- 软件开发流程有哪些?经历过哪些?喜欢哪种开发方式?
- 最近一次重构是什么时候?为什么?
- 编写代码使用何种IDE或者文本编辑器
加分项(20%):
- 捣鼓过Linux系统,比如自己构建一个版本
- 使用脚本实现自动化
- 使用过git/github
- 有代码洁癖,对代码要求较高
三、软实力(20%)
1. 领导/创建团队(20%)
- 在之前的项目中承担什么样的角色,主要的工作职能是什么?
- 未来自己是倾向于开发还是管理,对技术怎么看
- 是否担任过领导者角色,和单纯开发人员有什么区别?角色带来了什么成长
- 带领团队完成哪些工作?值得称赞的有什么
2. 学习分享(50%)
- 参加工作时,是否和别人分享过学习成果或者经验?效果如何?
- 对哪块技术感兴趣,是否关注业界发展?平时信息获取途径有哪些?
- 如何学习一门新技术的?最近关心哪些新技术?能否简单介绍一个?
- 最近是否有学习计划?
3. 业余时间(15%)
- 是否有自己的技术博客
- 是否有自己的开源项目
- 除了技术,是否还有其它业余爱好?
加分项(15%):
- 带领过团队
- 有大数据相关的开源项目
- 有大数据相关的技术博客
- 对大数据感兴趣,并且对这块信息比较关注