【问题标题】:So slow Apache Druid Query这么慢的 Apache Druid 查询
【发布时间】:2022-05-05 00:01:34
【问题描述】:

目前我正在使用 Apache Druid Warehouse 存储近 3 亿行,大小为 44GB。我们正在开发一个使用 Gunicorn 和 Celery 在 Druid 中开发 SQL 查询的 Flask API。它存在一个 React 应用程序,它生成对 Flask API 的多个请求,然后在正确的 SQL 查询中向 Druid 请求数据。我们的问题是德鲁伊响应持续了很长时间。即当我们向德鲁伊发送接近 50 个请求时,可能需要接近 1.3 分钟才能返回最后一个响应。我们在前端和 API 优化方面做了很多工作,但是,我们怀疑问题出在 Druid 数据源中。

我们的 Druid 数据源具有以下功能:

  1. 总数据大小 44.01 GB
  2. 段大小(行)最小:1,平均:0.151M,最大:0.637M
  3. 段粒度:天
  4. 总行数:295.465.723
  5. 平均行数:148
  6. 复制大小:44.01 GB
  7. 压缩:未启用。

    然后我们对数据源运行查询,我们发现行数最多的段有 636688 行,字节大小为 80859007。

    我认为我们需要在我们的数据源中进行压缩操作,目的是增加每个段的行数,这是根据 Druid 文档中关于段的建议。在再次摄取我们的数据源之前,我想知道段的压缩是否会提高查询性能?或者我们需要对这个问题采取另一种方法。

    非常感谢

    标签: druid


    【解决方案1】:

    尝试通过 API 查询您的数据源,以检查您的单个查询返回的速度。

    curl -X POST 'http://your-druid-server:8082/druid/v2/?pretty' -H 'Content-Type:application/json' -H 'Accept:application/json' -d @/home/your-directory/your_query.json

    您可以首先考虑优化慢查询,例如使用相关的时间间隔或其他调整。如果它仍然很慢(几分钟的查询),您可能可以尝试压缩,但不能保证改善您的查询。

    【讨论】:

      【解决方案2】:

      平均而言,这些是许多非常小的细分市场。读取每个段都有一些开销,因此它可能有助于进行一些压缩并尝试实现约 500 万行的段。历史记录中的每个线程将一次读取一个段,如果这些段中的每一个都包含大量数据(~500-700 MB),效率会更高。

      文档的这一部分讨论了segment size optimization 的重要性。

      还有一些关于查询和并发优化的其他想法:

      • 您的查询是否指定了时间间隔过滤器?

      • 查询试图做什么?

      • 是否启用汇总?什么是查询粒度?

      • 最终用户需要什么时间粒度?

      • 你有多少历史?这将影响查询执行的并行性。

      • Historicals configured 怎么样?特别是我很好奇:

      a.druid.processing.numThreads

      b.druid.server.http.numThreads

      这些默认情况下是根据可用的 CPU 设置的,因此确定每个历史执行的并行度和线程处理通信请求的可用性。

      一旦我们更多地了解用例和集群进程可用的资源,我们就可以更好地帮助您优化工作负载。

      【讨论】:

        猜你喜欢
        • 2019-01-31
        • 2020-11-29
        • 2011-03-11
        • 2020-03-19
        • 2014-03-12
        • 2011-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多