公司尝试使用 Druid 作为时序分析数据库。
我们设计是数据从 Kafka 中获取,然后进入 Druid 中。
在我们发送消息到 Druid 后,使用 Select *, 我们能看到导入的数据。
上面已经能够查询到摄入的数据了。
但是使用 GroupBy 的时候,这条数据没有显示,通常需要等 10 到 20 分钟不等。
GroupBy 的查询却查询不到。
问题
不知道 Druid 是否有一个索引和缓存机制?
如果有这样的话欢迎大家参与讨论下,解决我们的困惑。
针对这个问题,我们也向官方询问了,不幸的是得到的社区反应非常慢而且杂音也非常多。
经过一段时间的搜索和官方文档的检查,发现问题出在一个过滤器上面:
"fields": [
{
"type": "bound",
"dimension": "Error",
"lower": null,
"upper": "0",
"lowerStrict": false,
"upperStrict": false,
"extractionFn": null,
"ordering": {
"type": "numeric"
}
},
数据流程为,我们先发送数据到 Kafka,然后 Druid 从 Kafka 获得数据后在插入到 Druid 中。
在 Kafka 的消息中我们没有为字段 “Error” 设置值。
同时在 Druid 的设置中,我们也没有为字段 “Error” 设置默认值。
在从 Kafka 中获得数据后,Druid 将会为字段 “Error” 设置默认值为 0,但是这个设置的默认值 0 是不能被查询的,需要等候一些时间才能够被查询。
至于为什么不能够被查询,我们现在还不太清楚,但是解决办法如下:
- 在 Kafka 的消息中为字段 “Error” 设置值。
- 在 “Error” 定义的时候,为 “Error” 设置默认值,如果 Kafka 的消息中没有这个字段的话,需要 Druid 自动赋值。
至于方案 2 的解决,现在还不太清楚是如何设,但是上面 2 个方案至少可以提供思路。