谢安生(化名),末流985本科,非科班。18年10月零基础学的大数据,错过了秋招,但在春招拿了招商银行,光大银行,浪潮等国企大数据开发offer。
他是我学习群里的一个小伙伴,也是一个曾经在面试前一晚半夜3点打我电话问我问题的男人。。(后台回复"加群",加入学习群)
部分offer
以下为正文,答案由我重新整理:
目录:
北京柠檬微趣
途牛
光大银行·光大科技
悠易互通
乐言科技
多益网络
招商银行·招银网络科技
浪潮集团
①北京柠檬微趣
以下为两道方案题,觉得很有意思,记录一下。
一次计算各时区的DAU
假设有最近48小时的数据,如何一次性计算24个时区各自的DAU,而不是计算24次。
分析:
考虑用pipeline,在进入管道前对数据按时区进行“分类”,然后将数据放入管道,在管道内一次计算,求聚合值。
分布式求平均值
一些整数数据分布的存储在多台机器上,每台20TB,需要求这些数的平均数。请简述计算方法和数据流。
分析:
20TB,数据量过于庞大,则需要考虑使用中间件。类比mysql的mycat,利用中间件对过于庞大的数据进行维护等操作。
②途牛
一面:
微信视频面试,感觉有一点点随意。两个面试官,特别和蔼,全程主动权在我手上(就算是我不会的问题,也被我带着转移到我会的问题上,基本没有打断过。)总共面了40分钟,其中MR流程我就跟他们讲了近20分钟(结合项目、举例、又从快排/归并排序扯到各种排序算法的比较,分区分组又拓展到数据倾斜问题……总之全程被我带着跑,一直说我会的。)
二次总结:面试官不打断不一定代表认为你答得好,可能他性格就是那样。答得不好以及不会的回答面试官还是看在眼里的,所以硬实力还是最关键的。
记录几个我答的不是很好的问题:
HashMap的底层原理
这个问题是最常被问到的问题之一,因为一个问题可以牵扯出很多数据结构的知识,很考验功底,建议有时间自己琢磨总结一下。画一画、理一理自己的回答思路线。
参考答案:
http://www.cnblogs.com/chenssy/p/3521565.html
https://www.cnblogs.com/holyshengjie/p/6500463.html
线程的状态
创建线程(new Thread)、就绪(runnable)、运行(running)、阻塞(blocked)、等待队列、锁池队列、死亡(dead)
事务的特性、事务的隔离级别
事务的特性
原子性:
指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性:
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。转账前和转账后的总金额不变。
隔离性:
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性:
指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
脏读:
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
不可重复读:
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
虚读(幻读):
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
现在来看看MySQL数据库为我们提供的四种隔离级别:
①Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
②Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③Read committed (读已提交):可避免脏读的发生。
④Read uncommitted (读未提交):最低级别,任何情况都无法保证。
以上四种隔离级别最高的是Serializable级别,最低的是Read uncommitted级别,当然级别越高,执行效率就越低。像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,所以平时选用何种隔离级别应该根据实际情况。在MySQL数据库中默认的隔离级别为Repeatable read (可重复读)。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
通