这些年背过的面试题 —— ES篇

Elasticsearch可以实现秒级的搜索,cluster是一种分布式的部署,极易扩展(scale )这样很容易使它处理PB级的数据库容量。最重要的是Elasticsearch使它搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果(relevance)  

一、概述

1、特点

  1. 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群;

  2. JSON:输入/输出格式为 JSON,意味着不需要定义 Schema,快捷方便;

  3. RESTful:基本所有操作 ( 索引、查询、甚至是配置 ) 都可以通过 HTTP 接口进行;

  4. 分布式:节点对外表现对等(每个节点都可以用来做入口) 加入节点自动负载均衡;

  5. 多租户:可根据不同的用途分索引,可以同时操作多个索引;

  6. 支持超大数据:可以扩展到 PB 级的结构化和非结构化数据 海量数据的近实时处理;

2、功能

  • 分布式的搜索引擎

    分布式:Elasticsearch自动将海量数据分散到多台服务器上去存储和检索。

  • 全文检索

    提供模糊搜索等自动度很高的查询方式,并进行相关性排名,高亮等功能。

  • 数据分析引擎(分组聚合)

    社区网站,最近一周用户登录、最近一个月各功能使用情况。

  • 对海量数据进行近实时(秒级)的处理

    海量数据的处理:因为是分布式架构,可以采用大量的服务器去存储和检索数据。

3、场景 

  • 搜索类场景

    比如说人员检索、设备检索、App内的搜索、订单搜索。

  • 日志分析类场景

    经典的ELK组合(Elasticsearch/Logstash/Kibana),实现日志收集,日志存储,日志分析。

  • 数据预警平台及数据分析场景

    例如社区团购提示,当优惠的价格低于某个值时,自动触发通知消息,通知用户购买。

    分析竞争对手商品销量Top10,供运营分析等等。

  • 商业BI(Business Intelligence)系统

    比如社区周边,需要分析某一地区用户消费金额及商品类别,输出相应的报表数据,并预测该地区的热卖商品,通过区域和人群特征划分进行定向推荐。Elasticsearch执行数据分析和挖掘,Kibana做数据可视化。

 4、竞品分析

Lucene

Java编写的信息搜索工具包(Jar包),Lucene只是一个框架,熟练运用Lucene非常复杂。

Solr

基于Lucene的HTTP接口查询服务器,是一个封装了很多Lucene细节搜索引擎系统。

Elasticsearch

基于Lucene分布式海量数据近实时搜索引擎。采用的策略是将每一个字段都编入索引,使其可以被搜索。

5、对比

Solr利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。

Solr比Elasticsearch实现更加全面,而Elasticsearch本身更注重于核心功能, 高级功能多由第三方插件提供。

Solr在传统的搜索应用中表现好于Elasticsearch,而Elasticsearch在实时搜索应用方面比Solr表现好。

目前主流依然是Elasticsearch7.x 最新的是7.8。

优化:默认集成JDK、升级Lucene8大幅提升TopK性能、引入熔断机制避免OOM发生。

二、基本概念

 1、IK分词器

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

IK分词器3.0的特性如下:

(1)采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。

(2)采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。

(3)支持个人词条的优化的词典存储,更小的内存占用。

(4)针对Lucene全文检索优化的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索

(5)排列组合,能极大得提高Lucene检索的命中率。

  1. 扩展词典:ext_dict

  •  停用词典:stop_dict

  •  同义词典:same_dict

2、索引(类数据库)

settings:设置索引库,定义索引库的分片数副本数等

3、映射(类表设计)

  • 字段的数据类型

  • 分词器类型

  • 是否要进行存储或者创造索引

4、文档(数据)

  • 全量更新用Put

  • 局部更新用Post

三、高级特性

 1、映射高级

地理坐标点数据类型

地理坐标点是指地球表面可以用经纬度描述的一个点。地理坐标点可以用来计算两个坐标间的距离,还可以判断一个坐标是否在一个区域中。地理坐标点需要显式声明对应字段类型为 geo_point

