如何将 Spark SQL 批处理作业结果写入 Apache Druid?
Posted
技术标签:
【中文标题】如何将 Spark SQL 批处理作业结果写入 Apache Druid?【英文标题】:How to write Spark SQL batch job results to the Apache Druid? 【发布时间】:2019-11-11 08:34:35 【问题描述】:我想将 Spark 批处理结果数据写入 Apache Druid。我知道 Druid 有 本地批量摄取,例如 index_parallel
。 Druid 在同一个集群中运行 Map-Reduce 作业。但我只想用 Druid 作为数据存储。我想在 Spark 集群外部聚合数据,然后发送到 Druid 集群。
Druid 有Tranquility
用于实时摄取。我可以使用 Tranquility 发送批处理数据,但这效率不高。如何有效地将批处理结果发送给 Druid?
【问题讨论】:
你可以配置 druid 来监听 kafka 主题。 Spark 为您提供了一个连接器来写入 kafka。另一种方式..您可以将您的火花作业的输出写入镶木地板或 json 文件。 Druid 可以进行本地摄取(您需要将文件复制到其中一个 druid 节点),或者您可以使用 HDFS 进行批量摄取 Kafka 选项不好。因为,事件时间通常比 windowPartition 早。另一个选择似乎不错。我可以将结果以 parquet 格式写入 Druid 的 HDFS,然后创建一个 hdfs 索引以将 parquet 转换为段。这似乎是一个不错的结果,因为数据已经聚合,只需将其转换为细分。这似乎会比其他选项消耗更少的资源。对吗? HDFS 方式是最快最有效的方式。您只需将镶木地板放入 hdfs 并将位置提供给德鲁伊。顺便说一句,这种摄取方式替换了 druid 中的现有段,因此请确保您摄取完整数据,而不仅仅是增量行。另一方面,卡夫卡——只摄取增量行效果很好;顺便说一句,你的回复不明白window partition
——详细说明。
哦,对不起。我试着说window period
。在实时摄取中,德鲁伊需要一个窗口期。如果接收到的事件的任何时间超出指定的窗口,则忽略此事件。结果,批量分析的结果总是超出窗口期(我假设窗口期为10分钟,不能太大,这样就足够了)。
【参考方案1】:
您可以写入 Kafka 主题并运行 Kafka Indexing Job 来对其进行索引。
我们一直在使用这种机制来索引数据,但没有 windowPeriod 的这种限制。它需要更旧的时间戳。但是如果一个分片已经完成,这最终会在同一段中创建新的分片。
例如如果我使用日大小段,我将获得该段中的分片 段-11-11-2019-1 100MB segment-11-11-2019-2 10MB(用于 11 月 12 日收到的数据,事件时间为 11 月 11 日)。
通过压缩,这两个分片将在启用自动压缩的情况下合并。
https://druid.apache.org/docs/latest/development/extensions-core/kafka-ingestion.html
https://druid.apache.org/docs/latest/tutorials/tutorial-compaction.html
或者只是您可以在 HDFS 中累积结果,然后通过 cron 作业使用 Hadoop Batch 摄取。自动压缩也适用于此选项。
【讨论】:
以上是关于如何将 Spark SQL 批处理作业结果写入 Apache Druid?的主要内容,如果未能解决你的问题,请参考以下文章
Hive:Spark中如何实现将rdd结果插入到hive1.3.1表中