ES

索引是怎么建立的?

我们是用索引模板创建的索引,每天或者每小时(看分索引的力度,一般是一天)当第一条数据插入时,会根据索引模板生成索引的mapping。如果没有设置索引模板也是可以插入数据,但是字段的类型是自动推断出来的,不是我们想要的结果。
也可以写定时脚本,每天自动生成后一天的索引mapping。

为什么要每天创建一个索引?

  1. 就像hive的分区表一样,查询数据时避免扫描全部的信息,提高查询效率。
  2. 增加es数据变化的灵活性。比如第二天需要增加字段,那么之前的mapping就不能用了。

分片数和副本数怎么设置的?

副本数设置为2,设置多了会占用很大的空间。
经验公式:每个节点的分片数量保持在低于每1GB堆内存对应集群的分片在20-25之间。分片大小为50GB通常被界定为适用于各种用例的限制。

别名的用法?

  1. 对于某一个业务设置了每天一个索引,可以给这些索引都加上一个统一的别名。可以合并查询。
  2. 在代码中设置用别名查询,如果需要更换业务。只需把新业务设置成代码中的别名,同时把就业务的别名删除。这样就无缝切换,不需要该代码重新部署。
  3. 可以用过滤查询,给查询出来的数据集设置别名,生成一个子集视图。比如过滤查询出电影类型为科幻的类型,给这些数据加别名。以后查询科幻类的电影只需要使用这个别名查询即可。

ES的堆内存怎么设置?

  1. 官方不建议设置超过32G(超过的话GC影响大)
  2. 建议:宿主机内存大小的一半和31GB,取最小值。(剩下一般的内存留给Lucene做缓存数据结构)
    ============== 分割线 ==============

数仓的架构

现在数仓分为三种架构lambda,kappa,OLAP变体

lambda架构

早期的数仓,现在大部分公司都在用吧。就是离线一套,实时一套。需要开发和维护两套代码,成本高。并且两套代码就要占用两份资源,对资源的要求高。

kappa架构

没有离线的部分,用flink或者sparkStreaming实时的ETL,双流join或者和维表join生成小宽表,输出到Hbase,redis,ES,nysql等数据库。
缺点:业务变更时,需要重新编写代码。并且保证消息队列中的消息存放一定的时间。新启动一个任务,从某个历史时间消费消息队列中的数据,直到新任务消费消息的偏移量和旧任务消费齐平的时候。就可以停掉旧任务。旧任务产生的结果表就可以删除。

实时OLAP变体

在kappa架构的基础上,用流处理只是ETL和轻度的聚合,输出到Hbase、hive或者ES,然后用OLAP分析引擎分析(减轻流式处理中聚合的操作),来应对各种分析。
【大数据面试】瞎说宝典
============== 分割线 ==============

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

相关文章: