阿里数据研发工程师实习面试总结面试
2015.3.21redis
阿里的实习岗的面试已经进行到第三轮了,若是顺利的话,第四轮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。spa
提了一个具体场景问题,让我用MapReduce解决。场景是现有商品的一系列购买记录,另有一张表存有商品的类别,现要统计每一个类别商品的成交额。我当时惧怕了,由于听起来是个表链接的问题,这个地方我在准备的时候没有重点看,有点后怕,搞了半天,才渐渐在他的提醒下理清思绪。我先说的是Map什么都不用作,在reduce里面,以类别ID为Key获得全部相同类别的商品,成交额相加,而后把类别表放在DistributedCache中。他确认了一下我说的是把哪一个表放在DistributedCache中,我说商品类别表相对小些,放在DistributedCache中。而后他提醒说Map中什么都不作么,说你须要考虑到每一个商品记录中,有订单信息,成交日期等等信息,会有成千上万条记录,我就顺着他说,那Map中须要Combine一下,把局部的类别相同的记录先累加起来,去掉不要的信息,而后再送给reduce处理。而后他又问到这种问题适不适合用Spark来作,我想都没想就说不须要,要不他怎么问我MapReduce怎么处理呢,哈哈,仔细想一想这类分析工做确实能够线下来作,不须要Spark来作。
接着他问我项目的问题,问的还挺细,我去,这比第一个面试官还难缠。而后又问HBase和MySql的区别。这些问完以后,问了一个算法题,说一个发红包的问题,若是A给B发了,B给C发了,那么他们三个均可能有关系,如今给你一系列这样的记录,要找出全部没有关系的人。我去,我当时傻了,想不出什么算法,什么思路都没有,他提醒了一下我仍是无果,他百般安慰我说不必定要什么算法,就直观上想到什么都行,我真是不争气啊,主要我老往图上去想,图我又学的很差,总觉得是什么高深的东西,因而我放弃了,说暴力搜索老是能够找出来的,他也只好做罢。面试事后,我想了想,其实真是不难,我从头遍历全部的记录,把第一条记录中的两我的放到一个集合里,而后再搜索,把全部跟集合中元素有关系的都挪进来,这样把全部的记录分红一个个集合,不一样集合中的元素就不可能有关系。好吧,不说这个了,当时问完这个问题以后,他好像就没问其余的了,问我从此打算作些什么方向,而后说了些轻松的,就结束了。