二面
难度:★★★★☆ 视频面,在线编程。总体面试感觉很多不会的,尤其操作系统方面,真是问到了知识盲区。
1.贵司ES集群状况?
涉密,不在帖子里写。
2.ES查询优化的方法有哪些?
指定返回需要的字段,不返回全部字段;
定期对只读索引进行段合并;
***D替换机械硬盘;
shards数量调优(单个shard控制在20G-50G);
优化文档模型,避免使用nested结构,能使用keyword的不使用text;
预热cache,将部分文件提前载入内存中
禁用swap内存交换
3.段合并的底层原理是什么?
一个index的所有数据在一个集群中是分布在不同的nodes上的,而一个node又是由若干shards来组成的,一个shard就是一个lucene实例,是一个基本的搜索单元,发送给es的查询请求,最终会打到所有的lucene实例中去进行搜索,并进行聚合。而对于一个lucene实例来说,索引文件又是由大量的segments来组成的,每次查询,lucene实例都会打开所有的segments分段来进行搜索,而打开segments又需要维持响应数量的文件句柄、上下文环境等,所以底层的segments的数量会影响到搜索效率。
4.lucene底层是如何实现查询的?
这部分我答的不是很好,只能回答的很general,具体的实现很复杂,我看完也没完全记住。Generally speaking,底层本质上是倒排表,倒排表就分为字典文件和正排信息和倒排信息。字典文件包含所有的term, 并包含一个指向倒排信息的地址。Term index用的底层数据结构式FST,Finite-State-Transducer, 有限状态机,我理解是一个升级版的字典树(不知道理解的对不对),查询时,将其倒排信息取出来做拉链归并,当然,lucene的拉链归并根本没那么简单..以后专门写文章讲lucene
5.看过ES底层data目录下的文件吗?里面都有些什么?
看过,只能记得一个大概,具体的全给忘了Hhh♂️,只能凭印象来说,data下是若干个文件夹,每个文件夹都是一个index,每个index下又有若干个segments,.dvd, .tip等等七八种类型的文件。总之这里我答的非常不好,以后专门写文章来填坑(主要我到现在自己都没搞懂,没法跟你们讲哈哈)
6.ES用的是哪种分布式一致性算法?还有哪些分布式一致性算法?
ES用的PacificA算法, 还有两种常见的分布式算法包括paxos,和raft算法,PacificA算法的实现比较简单。
7.你们的搜索系统的精排用了哪些特征?
BM25F ,就是之前提到的,Lucene底层计算相关性的算法,在精排阶段我们会重新算一遍,但是常数k和b都会进行调整。
HTR(Hit Tightness Ratio),HTR用于衡量命中query的term的紧密度的得分,直观含义为对每个命中,计算其周围词中对query的紧密命中情况。
CHR (Continuous Hit Ratio),计算doc连续命中query的term的得分
CQR(Cover Query Ratio),计算doc覆盖了query中多少个term
TimeScore,发布时间和当前query时间的差
8.LTR部分是怎么做的?
9. ES node分为哪几种角色?
master node,代表该结点具有充当master结点的资格,但最后是否能当上master node还需要进行选举。最后当选master的结点负责维护整个集群的状态。
data node, 负责保存数据、处理数据、搜索数据的节点,这种节点对机器的性能要求较高。
ingest node, 预处理结点,ES允许文档在写入前,定义一个pipeline去对这些数据进行预处理。
10.ES是实时的吗?为什么不是实时的?
ES是近实时的,并不是实时的,数据被写入后,它首先存在内存暂存区中,无法被检索到,只有触发refresh(默认是1秒)后,它才会在内存中形成一个segment,可以被检索到,而只有flush后,它才会从内存写到磁盘中持久化。为什么要做成近实时?因为只有形成segment才能被检索到,而如果是实时的话,每次提交都要形成一个段,过多地段会消费过多的资源,因此为了控制segments的数量,ES是近实时查询。
12.如何给ES进行内存分配?给jvm最多多少内存?
留一半内存给jvm,另一半给cache缓存。但是注意给jvm的内存不能超过32G, 超过32G jvm将不使用压缩指针,平白无故地增加了内存的损耗和GC开销。
13.ES采用的是那种锁来处理并发的?
14.操作系统中的虚拟内存是什么?
15.操作系统中的缓冲是什么?
用于协调CPU和IO速度不一致的一种机制。当我们要写入到磁盘数据的时候,我们先把数据写到一个内存的buffer中,而后再一次性地写入,这样的批量操作可以提高数据的读写速率。
16.什么是用户态?什么是内核态?
程序一旦进入系统调用,就会进入内核态,否则就是用户态。所谓系统调用,就是例如分配内存、读写IO等。
17.”零拷贝“是什么?
18.C中如何分配释放内存?堆内存栈内存分别存什么?
因为面试官提到说我进来是要转C++的,而我写过C,所以面试官问了一些相关知识。 用malloc分配内存,free释放内存,堆内存存放对象,栈内存存放临时变量、参数值等。
19.new和malloc区别是什么?
20.野指针是什么?
21.Golang如何避免野指针问题的?
22.再考一道,有1亿个数字,计算出前TOP 10大的数字
全部评论
(1) 回帖