为什么在Apache Druid中的实时数据使用Kafka索引 ? -Kartik Khare


将数据存储在实时数据流中一直是一个挑战。解决方案取决于您的用例具体情况。如果要存储数据以进行每日或每月分析,则可以使用分布式文件系统并在其上运行HivePresto;如果要运行一些简单的实时分析,则可以将最新数据存储在Elasticsearch中,并为图表运行Kibana
Apache Druid可以同时解决上述两个用例。它可以用作每日或每月分析的持久数据存储。它也可以用作快速可查询的数据存储,使您可以实时推送和检索数据。

但是,早期版本的Apache druid的问题是从数据库中的流中提取数据。让我们看一下开发人员之前面临的挑战。

Tranquility
Tranquility是Apache Druid提供的用于摄取实时数据的软件包。Tranquility并不完全等同于JDBC或Cassandra驱动程序。它为您处理分区,复制,服务发现和架构过渡。用户只需要关心他需要使用的数据和数据源。

虽然它解决了用户可能面临的许多问题。但是,它捆绑了自己的一系列挑战。
1. 不完全一次
Tranquility在某些情况下可以创建重复的记录。它不提供任何准确的保证。在某些情况下,例如POST请求数据超时或未收到确认,Tranquility可能会产生重复的记录。
这种情况使用户有责任对数据进行重复数据删除。如果使用一个,它甚至可能导致Apache superset 超集中的图形不正确

2.数据丢失
最令人担忧的问题是数据丢失。在各种情况下,“Tranquility”有意或由于错误而无法插入数据。官方文档中列出的某些情况是:

  • 时间戳超出您配置的windowPeriod的事件将被删除。
  • 如果您遭受的Druid中级管理器故障比配置的副本数更多,则可能会丢失部分索引的数据。
  • 如果存在持续的问题,无法与Druid索引服务进行通信,并且在此期间内重试策略已用尽,或者该期间的持续时间长于windowPeriod,则某些事件将被丢弃。
  • 如果存在阻止“Tranquility”从索引服务接收到确认的问题,它将重试该批处理,这可能导致重复的事件。

最糟糕的是,在大多数情况下,您甚至都不知道在查询之前数据已被删除。

3.错误处理
由于Tranquility守护程序在JVM中运行,因此应用程序负责处理超时等错误。对于诸如Apache Flink之类的应用程序,如果不能有效地管理这些错误之一,则可能导致不必要的重启。
Tranquility是为druid 0.9.2.构建,使用0.16.0以上版本会导致无法定位问题。

卡夫卡索引器
为了解决上述所有问题,Apache druid在0.9.1版中添加了Kafka Indexer。索引器一直处于实验状态,直到版本0.14。
Kafka Indexing Service首先根据您指定的配置启动管理员。主管然后定期启动新的索引编制任务,这些任务负责使用来自Kafka的数据并将其发布到Druid中。
Kafka索引任务可以长期运行。最小编号之后可以发布多个细分。

1.一次精确语义
Kafka索引器为用户提供一次准确的保证。由于默认的Kafka使用者(因为Kafka 0.11.x提供了对此语义的开箱即用的支持),因此可以保证这一点。

2.发布延迟数据
Kafka索引器旨在发布延迟的数据。该功能使用户可以自由地将数据从Kafka中的特定偏移回填到Druid。

3.架构更新
尽管“Tranquility”还支持架构更新,但在Kafka Indexer中更容易做到。您只需要提交一个包含新模式的POST请求,supervisor 将使用更新后的模式生成新任务。您不需要在生产者端进行任何更改。如果您添加新列,则较旧的行将在这些列中显示空值,但这些行仍可查询。

Kafka Indexer服务解决了开发人员在使用Tranquility时遇到的许多问题。如果要开始使用Kafka Indexing服务,可以在官方Druid文档中参考Apache Kafka Ingestion