【快手】快手大数据开发工程师面经

好像是流媒体的部门,一个下午面了三面技术,感觉还行,大概分享一下还记得的一些题吧。

一面(40min)

自我介绍
Spark任务调度(源码)
Kafka基本原理说一下(生产消费模型,存储,Leader选举,ISR,反正想到啥就说啥了)
Consumer Group中Consumer和Partition的对应关系(Range和RoundRobin)
Kafka支持什么语义(三种语义),怎么实现Exactly Once
Spark Streaming和Flink的区别(说部门主要用Flink,奈何我没怎么用过)
Scala的模式匹配和Java有什么区别
用Kafka的过程中有过什么问题,怎么解决
实习做了什么
撕代码:

  1. 有序链表合并
  2. n*m的带有数字的矩阵,从左上角走到右下角,问最短的路径上经过的数字的和是多少?(dp)

二面(1h20min)

自我介绍
Java多线程了解吗?写个生产者消费者模型吧(wtf?上来就搞这个)
写完讲了讲
线程池熟悉是吧?写个线程池(??还好我看过源码)
写完问怎么改进让它支持切换到SHUTDOWN状态?因为我只是参考了源码实现了一个能提交任务的简单线程池,没考虑别的,要改进的话有点麻烦,就大概说了下思路,也不知道对不对。
Java线程同步啥的,不太记得了。
Flink了解吗,基本的概念说一下
撕算法:给一个不带分隔符的IP字符串,要给出所有的可能的IP地址,返回一个List(懵逼,用回溯写了个大概)。
也没让我问问题就匆匆结束了

三面(40min)

自我介绍
实习做了什么
Kafka基本原理说一下,和其他的MQ相比的优势
Kafka 消费者怎么从Kafka取数据的
消费者怎么保证ExactlyOnce(感觉跟前两面的问题的有点重复)
Kafka消费者怎么保证有序性
Kafka生产者怎么保证不丢不重复(幂等)
Kafka生产者写入怎么保证有序
撕算法:两字符串最长公共子串(一开始是别的题,我没太搞懂他什么意思,就换这个了,反正dp做呗)

差不多就这样结束,三面面试官赶着开会,就匆匆结束了。

整体感觉还可以,就是撕的有点多,面得太累。二面感觉压力有点大,也可能是我复习的不是很到位,Java还是要多看看。




#快手校招##快手##大数据开发工程师##面经##校招#
全部评论
天哪  我一个不了解大数据生态的明天要面试了  好慌
点赞 回复 分享
发布于 2020-08-27 10:31
大佬 你的大数据怎么都是kafka  没有问hadoop 之类的吗
点赞 回复 分享
发布于 2020-08-27 10:27
许愿意向书!!!!
点赞 回复 分享
发布于 2020-08-27 10:11
大佬 你的大数据怎么都是kafka  没有问hadoop 之类的吗
点赞 回复 分享
发布于 2020-08-27 09:28
算法都比较简单啊
点赞 回复 分享
发布于 2020-05-26 16:25
问一下楼主啊,你最后入职了吗?
点赞 回复 分享
发布于 2020-05-19 18:09
感谢南邮学长,最近面试每次问到kafka,我都说只会用,不懂原理,今天看完你的题目,我必须认真学一下原理了。
点赞 回复 分享
发布于 2020-04-04 10:47
感谢大佬面筋,今年秋招我应该用得上😁
点赞 回复 分享
发布于 2020-04-04 09:04
好难啊,大佬厉害
点赞 回复 分享
发布于 2020-03-27 09:04
二面好难啊
点赞 回复 分享
发布于 2020-03-26 16:12

相关推荐

04-27 16:50
已编辑
门头沟学院 Java
1. mysql删除表语句是什么?drop和truncate区别?2. 删除一行数据的sql3. 查询一张表所有的数据的sql4. 查询一张表有多少条数据sql。  count(1)和count(*)区别5. i++和++i区别6. 介绍下重载和重写。  构造方法可以重写重载吗?7. arraylist和linkedlist的区别8.解释一下深拷贝和浅拷贝9. 如果有三个线程,我如何能保证顺序执行.方法1: 使用join()join() 方法可以确保一个线程在另一个线程执行完毕后才开始执行。通过合理地调用 join(),可以实现线程的顺序执行。方法2:使用countdownlatch/semaphore方法3: 使用锁和原子类,wait() + notifyAll()方法4: 使用completablefuture10. 如果有一个 T1 线程,想把 T2 线程加到 T1 里面,怎么实现?方法1. 使用join()Thread t2 = new Thread(() -> {    // T2 线程的执行逻辑    System.out.println("T2 线程正在执行");});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                // T1 线程在此处等待 T2 线程执行完成        t2.start();  // 启动 T2 线程        t2.join();    // T1 等待 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException e) {        e.printStackTrace();    }});t1.start();方法2. 使用future.get()ExecutorService executor = Executors.newSingleThreadExecutor();Future future = executor.submit(() -> {    // T2 线程的执行逻辑    System.out.println("T2 线程正在执行");});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                // T1 线程在此处等待 T2 线程执行完成        future.get();  // 阻塞直到 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException | ExecutionException e) {        e.printStackTrace();    } finally {        executor.shutdown();    }});t1.start();方法3. 使用countdownlatchCountDownLatch latch = new CountDownLatch(1);Thread t2 = new Thread(() -> {    try {        System.out.println("T2 线程正在执行");    } finally {        latch.countDown();  // 完成时减少计数    }});Thread t1 = new Thread(() -> {    try {        System.out.println("T1 线程开始执行");                t2.start();  // 启动 T2 线程        latch.await();  // 等待 T2 完成                System.out.println("T2 线程已完成,T1 继续执行");    } catch (InterruptedException e) {        e.printStackTrace();    }});t1.start();11. a=a+b 和 a+=b的区别a = a + b,如果 a 和 b 的类型不同(如 a 是 int,b 是 double),需要显式强制类型转换,否则会编译报错。即:double a= 1;int b = 2;a = (double) (a+b); a += b,会自动执行隐式类型转换,将结果转换为 a 的类型。13. 数据库的三大范式如答案有错误欢迎指正
查看24道真题和解析
点赞 评论 收藏
分享
评论
7
114
分享

创作者周榜

更多
牛客网
牛客企业服务