公众号(五分钟学大数据)将推出大数据面试系列文章— 五分钟小面试,此系列文章将会 深刻研究各大厂笔面试真题,并根据笔面试题 扩展相关的知识点,助力你们都可以成功入职大厂!
大数据笔面试系列文章分为两种类型:混合型(即一篇文章中会有多个框架的知识点—融会贯通);专项型(一篇文章针对某个框架进行深刻解析—专项演练)。java
此篇文章为系列文章的第一篇(混合型)mysql
class Father{ static { System.out.println("Static Father"); } { System.out.println("Non-static Father"); } public Father(){ System.out.println("Constructor Father"); } } public class Son extends Father{ static { System.out.println("Static Son"); } { System.out.println("Non-static Son"); } public Son(){ System.out.println("Constructor Son"); } public static void main(String[] args) { System.out.println("First Son"); new Son(); System.out.println("Second Son"); new Son(); } }
运行结果:面试
Static Father Static Son First Son Non-static Father Constructor Father Non-static Son Constructor Son Second Son Non-static Father Constructor Father Non-static Son Constructor Son
分析:算法
这道程序题考察的是Java中的静态代码块、构造代码块、构造函数的概念。sql
随着类的加载而执行,即JVM加载类后就执行,并且只执行一次,执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。数据库
执行的时候若是有静态代码块,先执行静态代码块再执行非静态代码块,在每一个对象生成时都会被执行一次,它能够初始化类的实例变量。非静态代码块会在构造函数执行时,在构造函数主体代码执行以前被运行。编程
对象一创建,就会调用与之相应的构造函数,也就是说,不创建对象,构造函数是不会运行的。
一个对象创建,构造函数只运行一次,而通常方法能够被该对象调用屡次。缓存
再来看本题,程序运行,执行main()方法会先加载main()方法所在的类,加载 Son 类,可是 Son 类继承自 Father 类,因此先加载父类,同时父类的静态代码块执行,而后加载 Son 类自己,Son 类本身的静态代码块开始执行,类加载完成以后执行main()方法内部的语句,打印 First Son,而后 new Son(),在建立对象时先构造父类的对象,由于静态代码块只在类加载时执行一次,因此再也不执行,而后执行父类的构造代码块,构造函数,构造代码块的优先级大于构造函数。而后在执行 Son 对象自己。完成以后打印 Second Son,接着又 new Son(),重复以上步骤。构造代码块和构造函数在每次new的时候都会执行一次。安全
答:一般咱们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而经过new关键字和构造器建立的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操做最快可是也很小,一般大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存均可以被当成堆空间来使用。mysql优化
String str = new String(“hello”);
上面的语句中str放在栈上,用new建立出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。
补充:较新版本的Java中使用了一项叫“逃逸分析“的技术,能够将一些局部对象放在栈上以提高对象的操做性能。(在 Java SE 6u23+ 开始支持,并默认设置为启用状态,能够不用额外加这个参数。)
答:方案 1:申请 512M 的内存,512M是42亿多 bit,一个 bit 位表明一个 unsigned int 值。读入 40 亿个数,设置相应的 bit 位,读入要查询的数,查看相应 bit 位是否为 1,为 1 表示存在,为 0 表示不存在。
方案 2:这个问题在《编程珠玑》里有很好的描述,你们能够参考下面的思路,探讨一下: 由于 2^32 为 42 亿多,因此给定一个数可能在,也可能不在其中; 这里咱们把 40 亿个数中的每个用 32 位的二进制来表示 ,假设这 40 亿个数开始放在一个文件中。 而后将这 40 亿个数分红两类:
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20 亿,而另外一个>=20 亿(至关于折半); 与要查找的数的最高位比较并接着进入相应的文件再查找
而后再把这个文件为又分红两类:
并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10 亿,而另外一个>=10 亿(至关于折半); 与要查找的数的次最高位比较并接着进入相应的文件再查找。
.....
以此类推,就能够找到了,并且时间复杂度为 O(logn)。
答:
答:
kafka的数据offset读取流程:
答:
基于数据库实现分布式锁:(性能较差,锁表的风险,非阻塞,失败须要轮询耗CPU)
利用select … where … for update 排他锁
注意: 其余附加功能与实现基本一致,这里须要注意的是“where name=lock ”,name字段必需要走索引,不然会锁表。有些状况下,好比表不大,mysql优化器会不走这个索引,致使锁表问题。
所谓乐观锁与悲观锁最大区别在于基于CAS思想,是不具备互斥性,不会产生锁等待而消耗资源,操做过程当中认为不存在并发冲突,只有update version失败后才能觉察到。咱们的抢购、秒杀就是用了这种实现以防止超卖。
乐观锁是经过增长递增的版本号字段实现的。
基于缓存(Redis等)实现分布式锁:(过时时间很差控制,非阻塞,失败须要轮询耗CPU)
大体思想:每一个客户端对某个功能加锁时,在zookeeper上的与该功能对应的指定节点的目录下,⽣生成⼀个惟一的瞬时有序节点。判断是否获取锁的方式很简单,只须要判断有序节点中序号最小的一个。当释放锁的时候,只需将这个瞬时节点删除便可。同时,其能够避免服务宕机致使的锁没法释放,⽽而产生的死锁问题。
答:
Hadoop底层使用MapReduce计算架构,只有map和reduce两种操做,表达能力比较欠缺,并且在MR过程当中会重复的读写hdfs,形成大量的磁盘io读写操做,因此适合高时延环境下批处理计算的应用;
Spark是基于内存的分布式计算架构,提供更加丰富的数据集操做类型,主要分红转化操做和行动操做,包括map、reduce、filter、flatmap、groupbykey、reducebykey、union和join等,数据分析更加快速,因此适合低时延环境下计算的应用;
spark与hadoop最大的区别在于迭代式计算模型。基于mapreduce框架的Hadoop主要分为map和reduce两个阶段,两个阶段完了就结束了,因此在一个job里面能作的处理颇有限;spark计算模型是基于内存的迭代式计算模型,能够分为n个阶段,根据用户编写的RDD算子和程序,在处理完一个阶段后能够继续往下处理不少个阶段,而不仅是两个阶段。因此spark相较于mapreduce,计算模型更加灵活,能够提供更强大的功能。
可是spark也有劣势,因为spark基于内存进行计算,虽然开发容易,可是真正面对大数据的时候,在没有进行调优的状况下,可能会出现各类各样的问题,好比OOM内存溢出等状况,致使spark程序可能没法运行起来,而mapreduce虽然运行缓慢,可是至少能够慢慢运行完。
答:
当 jobclient 向YARN提交一个应用程序后,YARN将分两个阶段运行这个应用程序:一是启动ApplicationMaster;第二个阶段是由ApplicationMaster建立应用程序,为它申请资源,监控运行直到结束。
具体步骤以下:
答:
如一张表的记录数在一个已知的范围内,或者上下浮动不会超过某个阈值:
日活、周活、月活、留存(日周月)、转化率(日、周、月)GMV(日、周、月)
复购率(日周月)
单表空值检测
某个字段为空的记录数在一个范围内,或者占总量的百分比在某个阈值范围内
单表重复值检测
一个或多个字段是否知足某些规则
跨表数据量对比
主要针对同步流程,监控两张表的数据量是否一致
答:这类问题都归为求Top K的问题,解决方法都差很少。
将这一天访问百度的日志的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。一样能够采用映射的方法,好比模1000,把整个大文件映射为1000个小文件,再找出每一个小文中出现频率最大的IP(能够采用 HashMap 进行频率统计,而后再找出频率最大的几个)及相应的频率。而后再在这1000个最大的IP中找出那个频率最大的IP,即为所求。
算法思想:分而治之+Hash
小文件中,这样每一个小文件最多包含4MB个IP地址; 这里解释一下为何用Hash(IP) % 1024值,若是不用,而直接分类的话,可能会出现这样一种状况,就是有个IP在每一个小文件中都存在,并且这个IP并不必定在那个小文件中是数量最多的,那么最终可能选择的结果会有问题,因此这里用了Hash(IP)%1024值,这样的话,经过计算IP的Hash值,相同IP确定会放到一个文件中,固然了不一样的IP的Hash值也可能相同,就存在一个小文件中。