面试描述
这次还是挺悬的, 幸亏编程题想出来了, 想不出来就gg了
- 自我介绍
- 问了实习中做的工作内容, 实习里面spark怎么用什么的
- spark了解的多吗, 讲一讲spark执行任务的流程
- 从哪里可以看出spark executor里面任务的执行情况?
- 又问到DAG图执行的过程, 这里我没太懂面试官的意思, 心想DAG图还有什么执行过程? 然后就回答从textFile()方法或者persist()开始. 后来听面试官的解答才知道问的不是这个, 问的知识点是RDD的惰性执行操作. 从最后一个rdd开始求出需要什么父rdd, 然后依次向前执行, 不action不执行.
- 实习里面kafka怎么用的?
- kafka实现高可用的方式?(分区机制, leader和follower,ack参数)
- kafka选举?(kafka控制器, leader epoch)
- Java线程池(7个参数, 提交一个任务会经过怎样的流程)
- JVM垃圾回收算法. (说了三种, 和CMS收集器). 又让讲讲G1收集器
编程题问的是复原ip地址. 也是很经典的一道题了. leetcode 93
但这道题很久之前做过的, 有点忘了. 幸亏面试的时候想起来了, 不然又gg了.
需要的边界条件还是比较多的. 要考虑每一组ip是不是0开头, 是不是大于255, 遍历完之后ip段数是不是小于4或大于4, 这些情况都是需要剪枝排除掉的. 我写的时候忘考虑ip段数是不是小于4这个条件了. 还好写完之后只让讲思路, 要不然现场写bug太尴尬了.
最后问面试官评价, 面试官说基础掌握的还可以, 但是不深入, 源码看的少(事实上我之前根本没看过spark源码). 以后还是要多学源码多深入吧.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.util.Scanner; import java.util.*; public class Main { public ArrayList<List<String>> string2ips(String s){ if(s == null || "".equals(s)){ return new ArrayList<>(); } List<List<String>> ans = new ArrayList<>(); List<String> curr = new ArrayList<>(); int index = 0; dfs(ans, curr, index, s); return ans; } private void dfs(List<List<String>> ans, List<String> curr, int index, String s){ if(index == s.length() && curr.size() == 4){ ans.append(curr); } if(curr.size() > 4){ return; } char ch = s.charAt(index); String last = curr.get(curr.size() - 1); if(ch == '0'){ String last_new = last + ch; if(Integer.valueOf(last) <= 255){ curr.set(curr.size()-1, last_new); dfs(ans, curr, index + 1, s); curr.set(curr.size()-1, last); } } else{ last = last + ch; if(Integer.valueOf(last) <= 255){ curr.set(curr.size()-1, last_new); dfs(ans, curr, index + 1, s); curr.set(curr.size()-1, last); } curr.add(String.valueOf(ch)); dfs(ans, curr, index + 1, s); curr.remove(curr.size() - 1); } } }
|