网易面试经验分享【四轮面试】
医生_
前几天去猪场面试了一下,搜索相关的。虽然最后还是没有通过,但是感觉还是有很多收获的。在此小结一下,为以后的面试增加点经验,也给想去网易的同学一个参考。
- 一面(电面)
当时刚下班,回家的路上打来的电话。
1.自我介绍
2.项目用的什么做的(elasticsearch)
3.全量/实时索引怎么做的(这个只要结合自己的项目回答即可。个人感觉回答的不是很好,因为当时在武纺旁边,车流量较大,周围很嘈杂,我尽量走到僻静的地方对方还是听不清)
4.数据量多少,目前集群的状况,以及日常的维护情况(这个也不难回答)
5.他又问到目前使用ES的过程中有没有遇到什么问题,我回答了出现过性能问题,以及严重的线上问题。面试官对性能问题比较感兴趣,我们都知道ES中有一个query叫functionScoreQuery,可以做到人为给文档打分(使用脚本)。我们一开始使用的是比较普遍的groovy脚本,自己定义了一套规则对文档进行打分,但是这会带来性能上的影响(ES官方文档好像有过相关介绍)。面试官问我们是怎么解决的,这个是我自己有重新写了一个Java的脚本(或者说plugin),将语言类型从groovy改成了native
6.后面他又了几个ES相关的问题,但是比较简单,就略过了。
个人觉得,如果是电面,一定要选择一个较为安静的地方这样容易交流。
- 二面
一面过了一周后,便有hr电话通知去杭州面试。因此,请了几天假,跑到杭州去面了一下。二面个人觉得是最最重要的面试,会直接决定你能否进入下一轮。
- 自我介绍
- 项目(全量/实时),面试官很注重细节和问题处理能力,一开始从业务开始,全量索引怎么创建(从数据read,到join,再到推送到ES),建议在面试前对自己项目梳理一遍,可以自己画一个大致流程图(当时面试官叫我画一下你们的全量流程)后面又问了很多项目的细节,不多阐述;
- 如果数据量大起来了怎么处理,因为目前我们的数据量不是特别大,我说可能会考虑hadoop,面试官跟着问那你知道ES-hadoop吗。当时就有点懵,自己只听说过这个,就说这个是es结合hadoop的一个插件。他接着问,那你在使用它的过程中有遇到什么问题或者需要注意什么吗,我大概答了一下大数据相关的(本人并非大数据开发,只写过很简单的mapreduce,并没有用过这个es-hadoop);
- 为什么选择ES(简单易用啊),选的ES什么版本(我们用的是2.4.1),怎么没有用5.x(很明显高版本可能会带来各种不稳定因素啊)
- 集群,分片副本的情况
- 如果在大数据量进ES怎么处理(全量一般有定时任务每天创建,因此可以在建索引时关闭refresh(设置为-1),暂时关闭副本等索引创建完成后再打开;)
- ES的refresh与flush的区别(一个是内存刷新到Lucene的索引中,一个是从Lucene索引刷新到磁盘)
- flush如果刷新时机器有故障怎么保证成功(translog机制,用于记录事物日志,也可当节点时数据重发的日志)
- 一个搜索请求的过程(协调节点接受请求后,将请求发送到每个分片,可能是主分片也是副本分片,各节点返回匹配文档和排序值(query),然后协调节点进行排序后得到一个所需要获取的文档,再从各个节点去获取这些文档)
- 是否了解segment(Lucene索引实际上就有一个一个的段组成的,es的一个分片数据就是一个完整的lucene索引,由一定数量的段组成)。关于段你知道什么(段合并,如果使用ssd可以适当的把段合并速率调高一些,同时建议把段合并成一个)。那么段合并的策略是什么,什么时候要合并(这个当时真的一下子懵了,没有注意到这些,有知道的同学麻烦告知下)。
- ES怎么更新文档(协调节点接受请求后,确定文档所在主分片,然后将更新请求发送到主分片进行更新,更新成功后将数据同步到副本分片)。如果更新失败怎么办(更新有一个retry次数,超过该次数则放弃),副本分片如何更新数据(主分片将更新的文档发到副本分片,副本分片重新创建索引),es采用什么机制进行更新(刚刚已经解释了,基于文档复制的机制),为什么采用这种机制(es使用异步请求,其实使用的是netty,如果是更新请求的话,先后顺序会影响文档结果;而直接使用文档则可以避免),如果副本分片数据更新失败怎么办(这个当时回答的不是很好,我想的是会重试几次;面试官问重试了还是失败呢,我回答那会返回更新失败,面试官又问但是主分片数据已经更新,而副本分片数据没有,这样数据就不一致了,我回答可能副本分片会自己拉取主分片的数据进行更新,面试官有点不满意这个回答,麻烦了解详细机制的同学讲解一下),es多个文档更新(与单文档类似,不再赘述),es文档数据类型判断(true,false,double,long,integer,date之类的,需要注意date和string)
- ES集群master选举(当前网络内节点按id字典排序,选举0节点,即第一个节点,超过mininum主节点数的节点当选),为什么要有这个minimum主节点数(其实就是用来防止脑裂),脑裂怎么产生(可能由于网络延迟,节点默认ping超时为5s;也可能由于节点压力过大,导致ping失去响应;节点故障宕机,ping无响应),如何预防(当集群超过3个节点时,可以设置最小主节点数来防止;为两个时,只能人为的指定主节点与从节点;避免跨网段或数据中心形成集群;集群压力过大时可以适当延长ping超时时间),如果一个节点出故障后集群会怎么做(master节点感知到有节点退出集群,则马上将该节点上的主分片对应的副本分片提升为主分片,重新进行分片数据分配),当该节点修好后会怎么处理(master节点发现后将该节点加入集群,而该节点的数据其实已经是无用的数据,因此该节点会删除本节点数据,并重新进行分片数据分配),如果节点较多呢(可以暂时先关闭数据分配,待达到最小数据恢复节点数后再开始),这个节点怎么进行数据恢复(根据translog进行恢复,为空的节点恢复的更快,所以在节点下线前可以flush一下),如果刚好主节点出问题宕机了怎么半(首先会选举主节点,然后将原主节点上的的主分片对应的分本分片提升为主分片,进行分片数据分配),分片数据如何分配(根据路由id,一般是文档id,确定文档所在分片后,将分片尽量平均分配到每个节点)
- 建一次索引需要多久(30s左右),如何提高速率(目前使用的是5个线程进行创建,可以使用ssd,建索引时不设置副本,待创建好之后再打开),索引时应该注意什么(只保存必需的字段以减小索引,使用ssd可适当增打索引速率,关闭refresh待创建完成后再打开),如果线上索引出问题不可用了怎么半(我们目前线上索引有3份,每天创建一份并删除最旧的一份;当出问题时,直接通过别名将索引切换到另一个可用的版本即可,同时分析问题所在并马上修复),索引有多大(1.3g左右,并不大)
- 搜索时返回的结果怎么排序(分为默认排序和非默认排序,非默认即按字段排序;默认排序采用文档得分进行排序),如何判定文档得分(有静态和动态得分组成),静态得分是怎么评断(自定义Java脚本,使用functionScoreQuery进行判分),动态呢(自定义打分插件,人为控制得分,boost实现),为什么不使用原始的TF/IDF(TF/IDF的得分只是针对当前分片的词频/逆文档频率,并非全局得分,我们不能说node0的0.1分比node1的0.2分低),对于TF/IDF你有什么理解(这个回答的不好,毕竟没有仔细研究过这个,我只简单说了一下空间向量模型,面试官说那你能简单证明一下吗,只需要思路即可,不用数学推导,但是我数学那些东西早就忘了。。。),那你知道solr吗(知道),那么你觉得solr跟es那个更好(没有好不好之说,他们都是工具,最终目的是帮我们完成要做的事。就我个人而言更偏向es,轻量,使用简单,易扩展,而且社区也很活跃,参见github)
- 简单的一个小编程,去除一个字符串中的指定特殊字符,不要使用第三方的类、库什么的(我写了三种,第一种直接遍历,第二种replaceAll,第三种将字符ascii码与字符放入map),但面试官说这些都不是最好的答案,他说的是将字符的ascii码存入表,在遍历一遍判断字符的ascii在不在表什么的,感觉跟我想的第三种方法差不多,这个没搞懂。
二面大概就这些内容,接近一个小时,跟这个面试官聊的还不错。
有个小插曲,面完后,他说他这边已经面完了,问我什么安排(不是你告诉我的吗。。)我说我也不知道,就是前台的小姐姐让我去面试。他说哦,那你问一下她该怎么办把。我说小姐姐,小姐姐说面试官跟你说的是可以回去等消息还是在再稍等一下后面还有,我说他说他也不知道,小姐姐直接说那你就先回去等消息把。我知道可能没过,就准备走,然后那个面试官出来叫住我,说等一下,待会有一个面试官来面你。
- 三面
等了半个小时,三面面试官才来。然后没说废话,直接开始。
- 自我介绍
- 有没有用过hadoop(写过简单mapreduce)
- 对于hdfs有什么理解(回答的不好,很粗糙)
- 知不知道yarn,使用过没有(知道,没有用过。。。)
- 那你简单给我介绍一下es把(我。。。)
- 有没有使用过多线程(有,countdownlatch,executorService,threadPoolExecutor等),原理知道吗(基于aqs,采用队列方式,回答也不是太好)
- 如何实现线程同步(synchronized,violate,reentrantLock等),synchronized与reentrantLock有什么区别(synchronized隐式锁,粗粒度锁,reentrantlock显示锁,更灵活,细粒度可控,一般都是用reentranlock)
- 还有Java的一些小的点,就不在列举了
- 一个简单的小题目,从叶子节点找到根节点,我提出了一种大众的思路。她问还有其他的方法吗,想了一会她说就这样把。
三面完,我心态有点不好,感觉这次应该挂了(后面问了一下,这个面试官是大数据组的,所以问的都是一些大数据的问题)。我从会议室出来,准备直接走,她叫住我让我到外面等一下,待会还会有个面试官来面你。
- 四面
又等了一个多小时,四面面试官叫我去面试。我稍微整理了一下思路,就去了会议室。
- 看了你的简历,主要使用的是es,那你给我介绍一下呗(我。。。)
- 为什么选择网易(大厂啊),觉得杭州怎么样(不错,环境比武汉好多了)
- 对于前几轮面试有什么感想(这也太难了把,我只是来面试的啊。。)
- 前面几个面试官,那个给你印象比较深(二轮,问的很多,很细)
- 有没有女朋友(没有)
- 有没有同学在这边(有)
- 有没有想过来杭州发展(嗯,如果有机会的话)
大概就这些。
基本上面试的内容就这些,写出来让大家也可以参考一下。过了几天,让同学帮忙看了一下,发现没有通过,也是略遗憾,哎。。