【面试经验】阿里数据研发工程师实习面试总结

阿里数据研发工程师实习面试总结

 

 2015.3.21

         阿里的实习岗的面试已经进行到第三轮了,如果顺利的话,第四轮HR面试通过就可以去实习了。回想这两周以来,从忐忑的决定要投简历,到做简历时各种自卑,到抱着体验的心态去投递简历,到一轮一轮的面试,不管结果是否通过,都需要总结一下,以明确今后的复习准备方向以及重点。

         3月11日投递简历,周五下午便有杭州的电话打过来,可惜我去跑步没接到,于是周末忐忑的准备着,半用心半浮躁的准备着。周一的时候等了一天没有消息,整个人都烦躁了,于是决定不再等待,不要太过于期望,所以第二天与往常一样去图书馆看《剑指Offer》。所以,有句话说的真是没错,你越是能淡定做自己该做的事,你所期待的事情才会不经意间发生。周二上午在图书馆的时候接到了阿里的一面电话,原本有点迟疑,感觉还有几个方面没准备好,但是我等了太长时间了,于是没想改约时间,当时就接受第一次电话面试了。

  说说一面。面试的是个男面试官,语言表达各方面都还很清晰。但是我很紧张,几乎喘不过气来,开始的一半时间声音都是颤抖着的。面试官首先让我自我介绍一下,然后让我介绍自己的项目经历。我当时只说了一些跟MapReduce和Spark相关的。然后面试官开始问MapReduce,问MapReduce的特性,适合解决什么问题。然后他问Spark相对于MapReduce的特点,以及什么情况下需要用Spark。

  以上问题都是概念和特点的简述型问题,接下来面试官开始问一个具体的场景下的问题解决方案。在得知我的MapReduce学的时间比较长的情况下,他描述了一个具体场景,问我用MapReduce怎么做。这个场景是这样的,淘宝的用户在登录后可能会有一系列的网页查看记录,现在我们有这样一个表,存有用户ID,用户访问时间,当前页面,跳转页面这样四个字段。要求还原用户的访问路径。我当时紧张的,以最naïve的想法达到,Map什么都不用做,在reduce的时候得到同一个用户的多条记录,然后根据时间先后还原访问路径。后来想想,这个答案真是欠考虑啊,还好面试官比较Nice,他提醒我说淘宝有很多用户,而且每个用户的访问记录成千上万。于是我想到,我不能把所有的计算逻辑留到reduce里做,既然访问路径是按时间来排序,我何不利用Shuffle中的自动排序,如此这样需要key中含有时间,但是这样的话reduce聚合的就不是同一个用户的所有记录了,所以想到了定制Partitioner,来做一个trick,让所有的键值对排序时选用带时间的Key,partition的时候用用户ID做key。其实这个过程我开始并不那么清晰,讲着讲着把自己讲明白了,于是跟面试官谈到MapReduce的Shuffle原理,他也进一步的要我描述Shuffle的过程,还好我周末准备了这块,于是还算轻松的把Shuffle过程中的步骤讲清楚了。

  到这里项目的问题便结束了。面试官下一步问我平时经常使用的编程语言是什么,我说是Java,于是他问了几个Java的问题,哎,这就是我一开始接到电话差点想改约时间的原因,我没准备Java面试常问的问题,面试官问的几个问题我都含含糊糊的答了一下,根本接不下去话。第一个问题是Java的GC原理,我只说是分代GC,含糊的提到新生代老年代,说先是存在某个代里,存满了再干嘛,面试官让我确认存在哪个区,我说不记得了,于是这个问题作罢。接下来问我如何定位JVM的性能问题,进一步解释说怎么知道是内存不够还是怎么样,我含糊的提到如果出现OutOfMemory异常的就是内存不够,应该增大heapsize之类的,这个问题也是含糊作罢。面试完之后回想并在网上查了一下,他可能是想问我JVM的性能监测工具的使用,这个部分在《深入理解JVM》中有,但是我没有注意过。第三个问题他问我HashMap的实现原理,天啊,我只是记得以前大致看过一篇博客讲HashMap的存储结构,说存储效率不高,根本不记得了,含糊的说利用hash结构。面试官进一步提醒问我key是什么,以及如果两个key的hashcode重复了怎么办,我说了线性探测和二次探索,就是没想起来应该是正确答案的链式冲突解决方案。然后出现了一小段空白,面试官说就这些问题了。全程时间27min左右。额,当时好崩溃啊,Java的问题基本都没答上来,但是过了几分钟在阿里招聘网上看进度,居然通过了,现在想来虽然都没答上来,可能也粘了一点边,所以不至于刷掉我。

         总结一下一面,还是非常刺激的,我声音基本颤抖着,直到在混乱中理清思绪答完了第一个实际场景题,才渐渐平静,但是接下来的Java问题真是面的够差的。还好,一面侥幸通过,接下来等二面,因为听组里同学说过阿里的效率很高,基本一面通过之后第二天就会二面,第二天下午果然等到了二面。

         二面是三次面试中最轻松愉快的一次,面试官很和善,让我提一下自己的项目经历,我也不太紧张,简要的说了一下用MapReduce Spark HBase来做一些并行优化应用。他对HBase感兴趣,好像是直接问了一个实际场景的问题,问的是有一个表存储用户信息,购物信息之类的,要统计出该用户一天的购物信息,大致意思是这样的。我说的是根据时间戳来实现,先询问rowkey是什么,面试官说可能是用户信息什么的,在于我设计,我就提出了两个解决途径,一是把时间信息加到rowkey中,这样由于HBase的按照rowkey有序的特性,检索会快很多;或者两一个方法就是在时间戳上建立索引。面试官表示我讲的没错,然后问我除了HBase之外还知不知道其他的NoSQL数据库,我说了redis,他问我redis的特性,我简单说了下它是内存数据库,也是key-value结构。然后他问我redis的数据分片原理,我说我不清楚redis的底层原理,然后他就问我HBase的分片原理以及副本存储什么的,我说了一下是分成region然后再存入regionserver,副本数是由底层的HDFS来决定的。然后面试官接着问我知不知道mango DB,我说不知道。然后他就说他没问题了,说接下来还会有一个主管面试和HR面试,通过了就可以来面试。我还兴奋的问了他主管面可能问什么问题,丫的告诉我会问些宏观的问题,我以为再也不需要问技术问题了,还以为自己通过了。

         三面还是在二面之后的第二天,下午正在开会时打过来的,我出去接了下,有点蒙,很紧张。不是说是主管面,主要是聊天聊规划聊人品的么,怎么又是一轮技术面试,而且强度比二面强多了。听起来,三面这个面试官年纪应该大一点,表达更有一种威势,所以我被吓到了,又是声音颤抖的一面,一直抖个不停,我只好找了个沙发坐下来了,中间好几次听不见声音,到中间我有点不耐烦了,也就开始不怕他了,他没表达清楚的我就再问。他首先让我选一个经历来重点说,我有点迟疑,然后他也开始问Spark和MapReduce,让我用简单的语言介绍Spark,然后说什么情况下需要用Spark。

  提了一个具体场景问题,让我用MapReduce解决。场景是现有商品的一系列购买记录,另有一张表存有商品的类别,现要统计每个类别商品的成交额。我当时害怕了,因为听起来是个表连接的问题,这个地方我在准备的时候没有重点看,有点后怕,搞了半天,才渐渐在他的提醒下理清思绪。我先说的是Map什么都不用做,在reduce里面,以类别ID为Key得到所有相同类别的商品,成交额相加,然后把类别表放在DistributedCache中。他确认了一下我说的是把哪个表放在DistributedCache中,我说商品类别表相对小些,放在DistributedCache中。然后他提醒说Map中什么都不做么,说你需要考虑到每个商品记录中,有订单信息,成交日期等等信息,会有成千上万条记录,我就顺着他说,那Map中需要Combine一下,把局部的类别相同的记录先累加起来,去掉不要的信息,然后再送给reduce处理。然后他又问到这种问题适不适合用Spark来做,我想都没想就说不需要,要不他怎么问我MapReduce怎么处理呢,哈哈,仔细想想这类分析工作确实可以线下来做,不需要Spark来做。

  接着他问我项目的问题,问的还挺细,我去,这比第一个面试官还难缠。然后又问HBase和MySql的区别。这些问完之后,问了一个算法题,说一个发红包的问题,如果A给B发了,B给C发了,那么他们三个都可能有关系,现在给你一系列这样的记录,要找出所有没有关系的人。我去,我当时傻了,想不出什么算法,什么思路都没有,他提醒了一下我还是无果,他百般安慰我说不一定要什么算法,就直观上想到什么都行,我真是不争气啊,主要我老往图上去想,图我又学的不好,总以为是什么高深的东西,于是我放弃了,说暴力搜索总是可以找出来的,他也只好作罢。面试过后,我想了想,其实真是不难,我从头遍历所有的记录,把第一条记录中的两个人放到一个集合里,然后再搜索,把所有跟集合中元素有关系的都挪进来,这样把所有的记录分成一个个集合,不同集合中的元素就不可能有关系。好吧,不说这个了,当时问完这个问题之后,他好像就没问其他的了,问我今后打算做些什么方向,然后说了些轻松的,就结束了。

         今天是3月21日,从3月17日开始面试的,阿里的效率还真是高啊。
 

转载于:https://www.cnblogs.com/eaglet-weixi/p/4977839.html

你可能感兴趣的:(【面试经验】阿里数据研发工程师实习面试总结)