动态映射

使用dynamic mapping 来确定字段的数据类型并自动把新的字段添加到类型映射

2、DSL高级

(1)查询所有(match_all query)

(2)全文搜索(full-text query)

  • 匹配搜索(match query)

    短语搜索(match phrase query)

  • 默认查询(query string)

  • 多字段匹配搜索(multi match query)

(3)词条级搜索(term-level query)​​​​​​​

       精确搜索term

  • 集合搜索idx

  • 范围搜索range

  • 前缀搜索prefix

  • 通配符搜索wildcard

  • 正则搜索regexp

  • 模糊搜索fuzzy

(4)复合搜索

(5)排序sort&分页size&高亮highLight&批量bluk

 3、聚合分析

聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值、最小值,计算和、平均值等。

对一个数据集求最大、最小、和、平均值等指标的聚合,在ES中称为指标聚合 metric;

对查询出的数据进行分桶group by,再在上进行指标桶聚合 bucketing

 4、智能搜索

  • Term Suggester

  • Phrase Suggester

  • Completion Suggester

  • Context Suggester

如果Completion Suggester已经到了零匹配,可以猜测用户有输入错误,这时候可以尝试一下Phrase Suggester。如果还是未匹配则尝试Term Suggester

精准程度上(Precision)看:Completion > Phrase > Term, 而召回率上(Recall)则反之。

从性能上看,Completion Suggester是最快的,如果能满足业务需求,只用Completion Suggester做前缀匹配是最理想的。Phrase和Term由于是做倒排索引的搜索,相比较而言性能应该要低不少,应尽量控制Suggester用到的索引的数据量,最理想的状况是经过一定时间预热后,索引可以全量map到内存。

四、实战

1、写优化

 (1)副本数量0

       首次初始化数据时,将副本设置为0,写入完毕再改回,避免了副本建立索引的过程;

(2)自动生成id

      可以避免写前判断是否存在的过程;

(3)合理使用分词器

      binary类型不适用,title和text使用不同的分词器加快速度;

(4)禁用评分,延长索引刷新间隔

(5)将多个索引操作放入到batch进行处理

2、读优化

 使用Filter代替Query,减少打分缓解,使用bool组合query和filter查询;

对数据进行分组,按照日,月,年不同维度分组,查询可集中在局部index中;

3、零停机索引重建方案

(1)外部数据导入

       通过MQ的web控制台或cli命令行,发送指定的MQ消息;

  • MQ消息被微服务模块的消费者消费,触发ES数据重新导入功能;

  • 微服务模块从数据库里查询数据的总数及分页信息,并发送至MQ;

  • 微服务从MQ中根据分页信息从数据库获取到数据后,根据索引结构的定义,将数据组装成ES支持的JSON格式,并通过bulk命令将数据发送给Elasticsearch集群进行索引的重建工作。

(2)基于Scroll+bulk+索引别名的方案

  • 新建索引book_new,将mapping信息,settings信息等按新的要求全部定义好;

  • 使用scroll api将数据批量查询出来,指定scroll查询持续时间;

  • 采用bulk api将scoll查出来的一批数据,批量写入新索引;

  • 查询一批导入一批,注意每次都使用上次结束时的scoll_id;

  • 切换别名book_alias到新的索引book_new上面,此时Java客户端仍然使用别名访问,也不需要修;

  • 改任何代码,不需要停机。验证别名查询的是否为新索引的数据。

(3)Reindex API方案

       Elasticsearch v6.3.1已经支持Reindex API,它对scroll、bulk做了一层封装,能够 对文档重建索引而不需要任何插件或外部工具。

(4)参与度 & 灵活性:自研 > scroll+bulk > reindex

(5)稳定性 & 可靠性:自研 < scroll+bulk < reindex

4、DeepPaging性能解决方案

比如超级管理员,要给某个省份用户发送公告或者广告,最容易想到的就是利用 from + size 来实现,但这是不现实的。 

