最少必要面试题 ,《10万字301道Java经典面试题总结(附答案)》pdf,背题更便利,一文在手,面试我有
突击面试 | 突击面试 | 突击面试
以下是 ElasticSearch 面试题,相信咱们都会有种及眼熟又生疏的感觉、看过可能在时刻短的面试后又马上忘记了。JavaPub在这里收拾这些简略忘记的要点知识及答复,主张保藏,常常温习查阅
。
看看这些面试题你会几道
关于es的面试,主张运用名词用官方语言描绘会更准确。
[toc]
1. 说说你们公司 es 的集群架构,索引数据巨细,分片有多少,以及一些调优手法 。
节点数、分片数、副本数,尽量依据自己公司运用状况答复,当然适当放大也可行。
调优手法是现在很常见的面试题,下面这几种调优手法必定要了解懂。当然,下面的每一条都能够作为调优的一部分。
设计调优
参阅: www.cnblogs.com/sanduzxcvbn…
a. 依据业务增量需求,采纳根据日期模板创立索引,经过 rollover API
翻滚索引;(rollover API我会独自写一个代码事例做解说,公众号:JavaPub)
b. 运用别号进行索引办理;(es的索引名不能改动,供给的别号机制运用非常广泛。)
c. 每天清晨守时对索引做force_merge操作,以开释空间;
d. 采纳冷热分离机制,热数据存储到SSD,提高检索效率;冷数据守时进行shrink操作,以减缩存储;
e. 采纳curator进行索引的生命周期办理;
f. 仅针对需求分词的字段,合理的设置分词器;
g. Mapping阶段充沛结合各个字段的属性,是否需求检索、是否需求存储等。
进100+原创文章:gitee.com/rodert/Java…
写入调优
- 写入前副本数设置为0;
- 写入前关闭refresh_interval设置为-1,禁用刷新机制;
- 写入进程中:采纳bulk批量写入;
- 写入后恢复副本数和刷新距离;
- 尽量运用自动生成的id。
查询调优
- 禁用wildcard;(通配符形式,类似于%like%)
- 禁用批量terms(成百上千的场景);
- 充沛利用倒排索引机制,能keyword类型尽量keyword;
- 数据量大时分,能够先根据时刻敲定索引再检索;
- 设置合理的路由机制。
2. elasticsearch 的倒排索引是什么
倒排索引也便是单词到文档的映射,当然不只是存里文档id这么简略。还包含:词频(TF,Term Frequency)、偏移量(offset)、方位(Posting)。
3. elasticsearch 是如何完成 master 推举的
ElasticSearch 的选主是 ZenDiscovery 模块负责,源码剖析将首发在。 gitee.com/rodert/Java…
- 对一切能够成为 Master 的节点(node.master: true)依据 nodeId 排序,每次推举每个节点都把自己所知道节点排一次第,然后选出第一个(第0位)节点,暂时以为它是 Master 节点。
- 假如对某个节点的投票数到达必定的值(能够成为master节点数n/2+1)而且该节点自己也推举自己,那这个节点便是master。不然从头推举。 (当然也能够自己设定一个值,最小值设定为超越能成为Master节点的n/2+1,不然会呈现脑裂问题。discovery.zen.minimum_master_nodes)
5. 描绘一下 Elasticsearch 索引文档的进程
- 客户端向 Node 1 发送新建、索引或许删去恳求。
- 节点运用文档的 _id 确定文档归于分片 0 。恳求会被转发到 Node 3,由于分片 0 的主分片现在被分配在 Node 3 上。
- Node 3 在主分片上面履行恳求。假如成功了,它将恳求并行转发到 Node 1 和 Node 2 的副本分片上。一旦一切的副本分片都报告成功, Node 3 将向和谐节点报告成功,和谐节点向客户端报告成功。
一图胜千文,记住这幅图,上面是文档在节点间分发的进程,接着说一下文档从接收到写入磁盘进程。 和谐节点默认运用文档 ID 参与核算(也支撑经过 routing),以便为路由供给适宜的分片。
shard = hash(document_id) % (num_of_primary_shards)
- 当分片所在的节点接收到来自和谐节点的恳求后,会将恳求写入到 MemoryBuffer,然后守时(默认是每隔 1 秒)写入到 Filesystem Cache,这个从 MomeryBuffer 到 Filesystem Cache 的进程就叫做 refresh;
- 当然在某些状况下,存在 Momery Buffer 和 Filesystem Cache 的数据可能会丢掉,ES 是经过 translog 的机制来确保数据的可靠性的。其完成机制是接收到恳求后,一起也会写入到 translog 中,当 Filesystem cache 中的数据写入到磁盘中时,才会清除掉,这个进程叫做 flush;
- 在 flush 进程中,内存中的缓冲将被清除,内容被写入一个新段,段的 fsync将创立一个新的提交点,并将内容刷新到磁盘,旧的 translog 将被删去并开端一个新的 translog。
- flush 触发的机遇是守时触发(默认 30 分钟)或许 translog 变得太大(默以为 512M)时;
1. translog 能够理解为便是一个文件,一直追加。
2. MemoryBuffer 运用缓存。
3. Filesystem Cache 系统缓冲区。
延伸阅览:Lucene 的 Segement
:
- Lucene 索引是由多个段组成,段自身是一个功用彻底的倒排索引。
- 段是不行变的,答应 Lucene 将新的文档增量地增加到索引中,而不用从头重建索引。
- 关于每一个查找恳求而言,索引中的一切段都会被查找,而且每个段会消耗CPU 的时钟周、文件句柄和内存。这意味着段的数量越多,查找功能会越低。
- 为了处理这个问题,Elasticsearch 会合并小段到一个较大的段,提交新的合并段到磁盘,并删去那些旧的小段。
4. 详细描绘一下 Elasticsearch 查找的进程?
es作为一个分布式的存储和检索系统,每个文档依据 _id 字段做路由分发被转发到对应的shard上。
查找履行阶段进程分俩个部分,咱们称之为 Query Then Fetch。
4.1 query-查询阶段
当一个search恳求发出的时分,这个query会被广播到索引里边的每一个shard(主shard或副本shard),每个shard会在本地履行查询恳求后会生成一个命中文档的优先级队列。
这个队列是一个排序好的top N数据的列表,它的size等于from+size的和,也便是说假如你的from是10,size是10,那么这个队列的size便是20,所以这也是为什么深度分页不能用from+size这种方法,由于from越大,功能就越低。
es里边分布式search的查询流程如下:
查询阶段包含以下三个进程:
- 客户端发送一个 search 恳求到 Node 3 , Node 3 会创立一个巨细为 from + size 的空优先队列。
- Node 3 将查询恳求转发到索引的每个主分片或副本分片中。每个分片在本地履行查询并增加成果到巨细为 from + size 的本地有序优先队列中。
- 每个分片回来各自优先队列中一切文档的 ID 和排序值给和谐节点,也便是 Node 3 ,它合并这些值到自己的优先队列中来产生一个全局排序后的成果列表。
4.2 fetch – 读取阶段 / 取回阶段
分布式阶段由以下进程构成:
- 和谐节点辨别出哪些文档需求被取回并向相关的分片提交多个 GET 恳求。
- 每个分片加载并 丰厚 文档,假如有需求的话,接着回来文档给和谐节点。
- 一旦一切的文档都被取回了,和谐节点回来成果给客户端。
和谐节点首先决议哪些文档 确实 需求被取回。例如,假如咱们的查询指定了 { “from”: 90, “size”: 10 } ,最初的90个成果会被丢弃,只有从第91个开端的10个成果需求被取回。这些文档可能来自和最初查找恳求有关的一个、多个甚至全部分片。
和谐节点给持有相关文档的每个分片创立一个 multi-get request ,并发送恳求给相同处理查询阶段的分片副本。
分片加载文档体– _source 字段—假如有需求,用元数据和 search snippet highlighting 丰厚成果文档。 一旦和谐节点接收到一切的成果文档,它就拼装这些成果为单个呼应回来给客户端。
拓宽阅览:
深翻页(Deep Pagination)
---
先查后取的进程支撑用 from 和 size 参数分页,可是这是 有约束的 。 要记住需求传递信息给和谐节点的每个分片必须先创立一个 from + size 长度的队列,和谐节点需求依据 number_of_shards * (from + size) 排序文档,来找到被包含在 size 里的文档。
取决于你的文档的巨细,分片的数量和你运用的硬件,给 10,000 到 50,000 的成果文档深分页( 1,000 到 5,000 页)是彻底可行的。可是运用足够大的 from 值,排序进程可能会变得非常沉重,运用许多的CPU、内存和带宽。由于这个原因,咱们强烈主张你不要运用深分页。
实际上, “深分页” 很少符合人的行为。当2到3页曩昔以后,人会停止翻页,而且改动查找规范。会不知疲倦地一页一页的获取网页直到你的服务崩溃的罪魁祸首一般是机器人或许web spider。
假如你 确实 需求从你的集群取回许多的文档,你能够经过用 scroll 查询禁用排序使这个取回行为更有效率,咱们会在 later in this chapter 进行评论。
注:https://www.elastic.co/guide/cn/elasticsearch/guide/current/scroll.html
5. Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
- 关闭缓存swap;
原因:大多数操作系统会将内存运用到文件系统缓存,会将运用程序未用到的内存交换出去。会导致jvm的堆内存交换到磁盘上。交换会导致功能问题。会导致内存废物回收延长。会导致集群节点呼应时刻变慢,或许从集群中断开。
-
堆内存设置为:Min(节点内存/2, 32GB);
-
设置最大文件句柄数;
后俩点不明白能够先说有必定了解,关注JavaPub会做详细解说。
-
调整线程池和队列巨细
-
磁盘存储 raid 方法——存储有条件运用 RAID6,增加单节点功能以及防止单节点存储毛病。
www.elastic.co/cn/blog/how…
6. Elasticsearch 中的节点(比如共 20 个),其间的 10 个选了一个 master,别的 10 个选了另一个 master,怎么办?
-
当集群 master 候选数量不小于 3 个时,能够经过设置最少投票经过数量(discovery.zen.minimum_master_nodes)超越一切候选节点一半以上来处理脑裂问题;
-
当候选数量为两个时,只能修改为仅有的一个 master 候选,其他作为 data节点,防止脑裂问题。
7. 客户端在和集群衔接时,如何选择特定的节点履行恳求的?
client 远程衔接衔接一个 elasticsearch 集群。它并不加入到集群中,只是取得一个或许多个初始化的地址,并以轮询的方法与这些地址进行通信。
8. 详细描绘一下 Elasticsearch 更新和删去文档的进程。
- 删去和更新也都是写操作,可是 Elasticsearch 中的文档是不行变的,因而不能被删去或许改动以展现其改变;(底子原因是底层lucene的segment段文件不行更新删去)
- 磁盘上的每个段都有一个相应的 .del 文件。当删去恳求发送后,文档并没有真 的被删去,而是在
.del
文件中被标记为删去。该文档依然能匹配查询,可是会在 成果中被过滤掉。当段合并时,在.del 文件中被标记为删去的文档将不会被写入 新段。 - 在新的文档被创立时,Elasticsearch 会为该文档指定一个版别号,当履行更新 时,旧版别的文档在.del 文件中被标记为删去,新版别的文档被索引到一个新段。
旧版别的文档依然能匹配查询,可是会在成果中被过滤掉。
9. Elasticsearch 关于大数据量(上亿量级)的聚合如何完成?
这道题目较难,相信咱们看到许多类似这种答复
Elasticsearch 供给的首个近似聚合是cardinality 度量。它供给一个字段的基数,即该字段的distinct或许unique值的数目。它是根据HLL算法的。HLL 会先对咱们的输入作哈希运算,然后依据哈希运算的成果中的 bits 做概率估算然后得到基数。其特色是:可装备的精度,用来操控内存的运用(更准确 = 更多内存);小的数据集精度是非常高的;咱们能够经过装备参数,来设置去重需求的固定内存运用量。不管数千还是数十亿的仅有值,内存运用量只与你装备的准确度相关。
科普&拓宽:
HyperLogLog:
下面简称为HLL,它是 LogLog 算法的升级版,作用是能够供给不准确的去重计数。存在以下的特色:
1. 能够运用很少的内存来计算巨量的数据,在 Redis 中完成的 HyperLogLog,只需求12K内存就能计算2^64个数据。
2. 计数存在必定的误差,误差率全体较低。规范误差为 0.81% 。
3. 误差能够被设置辅佐核算因子进行降低。
---
运用场景:
1. 基数不大,数据量不大就用不上,会有点大材小用糟蹋空间
2. 有局限性,便是只能计算基数数量,而没办法去知道详细的内容是什么
3. 和bitmap比较,归于两种特定计算状况,简略来说,HyperLogLog 去重比 bitmap 便利许多
4. 一般能够bitmap和hyperloglog配合运用,bitmap标识哪些用户活泼,hyperloglog计数
---
运用场景:
1. 基数不大,数据量不大就用不上,会有点大材小用糟蹋空间
2. 有局限性,便是只能计算基数数量,而没办法去知道详细的内容是什么
3. 和bitmap比较,归于两种特定计算状况,简略来说,HyperLogLog 去重比 bitmap 便利许多
4. 一般能够bitmap和hyperloglog配合运用,bitmap标识哪些用户活泼,hyperloglog计数
来源:刷刷面试
10. 在并发状况下,Elasticsearch 假如确保读写共同?
首先要了解什么是共同性,在分布式系统中,咱们一般经过CPA理论剖析。
分布式系统不行能一起满意共同性(C:Consistency)、可用性(A:Availability)和分区容忍性(P:Partition Tolerance),最多只能一起满意其间两项。
- 能够经过版别号运用乐观并发操控,以确保新版别不会被旧版别掩盖,由运用层来处理详细的抵触;
- 别的关于写操作,共同性等级支撑 quorum/one/all,默以为 quorum,即只有当大多数分片可用时才答应写操作。但即使大多数可用,也可能存在由于网络等原因导致写入副本失利,这样该副本被以为毛病,分片将会在一个不同的节点上重建。
- 关于读操作,能够设置 replication 为 sync(默认),这使得操作在主分片和副本分片都完成后才会回来;假如设置 replication 为 async 时,也能够经过设置查找恳求参数_preference 为 primary 来查询主分片,确保文档是最新版别。
11. 介绍一下你们的个性化查找计划?
假如你没有许多实战经验,能够根据 word2vec 做一些练习,我的博客供给了 word2vec Java版的一些Demo。
根据 word2vec 和 Elasticsearch 完成个性化查找,它有以下优点:
- 根据word2vec的产品向量还有一个可用之处,便是能够用来完成相似产品的引荐;