【技术干货】ElasticSearch面试真题——实战集锦
来源:海牛大数据 时间:2021-01-04 13:57:38 编辑:简单
1.你之前公司的ES集群,一个Node一般会分配几个分片?
答:我们遵循官方建议,一个Node最好不要多于三个shards
2. ElasticSearch是如何实现Master选举的?
答:ElasticSearch的选举是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单播模块包含一个主机列表以控制哪些节点需要ping通)这两部分;
对所有可以成为master的节点(node.master: true)根据nodeId字典排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己, 那这个节点就是master。否则重新选举一直到满足上述条件。
3. 你是如何做写入调优的?
答:1)写入前副本数设置为0;
2)写入前关闭refresh_interval设置为-1,禁用刷新机制;
3)写入过程中:采取bulk批量写入;
4) 写入后恢复副本数和刷新间隔;
5) 尽量使用自动生成的id。
4. 如何避免脑裂?
答:可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上,来解决脑裂问题。
5. ElasticSearch对于大数据量(上亿量级)的聚合如何实现?
答:ElasticSearch提供的首个近似聚合是cardinality度量。它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL会先对我们的输入做哈希运算,然后根据哈希运算结果中的bits做概率估算从而得到基数。其特点是:
可配置的精度,用来控制内存的使用(更精确=更多内存),小的数据集精度是非常高的;我们可以通过配置参数来设置去重需要的固定内存使用量,无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关 。
6. ES主分片数量可以在后期更改吗?为什么?
答:不可以,因为根据路由算法shard = hash(document_id) % (num_of_primary_shards),当主分片数量变化时会影响数据被路由到哪个分片上。
7. 如何监控集群状态?
答:Marvel让你可以很简单的通过Kibana监控Elasticsearch。你可以实时查看你的集群健康状态和性能,也可以分析过去的集群、索引和节点指标。
8. ElasticSearch中的副本是什么?
答:一个索引被分解成碎片以便于分发和扩展,副本是分片的副本。一个节点是一个属于一个集群的ElasticSearch的运行实例,一个集群由一个或多个共享相同集群名称的节点组成。
9. ES更新数据的执行流程?
答:(1) 将原来的doc标识为deleted状态,然后新写入一条数据。
(2) buffer每refresh一次,就会产生一个segmentfile,所以默认情况下是1s一个segmentfile,segmentfile会越来越多,此时会定期执行merge。
(3) 每次merge时,会将多个segmentfile合并成一个,同时这里会将标识为deleted的doc给物理删除掉,然后将新的segmentfile写入磁盘,这里会写一个commitpoint,标识所有新的segmentfile,然后打开segmentfile供搜索使用,同时删除旧的segmentfile。
10. shard里面是什么组成的?
答:是多个segment组成的。
11. ElasticSearch中的分析器是什么?
答:在ElasticSearch中索引数据时,数据由为索引定义的Analyzer在内部进行转换。分析器由一个Tokenizer和零个或多个TokenFilter组成。编译器可以在一个或多个CharFilter之前,分析模块允许你在逻辑名称下注册分析器,然后可以在映射定义或某些API中引用它们。ElasticSearch附带了许多可以随时使用的预建分析器。或者,你可以组合内置的字符过滤器,编译器和过滤器来创建自定义分析器。
海牛大数据专注于大数据课程开发及培训,"因为专注,所以专业"。如果您想要了解更多大数据的知识,您可以浏览我们的网站,我们会为您提供更专业服务。