2020 java Elasticsearch面试题及答案(最全版本持续更新)

前言

涵盖各大公司会问到的面试点,同时随着版本的升级,可能也会有一些面试题更新,也会同步保持更新,由于篇幅缘由(实际上是我懒,哈哈)因此列了一部分答案,全部的答案见下文,总共485页合计20个技术点,文末自取pdf.node

一、elasticsearch 了解多少,说说大家公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。面试

面试官:想了解应聘者以前公司接触的 ES 使用场景、规模,有没有作过比较大规模的索引设计、规划、调优。算法

解答:api

如实结合本身的实践场景回答便可。缓存

好比:ES 集群架构 13 个节点,索引根据通道不一样共 20+索引,根据日期,每日递增 20+,索引:10 分片,每日递增 1 亿+数据,每一个通道天天索引大小控制:150GB 以内。数据结构

仅索引层面调优手段:架构

1.一、设计阶段调优并发

一、根据业务增量需求,采起基于日期模板建立索引,经过 roll over API 滚动索app

引;运维

二、使用别名进行索引管理;

三、天天凌晨定时对索引作 force_merge 操做,以释放空间;

四、采起冷热分离机制,热数据存储到 SSD,提升检索效率;冷数据按期进行 shrink

操做,以缩减存储;

五、采起 curator 进行索引的生命周期管理;

六、仅针对须要分词的字段,合理的设置分词器;

七、Mapping 阶段充分结合各个字段的属性,是否须要检索、是否须要存储等。

1.二、写入调优

一、写入前副本数设置为 0;

二、写入前关闭 refresh_interval 设置为-1,禁用刷新机制;

三、写入过程当中:采起 bulk 批量写入;

四、写入后恢复副本数和刷新间隔;

五、尽可能使用自动生成的 id。

1.三、查询调优

一、禁用 wildcard;

二、禁用批量 terms(成百上千的场景);

三、充分利用倒排索引机制,能 keyword 类型尽可能 keyword;

四、数据量大时候,能够先基于时间敲定索引再检索;

五、设置合理的路由机制。

1.四、其余调优

部署调优,业务调优等。

上面的说起一部分,面试者就基本对你以前的实践或者运维经验有所评估了。

二、elasticsearch 的倒排索引是什么

面试官:想了解你对基础概念的认知。

解答:通俗解释一下就能够。

传统的咱们的检索是经过文章,逐个遍历找到对应关键词的位置。

而倒排索引,是经过分词策略,造成了词和文章的映射关系表,这种词典+映射表即为倒排索引。

有了倒排索引,就能实现 o(1)时间复杂度的效率检索文章了,极大的提升了检索效率

学术的解答方式:

倒排索引,相反于一篇文章包含了哪些词,它从词出发,记载了这个词在哪些文档中出现过,由两部分组成——词典和倒排表。

加分项:倒排索引的底层实现是基于:FST(Finite State Transducer)数据结构。

lucene 从 4+版本后开始大量使用的数据结构是 FST。

FST 有两个优势:

一、空间占用小。经过对词典中单词前缀和后缀的重复利用,压缩了存储空间;

二、查询速度快。O(len(str))的查询时间复杂度。

三、elasticsearch 索引数据多了怎么办,如何调优,部署

面试官:想了解大数据量的运维能力。

解答:索引数据的规划,应在前期作好规划,正所谓“设计先行,编码在后”,这样才能有效的避免突如其来的数据激增致使集群处理能力不足引起的线上客户检索或者其余业务受到影响。

如何调优,正如问题 1 所说,这里细化一下:

3.1 动态索引层面

基于模板+时间+rollover api 滚动建立索引,举例:设计阶段定义:blog 索引的模板格式为:blog_index_时间戳的形式,天天递增数据。

这样作的好处:不至于数据量激增致使单个索引数据量很是大,接近于上线 2 的32 次幂-1,索引存储达到了 TB+甚至更大。

一旦单个索引很大,存储等各类风险也随之而来,因此要提早考虑+及早避免.

3.2 存储层面

冷热数据分离存储,热数据(好比最近 3 天或者一周的数据),其他为冷数据。对于冷数据不会再写入新数据,能够考虑按期 force_merge 加 shrink 压缩操做,节省存储空间和检索效率。

3.3 部署层面

一旦以前没有规划,这里就属于应急策略。

结合 ES 自身的支持动态扩展的特色,动态新增机器的方式能够缓解集群压力,**注意:**若是以前主节点等规划合理,不须要重启集群也能完成动态新增的。

四、elasticsearch 是如何实现 master 选举的

面试官:想了解 ES 集群的底层原理,再也不只关注业务层面了。

解答:

前置前提:

一、只有候选主节点(master:true)的节点才能成为主节点。

二、最小主节点数(min_master_nodes)的目的是防止脑裂。

这个我看了各类网上分析的版本和源码分析的书籍,云里雾里。

核对了一下代码,核心入口为 findMaster,选择主节点成功返回对应 Master,不然返回 null。

选举流程大体描述以下:

第一步:确认候选主节点数达标,elasticsearch.yml 设置的值.

