字节提前批AML 机器学习系统开发工程师 一二面凉经
timeline: 7.27投递 7.28约的7.31一面,8.2约的8.3二面,8.4感谢信,hr说知识深度不足,表达能力不够强。
想想还是该对最近的面试做一个复盘,整理一下当时的问题与自己想的一些答案,如有错误请各位大佬指出
一面 7.31
- 介绍项目
- tcp和udp的区别,各有什么优缺点和应用场景
- tcp是一个面向连接的可靠的字节流协议,要使用tcp协议,首先双方需要通过三次握手建立连接,因此tcp只能建立点对点的连接,其次tcp的数据是以字节流的方式去发送的,而tcp也是一个可靠的传输协议,它通过首部校验和,超时重传,序号和确认应答机制来保证消息的可靠性。
- 而udp是一个面向无连接的不可靠的数据包协议,使用udp协议无需建立连接,因此可以实现一对多的广播机制,使用udp消耗的资源也因此更少,但udp不存在可靠传输机制,有数据包丢失的风险,因此只有在哪些能够容忍数据包丢失的场景才使用udp。
- tcp的缺点是,因为需要实现可靠的机制,因此需要更大的首部消耗和资源消耗,因此可能会导致延迟;同时,因为它字节流的特性,可能会导致TCP粘包的出现。TCP一般用于需要保证可靠性的场景,如文件传输,以及用于实现HTTP和HTTPS。
- 而udp的优点则是延迟和资源消耗低,但是存在不可靠性,可能丢包。UDP一般用于包总量较少的通信如DNS,或是视频、音频等需要延迟较低的通信场景。
- tcp如何实现可靠传输
- tcp的数据会被分片成最适合发送的数据块,即进行mss分片,再传输给网络层
- 确认应答机制,tcp的每个数据包都有序列和确认号,确保数据按序发送,同时用于确认之前收到的数据包。
- 校验和机制,tcp在首部中将会保存其信息的校验和,接收方收到之后可以根据校验和检验内容有无差错
- 流量控制和拥塞控制,控制包发送的速率防止包的丢失。
- 输入url的解析过程
- 这个过程里我们首先需要解析url,确定它使用的应用层协议和服务器的域名。首先去查看浏览器缓存中有没有,如果有的话直接返回,没有的话就需要去服务器端获取。
- 为了将请求发送到服务器,首先要向DNS服务器发出DNS请求,先在本地DNS服务器里查看有无DNS缓存,有的话直接返回缓存的ip地址,没有的话就依次询问根服务器,顶级服务器和权威服务器,获得域名对应的ip地址。
- 当我们获得ip地址,我们接下来就可以构建网络请求,在网络协议栈中依次构建http请求,tcp头部,ip头部和mac头部,通过arp协议,找到转发的下一跳mac地址,直到最终转发到我们请求的服务器,服务器的网络协议栈获取这个数据包后,会对它进行逐层的解析,解析其mac头部,ip头部,tcp头部并最终获得这个http请求,服务器处理请求后再以相同的方式返回
- 如何设计一个key-value数据结构,如何拓展,如何实现并发安全
- key-value数据结构即哈希表,我们可以参考常用哈希表的结构去实现这个数据结构,为了实现O(1)的查找效率,底层数据结构应该采用顺序性且可随机访问的结构去存储,可以使用一个数组储存数据,哈希函数可以设计为对数组的长度取模,数组的索引为该key对应的哈希值。
- 如果发生哈希冲突需要扩容,我们可以使用链表存储数据,在数组的每个位置存储一个指向链表的指针,或继续使用哈希数组存储冲突的数据,对key进行再哈希以确定最终的存储位置,在原来的数组中存储指向该数组的指针。
- 算法:岛屿数量,合并区间
二面8.3
- 自我介绍
- 问第一个项目(NLP应用)的模型细节
- 问实习
- 如何实现机器的跨队列部署(如果某个标签的机器不够用于该任务的分配,那么怎么去实现调度到其他机器上)
- 这个时候可以考虑不采用Label selector的硬过滤,使用节点亲和性来实现,在节点亲和性里添加尽量调度到某个标签上的规则。因为在k8s上创建pod时,初始化的Pod会由scheduler调度,首先对label selector的规则进行过滤,过滤掉不合适的节点。如果使用label selector来做选择的话,那么该任务就会等待机器资源的释放。在过滤后scheduler会计算机器的优先级来进行节点分配,优先分配满足亲和性的节点,如果找不到满足节点亲和性规则的节点,调度器会忽略该规则,于是可以实现把分配在某个标签上的机器,调度到其他机器上。
- 优先分配整机还是剩余的机器是怎么去实现的
- 这个可以通过控制scheduler的优先级选项来实现,设置为leastRequestedPriority会尽量分配到空闲资源更多的主机,设置为MostRequestedPriority优先调度到已经使用过的Node上,实现碎片资源的分配。
- 如何排查超时pod
- 首先排查网络组件Calico或者Flannel的状态是否是Running,如果状态存在异常,则从日志中提取中心信息进行分析。
- 检查Pod的网络环境,测试Pod与Pod之间的连通性,再测试Pod与Node之间的连通性
- 抓包检测是否存在异常的状态。
- mysql题
- 给了一个文件,筛选错误码=400的IP地址,用任意语言实现(猜想是希望用shell脚本实现,但我不会,用了python
大概回忆一下是这样的)
用shell实现
grep HTTP_CODE=400 error.txt | awk '{print $2}' | sort | uniq