京东数开一面凉经(广告与算法部)
暑期实习数开0offer选手,最后实习去做了后端,这次秋招全投的后端,京东反而给我流转到数开了,特开此贴记录我跟数开的告别面试(学弟学妹们干这方向一定得慎重!!!如果最后还是做回后端沉没成本还挺大的)。
面试官非常友善,面试特点是一块内容就从一个简单的点切入,挖到你不会就结束这部分。
时间1h20min
- JVM部分
问:cpp在内存管理上和Java有何异同?
答:Java将内存管理托管给了虚拟机。C++是需要程序员进行内存管理。
问:在大数据领域里,将内存完全托管给虚拟机会有什么问题?
答:内存管理不可控,大数据场景下高代价的GC可能持续数分钟。
问:大数据组件中是如何解决的?
答:Flink使用堆外内存避免Full GC, 堆内仅放用户自己创建的对象,大数据放在堆外管理,重写序列化框架,实现二进制运算。
问:再谈谈GC的理解吧,怎么定义垃圾?
答:可达性分析。
追问:GC可达性分析的实现机制?
从根对象作为起始结点,检查是否有对象没有和任何引用链相连。
问:我没有听到我care的点,第一次提示:循环引用时,怎么判断两个引用对象都可以回收?
答:不会。
问:第二次提示:什么对象可以作为根对象?
答:不会。
问:第三次提示:虚拟机栈中引用的对象可以是根对象吗?
答:可以。
问:那你过一遍虚拟机,还有哪部分可以做为根对象呢?
答:方法区中的静态变量,本地方法栈中的引用对象。
- 数据结构部分
答:堆是一种特殊的二叉树。
问:堆有什么应用场景?
答:堆排序、实现优先队列。
问:堆有什么应用场景?
答:堆排序、实现优先队列。
问:堆排怎么实现的?
答:略。
- 批处理部分
答:NN,SN,DN。NN存储数据块信息,处理客户端请求,DN管理数据块,SN处理元信息的备份。
问:进一步阐述下DN的工作。
答:以128M为单位存储数据块,响应客户端读写请求,定期向NN发送心跳。
问:数据块为什么要设计成128M?数据块太小或者太大会带来什么问题?
答:数据块设计得太大,可能会超过机器的处理能力,因为MR过程中最终是一个块起一个Map进程。数据块设计得太小,将带来大量的管理信息,增加NN的负担,同时MR将起多个进程,带来切换开销。
问:你提到了数据块设计得太小造成的两个问题,你认为哪个是主要的?
答:起多个Map任务是主要的。
问:错误,增加NN的管理负担是更主要的问题,因为NN只有一台机器,太多的元数据带来的管理负担可能超过机器能力。此外,为什么你认为起多个Map是很大的开销?
答:一个Map是一个JVM进程,进程的频繁创建和销毁造成JVM起停,浪费CUP资源,频繁进行IO将数据从磁盘运入内存。
问:错误,Hadoop开启了默认优化项包括JVM重用。你之后再好好看看Hadoop。
- 流处理部分
问:Flink中怎么定义窗口?
答:从时间语义和窗口类型定义,时间语义包括事件时间和处理时间,窗口包括滚动滑动和会话窗口。
问:窗口的顺序是靠什么保障的? 答:水印机制。
问:在一个分区任务中,怎么确定算子的水印?
答:输出分区的最小水印。
问:如果由于某种特殊的分区策略导致一个分区迟迟没有收到水印,怎么确保窗口触发计算?
答:算子可以设置一个最大延迟时间。确保计算一定会被触发。
问:水印和检查点标记有什么区别?
答:检查点需要触发状态保存,水印触发窗口计算,检查点没有那么频繁。
问:检查点机制的实现,什么时候触发回滚,一个节点错误会导致导致整个拓扑回滚吗?
答:略。
问:我没有听到我care的点,JM收到了多个算子发来的不同时期的检查点,如何拼接?
答:不会,猜是不是按检查点顺序进优先队列排序,到齐一批开始拼接?
问:提示:你提到的三种状态后端中,RockDB的优势在哪里?
答:利用了内存缓存和本地缓存。
问:这是很通用的技巧,还有呢?
答:不会。
问:提示:RockDB利用了LSM树实现了状态的增量同步,你下来可以多看看书。
- 写题