分页方式性能优点缺点场景
from + size灵活性好,实现简单深度分页问题数据量比较小,能容忍深度分页问题
scroll解决了深度分页问题无法反应数据的实时性(快照版本)维护成本高,需要维护一个scroll_id海量数据的导出,需要查询海量结果集的数据
search_after性能最好,不存在深度分页问题,能够反映数据的实时变更实现连续分页比较复杂,因为每次查询都需要上一次查询的结果海量数据的分页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,下面是对大数据面试题——spark面试题(一)的回答: 1. 什么是Spark?它与Hadoop有什么区别? Spark是一个快速、通用、可扩展的大数据处理引擎,它可以在内存中进行数据处理,因此比Hadoop更快。与Hadoop相比,Spark的优点在于它可以在内存中进行数据处理,因此速度更快,而且它支持更多的数据处理方式,例如流处理、图形处理等。 2. Spark的核心组件有哪些? Spark的核心组件包括Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX。 3. 什么是RDD?它有哪些特点? RDD是Spark中的一个基本概念,它代表一个不可变的分布式数据集合。RDD具有以下特点: - 可以在内存中进行计算,因此速度快; - 支持多种操作,例如map、reduce、filter等; - 可以进行持久化,以便在后续计算中重复使用。 4. Spark中的map和flatMap有什么区别? map和flatMap都是RDD中的转换操作,它们的区别在于: - map操作对每个元素进行转换,返回一个新的元素; - flatMap操作对每个元素进行转换,返回一个包含多个元素的序列。 5. 什么是Spark的shuffle操作? Spark的shuffle操作是指将数据重新分区的操作,它通常发生在reduce操作之前。Shuffle操作会将数据从多个节点上收集到一个节点上,然后重新分区,以便进行后续的计算。 6. Spark中的cache和persist有什么区别? cache和persist都是将RDD持久化到内存中,以便在后续计算中重复使用。它们的区别在于: - cache操作默认将数据持久化到内存中,而persist操作可以指定将数据持久化到内存、磁盘或者其他存储介质中; - cache操作是persist操作的一种简化形式,它默认将数据持久化到内存中,并且只能持久化到内存中。 7. Spark中的reduceByKey和groupByKey有什么区别? reduceByKey和groupByKey都是对键值对RDD进行操作的函数,它们的区别在于: - reduceByKey操作会在每个分区内先进行本地聚合,然后再进行全局聚合,因此效率更高; - groupByKey操作会将所有的键值对都进行网络传输,然后在一个节点上进行聚合,因此效率较低。 8. Spark中的broadcast变量有什么作用? broadcast变量是一种只读的变量,它可以在所有节点上共享,以便在计算过程中使用。使用broadcast变量可以避免在网络上传输大量的数据,从而提高计算效率。 9. 什么是Spark的checkpoint操作? Spark的checkpoint操作是将RDD持久化到磁盘上,以便在后续计算中重复使用。与cache和persist不同的是,checkpoint操作会将数据持久化到磁盘上,以便在内存不足时可以从磁盘上恢复数据。 10. Spark中的Task是什么? Task是Spark中的一个基本概念,它代表一个可以在一个节点上执行的计算任务。Spark将一个RDD分成多个分区,每个分区对应一个Task,这些Task可以并行执行,以提高计算效率。 ### 回答2: 今天我们来讨论一下关于Spark大数据面试的一些常见问题。Spark是一种基于Hadoop的开源计算系统,它能够快速处理大规模数据,并且支持多种编程语言,包括Java、Scala和Python等。以下是一些Spark面试题及其答案: 1. Spark有哪几种部署模式? Spark有三种部署模式,分别是本地模式、集群模式和分布式模式。本地模式指的是在本地运行Spark应用程序,不需要连接到外部计算机。集群模式指的是单个Spark集群环境,它由一组Spark节点组成,可以在数据中心或云中运行。分布式模式指的是使用多个Spark集群并行处理大规模数据。 2. Spark和Hadoop的区别是什么? Spark和Hadoop都是处理大规模数据的工具,但它们有一些区别。首先,Spark处理数据速度快,因为它将数据存储在内存中,而Hadoop则将数据存储在磁盘中。其次,Spark支持更多的编程语言,包括Java、Scala和Python等,而Hadoop只支持Java。此外,Spark具有更好的机器学习和图形处理功能,可以更好地支持大规模数据分析。 3. Spark的RDD是什么? RDD是Spark中重要的概念,全称为Resilient Distributed Dataset。它是一个不可变的分布式数据集合,可以分区存储在不同节点上,并且每个分区都可以在并行处理中进行处理。RDD支持两种操作,即转化操作和行动操作。转化操作将一个RDD转换为另一个RDD,而行动操作返回一个结果或将结果输出至外部系统。 4. Spark的优化技术有哪些? Spark优化技术包括数据本地化、共享变量、宽依赖和窄依赖、缓存和持久化,以及数据分区等技术。数据本地化将数据存储在尽可能接近计算节点的位置,以减少网络传输的开销。共享变量将常用的变量通过广播或累加器的方式在节点中共享,从而减少网络传输量。宽依赖和窄依赖指的是在转化操作中RDD之间的依赖关系,窄依赖表示每个父分区最多与一个子分区有关联,而宽依赖则表示多个子分区可能与多个父分区关联。缓存和持久化技术可将RDD保存在内存中,从而加速访问速度。数据分区可以将数据划分为较小的块进行并行处理。 5. Spark Streaming是什么? Spark Streaming是Spark的一个扩展模块,它支持实时数据流处理。Spark Streaming可以将实时数据流以微批次方式处理,每个批次的数据处理平均耗时只有几秒钟。Spark Streaming可以将数据存储在内存或磁盘中,同时支持多种数据源和数据输出方式。 以上是关于Spark大数据面试题的一些回答,希望能够对大家有所帮助。如果你想深入学习Spark和大数据处理技术,可以考虑参加相关的培训课程或在线课程。 ### 回答3: Spark是一个分布式计算框架,它可以使大规模数据处理更加高效和便捷。因此,在企业招聘大数据领域的人才时,对Spark的技术能力要求越来越高。以下是Spark面试题的回答: 1. Spark有哪些组件? Spark框架由三个核心组件组成:Spark Core、Spark SQL和Spark Streaming。此外,还有Spark MLlib、Spark GraphX、Spark R等个别不同的子组件。 2. 什么是RDD?与Dataframe有什么区别? RDD(弹性分布式数据集)是Spark的核心数据抽象,是不可变的分布式对象集合。RDD可以从文件中读取数据、从内存中读取数据、并行修改数据等。而Dataframe和RDD类似,但是Dataframe更加强大,因为它是带有结构化的RDD。Dataframe在处理大规模结构化数据时非常有效和便捷。 3. Spark如何处理缺失数据? Spark提供了两种处理缺失数据的方法:第一种是使用DataFrame API中的na函数,可以删除或替换缺失值;第二种是使用MLlib中的Imputer类,可以将缺失值替换为均值或中位数。 4. 什么是Spark的任务(task)? 一个任务是Spark作业中的最小执行单位。Spark集群上的作业被划分为多个任务,这些任务可以并行执行。 5. Spark的shuffle操作是什么?它为什么是昂贵的? Spark的shuffle操作是将一组数据重新分配到不同计算节点上的操作。Shuffle操作可能会导致大量数据的磁盘写入、网络传输和数据重组,这些都是非常昂贵的操作。因此,它在Spark集群中是一个相当昂贵的操作。 6. Spark中的Partition有什么作用? Partition是Spark中的数据划分单位。它可以将数据分成多个块并对每个块进行处理。Partition 可以提高 Spark 的并行度和运行效率,因为它可以将大规模数据分成多个小块,并在集群的多个计算节点上并行处理数据。 总而言之,Spark是大数据领域中使用最广泛的计算引擎之一,其技术理念和应用场景非常广泛。对于求职者而言,掌握 Spark 的基本概念和技术特点,提高对 Spark 的理解和应用能力,将有助于更好地处理和分析大规模数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值