Elasticsearch实战 | 必要的时候,还得空间换时间!

1、应用场景

实时数据流通过kafka后,根据业务需求,一部分直接借助kafka-connector入Elasticsearch不同的索引中。 另外一部分,则需要先做聚类、分类处理,将聚合出的分类结果存入ES集群的聚类索引中。如下图所示: 业务系统的分层结构可分为:接入层、数据处理层、数据存储层、接口层。 那么问题来了? 我们需要基于聚合(数据处理层)的结果实现检索和聚合分析操作,如何实现更快的检索和更高效的聚合分析效果呢?

2、方案选型

方案一: 只建立一个索引,aggs_index。 数据处理层的聚合结果存入ES中的指定索引,同时将每个聚合主题相关的数据存入每个document下面的某个field下。如下示意图所示:

方案一示意图 方案二: 新建两个索引:aggs_index以及aggs_detail_index。 其中: 1)aggs_index存储事件列表信息。 2)aggs_detail_index存储事件关联的文章内容信息。 如下图所示:

方案二示意图

3、方案对比

方案一优点:节省存储空间,只存储关联文章id,数据没有重复存储。 方案一缺点:检索、聚合慢,性能不能达标。 方案一后续的所有操作,都需要先遍历检索这一堆IDs,然后再进行检索、聚合分析操作。

操作实例如下(实际比这要复杂): 第一步:通过事件id,获取关联文章id列表; 第二步:基于关联文章id列表,进行检索和聚合操作。

POST  aggs_index/_search
{
  "_source": {
  "includes":[
    "title",
"abstract",
"publish_time",
"author"
    ]},
  "query":{
    "terms":{
      "_id":"["789b4cb872be00a04560d95bf13ec8f42c", 
      "792d9610b03676dc5644c2ff4db372dec4",
"817f5cff3dd0ec3564d45615f940cb7437", 
"....."]
    }
  }
}

步骤2当id数量很多时,会有如下的错误提示:

{
  "error": {
    "root_cause": [
      {
        "type": "too_many_clauses",
        "reason": "too_many_clauses: 
        maxClauseCount is set to 1024"
      },

。。。

方案二优点:分开存储,便于一个索引中进行检索、聚合分析操作。 空间换时间,极大的提升检索效率、聚合速度。 方案二缺点:同样的数据,多存储了一份。 其对应的检索操作如下:

POST  aggs_index/_search
{
  "_source": {
  "includes":[
    "title",
"abstract",
"publish_time",
"author"
    ]},
  "query":{
    "term":{
      "topic_id":"WIAEgRbI0k9s1D2JrXPC"
    }
  }
}

是真的吗? 用事实说话: 以下响应时间的单位为:ms。 方案一要在N个(N接近10)索引,每个索引近千万级别的数据中检索。

两方案对比

两方案响应时间对比效果图

4、小结

  • 由以上图示,对比可知,方案二采取了时间换空间的策略,数据量多存储了一份,但是性能提升了10余倍。
  • 在实战开发中,我们要理性的选择存储方案,在磁盘成本日渐低廉的当下,把性能放在第一位,用户才能用的"爽“!

原文发布于微信公众号 - 铭毅天下(gh_0475cf887cf7)

原文发表时间:2018-03-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

如何使用neo4j存储树形无限级菜单

3906
来自专栏Aloys的开发之路

为什么大多数编程语言中的数组都从0开始

先说说为什么C语言的数组是从0开始:众所周知,C语言的数组是直接操作内存,那我们肯定得从内存的寻址开始说起,以“以行为主序”的分配为例:设数组的基址为LOC(a...

1755
来自专栏架构说

CPU核数和线程 (池)数量的关系(概念理解)

目前手机配置: 支持HUAWEI Mate 8非凡表现的, 是拥有强大性能的华为麒麟950芯片。 此芯片为八核4*Cortex A72 ...

3716
来自专栏Spark学习技巧

初识PB级数据分析利器Prestodb

初始PB级数据分析利器Prestodb 什么是prestodb prestodb整体架构 物理执行计划 什么是prestodb prestodb,是facebo...

2715
来自专栏鸿的学习笔记

数据存储漫谈

数据系统的核心就是两件事,读和写,当数据量还少的时候,读写的性能不会有明显区别,随着数据量的增大,读写变成了一个trade-off,当你拥有优秀的写性能时,读数...

722
来自专栏架构师之路

龙神教你“如何做系统性能优化”

性能优化的目标是什么?不外乎两个: 时间性能:减小系统执行的时间 空间性能:减小系统占用的空间 一、代码优化 做代码优化前,先了解下硬件Cache: (1)C...

2777
来自专栏达摩兵的技术空间

异步IO(一)

在web2.0的时候,其实前端就很熟悉异步编程了,只不过那时大家使用的是ajax(典型的网络请求)实现的,还有一些前端的事件机制(针对事件定义回调事件)。

964
来自专栏数据和云

性能优化:认识B*Tree 索引分裂(二)

黄玮(Fuyuncat) 黄玮(Fuyuncat),资深 Oracle DBA,从事Oracle数据库管理、维护与开发工作十余年,有丰富的大型数据库设计、开发...

2805
来自专栏Albert陈凯

Spark高级面试问题join丢失节点、parquet大小

千万数据的join或者reduce过程中总是有任务节点丢失的情况? 田毅:这个是经常出现的问题,最常见原因还是GC导致的长时间卡住,导致心跳超时。可以参考int...

3144
来自专栏谢慧志的专栏

数据倾斜解决方法总结

在使用Spark、Hive的过程中经常会碰到数据倾斜的问题,本文会持续记录实际工作中碰到的这些问题以及具体解决方案。

2.5K0

扫码关注云+社区