discovery.zen.minimum_master_nodes;

第二步:比较:先断定是否具有 master 资格,具有候选主节点资格的优先返回;若两节点都为候选主节点,则 id 小的值会主节点。注意这里的 id 为 string 类型。

五、详细描述一下 Elasticsearch 索引文档的过程

面试官:想了解 ES 的底层原理,再也不只关注业务层面了。

解答:

这里的索引文档应该理解为文档写入 ES,建立索引的过程。

文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流程。

第一步:客户写集群某节点写入数据,发送请求。(若是没有指定路由/协调节点,请求的节点扮演路由节点的角色。)

第二步:节点 1 接受到请求后,使用文档_id 来肯定文档属于分片 0。请求会被转到另外的节点,假定节点 3。所以分片 0 的主分片分配到节点 3 上。

第三步:节点 3 在主分片上执行写操做,若是成功,则将请求并行转发到节点 1和节点 2 的副本分片上,等待结果返回。全部的副本分片都报告成功,节点 3 将向协调节点(节点 1)报告成功,节点 1 向请求客户端报告写入成功。

若是面试官再问:第二步中的文档获取分片的过程?

回答:借助路由算法获取,路由算法就是根据路由和文档 id 计算目标的分片 id 的过程。

1shard = hash(_routing) % (num_of_primary_shards)

六、详细描述一下 Elasticsearch 搜索的过程?

面试官:想了解 ES 搜索的底层原理,再也不只关注业务层面了。

解答:

搜索拆解为“query then fetch” 两个阶段。query 阶段的目的:定位到位置,但不取。

步骤拆解以下:

一、假设一个索引数据有 5 主+1 副本 共 10 分片,一次请求会命中(主或者副本

分片中)的一个。

二、每一个分片在本地进行查询,结果返回到本地有序的优先队列中。

三、第 2)步骤的结果发送到协调节点,协调节点产生一个全局的排序列表。

fetch 阶段的目的:取数据。

路由节点获取全部文档,返回给客户端。

七、Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

面试官:想了解对 ES 集群的运维能力。

解答:

一、关闭缓存 swap;

二、堆内存设置为:Min(节点内存/2, 32GB);

三、设置最大文件句柄数;

四、线程池+队列大小根据业务须要作调整;

五、磁盘存储 raid 方式——存储有条件使用 RAID10,增长单节点性能以及避免单

节点存储故障。

八、elasticsearch 是如何实现master选举的.

面试官: 想了解ES集群的底层原理,再也不只关注业务层面了.

解答:

前置前提:

1.只有候选主节点(master: true) 的节点才能成为主节点。

2.最小主节点数(min master. nodes)的目的是防止脑裂。

这个我看了各类网上分析的版本和源码分析的书籍,云里雾里.核对了-下代码,核心入口为findMaster, 选择主节点成功返回对应Master,不然返回null.选举流程大体描述以下:

第一步:确认候选主节点数达标,elas ticsearch.yml设置的值.

discovery.zen.minimum_ master. nodes;

第二步:比较:先断定是否具有master资格,具有候选主节点资格的优先返回;若两节点都为候选主节虑,则id小的值会主节点。注意这里的id为string 类型。题外话:获取节点id的方法。

1GET 1. cat/nodes?v&h-ip.port.heapPercentheapMax.id,name
2ip
port heapPercent heapMax id
name

九、Elasticsearch 中的节点(好比共20个),其中的10个,选了一个master,另外10个选了另-个master,怎么办?

1.当集群master候选数量不小于3个时,能够经过设置最少投票经过数量(discovery.zen.minimum_ master_ nodes)超过全部候选节点一半以上来解决脑裂问题.

二、当候选数量为两个时,只能修改成惟一的一 -个master候选,其余做为data节点,避免脑裂问题.

十、详细描述-下Elasticsearch更新和删除文档的过程。

1.删除和更新也都是写操做,可是Elasticsearch中的文档是不可变的,所以不能被删除或者改动以展现其变动;

2.磁盘上的每一个段都有一个相应的.del文件。当删除请求发送后,文档并无真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,可是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段.

3.在新的文档被建立时, Elasticsearch会为该文档指定一个版本号, 当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到- .个新段.旧版本的文档依然能匹配查询,可是会在结果中被过滤掉.

十一、是否了解字典树?

十二、对于GC方面,在使用Elasticsearch时要注意什么?

1三、Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

1四、在并发状况下,Elasticsearch 若是保证读写-致?

1五、如何监控Elasticsearch集群状态?

1六、介绍一下大家的个性化搜索方案?

上面的这些面试题都整理成了PDF文档,但愿能帮助到你面试前的复习并找到一个好的工做,相对来讲也节省了你在网上搜索资料的时间来学习!!!

附欢迎关注个人公种号:it资源之家 ,扫描下面二维码便可领取更多一线大厂Java面试题资料!

最后

欢迎你们评论区一块儿交流,相互提高;整理资料不易,若是喜欢文章记得点个赞哈,感谢你们支持!!!

相关文章
相关标签/搜索