前言

QueryId作为Druid区分查询的唯一标识,是我们定位查询问题有效的输入。用户查询有问题时,优先提供QueryId,如果在日志中捞不到的话,我们再根据dataSource名,interval以及查询装态来判断是哪条查询。

Druid Metrics

Druid 服务在运行时会将自身的一些metrics(指标信息)记录到日志文件中,也可以通过HTTP请求发送给其他的消息中间件,例如Apache Kafka。 默认情况下指标信息的记录是关闭的,需要在部署服务的时候手动开启。

在我们的集群中,Druid的指标信息是通过kafka实时落入Druid的一个dataSource中druid_metrics。metrics记录的是全维度信息,通过service维度来区分服务,通过metric来取分指标,且指标对应的的指标值为value。dataSource的schema可以入Druid的时候进行更改。不同服务对应的指标可以在官网查看[Druid Metrics](http://druid.io/docs/latest/operations/metrics.html。需要注意的是,有些指标是需要配置了相应的Monitor之后才可以记录的,具体信息可以在官网查看。

Superset

Superset 是一款由 Airbnb 开源的“现代化的企业级 BI(商业智能) Web 应用程序”,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。

Druid指标信息的可视化展示是通过Druid+Superset来实现的。Druid提供数据查询来源,而Superset则将结果通过报表或者其他的方式展示出来。这样我们可以很轻松地查看和分析Druid的很多指标信息,包括:查询指标,集群状态,服务负载等等。

查询问题分析

现在我们认为用户的唯一输入是queryId,则可以将其作为过滤条件筛选出相应的指标。

确定查询语句

首先,最重要的是我们要获取到用户的查询语句,而查询是请求Broker的,所以据提的查询我们可以在Broker的日志中获取。但是,如果有多个Broker,我们如何确定是哪个Broker?一个一个查可以,也可以通过druid_metrics查看。具体的查询语句如下:

{

"queryType":"topN",

"dataSource":"druid_metrics",

"dimension":"host",

"threshold":10,

"metric":"count",

"intervals":["2019-06-01T14:30:00+08:00/2019-06-06T14:40:00+08:00"],

"granularity":"all",

"filter":{

"type":"and",

"fields":[

{

"type":"selector",

"dimension":"id",

"value":"8c891ec8-fc76-4711-9048-abd0cc2a459c"

},

{

"type":"selector",

"dimension":"service",

"value":"druid/broker"

}

]

},

"aggregations":[

{

"type":"count",

"name":"count"

}]

}

查询结果如下:

[

{

"timestamp": "2019-06-04T07:00:00.015Z",

"result": [

{

"count": 9,

"host": "test-test.com:8082"

}

]

}

]

接着在服务器上对应的broker_request.log日志中搜索即可,cat broker_request.log | grep ${queryId}。

上述步骤可以确定查询语句。当然也可以在superset上完成,更加方便。

image.png

加上对应的过滤条件,直接查询即可。superset是一个很方便好用的可视化工具,对于一些指标信息的展示非常的直观。关于如何使用superset,这里不做赘述。

各个节点查询耗时

当然,有了查询语句我们不一定能够分析出问题所在。因为影响查询的因素有很多,查询语句只是一个方面。为了更加具体地分析问题,我们首先得清楚Druid查询的整条链路。

queryLine

Druid中的数据分为两部分:实时数据和历史数据。历史数据在Druid的historical节点上查询,而实时数据会在middleManager的实时任务(peon进程)中查询。

说完了数据类别,再根据上图来分析Druid查询的链路。首先客户端的查询来到broker,broker首先会去ZK上获取查询的timeline,即对应的数据在什么位置,historical节点上还是middleManager(Peon进程)上。确定之后,broker会把查询成子查询,路由给对应的节点,对应节点处理查询之后,返回结果给broker,broker再把查询结果合并返回给客户端。

那么一次查询涉及到的Druid服务就有:Broker,Historical,middleManager上的peon进程。所以分析时,我们可以根据这入手。

我们先看看在各个节点上查询所耗费的时间和返回的数据量。具体的查询语句如下:

{

"queryType":"groupBy",

"dataSource":"druid_metrics",

"dimensions":["service","host"],

"intervals":["2019-06-01T14:30:00+08:00/2019-06-06T14:40:00+08:00"],

"granularity":"all",

"filter":{

"type":"and",

"fields":[

{

"type":"selector",

"dimension":"id",

"value":"8c891ec8-fc76-4711-9048-abd0cc2a459c"

},

{

"type":"in",

"dimension":"service",

"values":["druid/broker","druid/historical","druid/middlemanager"]

}

]

},

"aggregations":[

{

"type":"longMax",

"name":"cost_time",

"fieldName":"value_max"

}]

}

查询结果如下:

[

{

"version": "v1",

"timestamp": "2019-06-01T06:30:00.000Z",

"event": {

"host": "rantLing1-cool.com:8082",

"service": "druid/broker",

"cost_time": 4285

}

},

{

"version": "v1",

"timestamp": "2019-06-01T06:30:00.000Z",

"event": {

"host": "rantLing2-cool.com:8083",

"service": "druid/historical",

"cost_time": 1081

}

},

{

"version": "v1",

"timestamp": "2019-06-01T06:30:00.000Z",

"event": {

"host": "rantLing3-cool.com.com:8083",

"service": "druid/historical",

"cost_time": 1081

}

}

]

这里我们可以看到查询在每个节点的耗时,如果有耗时很长的情况,我们可以通过zabbix查看当时机器的负载情况,是否是外部因素导致的查询问题。当然还有可能是查询本身的数据量就很大,涉及的segments过多导致的查询问题。

小结:

查询出现了问题,例如超时,在集群正常服务的情况下。我确认问题的流程大致如下:

确认查询语句,返回的queryStatus中是否有明显的报错,例如返回数据量超过阈值等。如果没有继续排查;

确认查询涉及到的数据量是不是过大,设计的segment是不是过多。例如一个interval内有10T的数据,这样涉及的segments数量就有可能过多了,查询耗时可能就比较长。如果没有问题在继续下一步;

查看各个节点耗时,是broker端耗时较长还是其他节点。如果是节点耗时较长可以通过一些机器监控的工具查看当时的机器负载。如果是负载有问题,可能就要跟相关人员确认是什么原因导致了。当然负载过大可能也是因为较大的查询导致的。这个也是要另行分析的。

druid 查条数_Druid.io查询分析相关推荐

  1. 【华为云技术分享】上亿条数据,如何查询分析简单又高效?

    正值618大促,小张遇到了一个棘手的问题,需要在一周内将公司近1年电商部门的营收和线下门店经营数据进行联合分析. 这将产生哪些数据难题呢? 数据孤岛:电商部门的数据存在数仓A.门店经营收入数据存在数仓 ...

  2. vue中如何使用vi-for限制遍历的条数?只查询前三条、查询4-6条怎么实现?

    " 大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂. " 前言 今天整理个简单的功能,vue中的v-for如何限制遍历输出的数据,比如我想在一个存放10条数据的集合中只输出3条 ...

  3. db2怎么限定查询条数_如何查询各国进口关税税率!

    那么问题来了, 如何查询各国进口关税税率 ? 这里主要介绍一些综合性的网站! 1.商务部公共商务信息服务 http://wmsw.mofcom.gov.cn/wmsw/ 这个网站由中国国际电子商务中心 ...

  4. oracle 查询每组条数,Oracle SQL查询:根据时间检索每组的最新值

    这是一个完整的,经过测试的例子. CREATE TABLE tbl1 (ID NUMBER, dt DATE, quantity NUMBER); DELETE FROM tbl1; insert i ...

  5. springboot中使用mybatis只打印sql和总条数不打印查询结果的yml配置

    在application.yml配置文件中设置 logging:level:com.hao.employment.dao: debug 即可

  6. Mybatis拦截器实现限制查询条数

    Mybatis拦截器实现限制查询条数 问题:查询结果过大的sql导致服务慢,系统不稳定? 解决思路:拦截sql,对sql进行修改,添加limit条件,限制查询结果的条数. 实现: 1.使用Mybati ...

  7. 根据条件查询某条记录的条数_「性能与架构」MySQL 8 查询优化新工具 Explain Analyze...

    来源:性能与架构公众号 1. Explain Analyze 介绍 Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索. 但他仅仅是评估,不是实际的执行情况 ...

  8. sql 统计记录条数后 打印出所有记录_用SQL完成购买行为分析(下篇II)

    (接<用SQL完成购买行为分析(下篇I)>内容) 12)查询首条记录为fav,总记录条数为14的记录.将前面getNum(3)红框处替换为12,运行getNum(14)得到第2条记录的数量 ...

  9. DBA用于查询当前数据库表格记录条数的脚本

    本文中介绍的参考脚本用于查询当前数据库中所有表格的记录条数, 并将结果存入TableInfo表中,不会删除以备用户再做处理与分析.最后请各位读者删除此表. 脚本示例: if exists (selec ...

最新文章

  1. 【Go】Go基础(九):接口(Interfaces)与反射(reflection)
  2. echarts画布_vue中动态设置echarts画布大小
  3. loadrunner脚本练习
  4. SAP ABAP SE16 and SE17
  5. Windows 2008 R2安装DHCP服务器问题及解决方法
  6. python note 29 线程创建
  7. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1
  8. 震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!
  9. cnn文本分类python实现_CNN文本分类
  10. Redis和Memcached的区别详解
  11. 2012年蓝桥杯【初赛试题】 转方阵
  12. [erlang] mnesia
  13. Relay log read failure解决办法
  14. JavaScript 获取当前URL信息
  15. cpu空载50度_单线程性能提升超50%!Arm新款服务器CPU要靠单核打天下?
  16. A Structure from Motion System
  17. Android Reboot 命令执行过程
  18. Adobe Photoshop CC 2018之ps磁性套索工具抠图(☆)
  19. 老照片怎么修复?模糊照片如何变清晰?试试这些方法
  20. USB设备运行不正常,windows无法识别的问题

热门文章

  1. QT人机交互(动态界面)
  2. python数学建模游戏应用_数学建模在游戏数值策划工作中有哪些应用
  3. python求线段长度_如何用python求线段长度
  4. 设定所有版本的谷歌浏览器支持flash
  5. 信息学奥赛一本通:1125:矩阵乘法
  6. 感人小说 - 再见了,可鲁
  7. 屏的像素与传输速率_HDMI传输速率是多少呢?
  8. 【java面试经(架构师设计师)-第9课】网络编程校验方法和加密算法
  9. PROFINET 概念
  10. 考研 | 一战南大软院险进复试后失利被刷,调剂国科大杭高院荣幸上岸