如何计算一天中从Kafka主题获取的邮件数量?

时间:2019-07-16 11:38:29

标签: apache-spark apache-kafka parquet spark-structured-streaming delta-lake

我正在从Kafka主题中获取数据,并将其以Deltalake(parquet)格式存储。 我希望找到特定日期获取的邮件数量

我的思考过程:我想在特定的一天中读取使用Spark以Parquet格式存储数据的目录,并对带有“ .parquet”的文件进行计数。这将返回一个计数,但是我不确定这是否正确。

这样正确吗?是否有其他方法可以计算从Kafka主题获取的特定天(或持续时间)的邮件数量?

4 个答案:

答案 0 :(得分:0)

您可以通过使用内部Kafka主题__consumer_offsets中的数据来计算已处理消息的数量。本主题包含集群中每个consumer_group / topic / partition组合的承诺偏移量的时间序列,格式如下:

[<consumer_group>,<topic>,<partition>]::[OffsetMetadata[<numeric_offset>,NO_METADATA],CommitTime <commit_unix_timestamp>,ExpirationTime <expire_unix_timestamp>]

通过汇总所有分区上给定间隔中的结束偏移量和开始偏移量之间的差异,您可以得出特定主题从特定主题处理(提交)的邮件数量。但是请注意,Kafka会根据ExpirationTime属性定期清理__consumer_offsets

根据您的Kafka版本,检查this excellent SO post来阅读__consumer_offsets的方式。

答案 1 :(得分:0)

对于每个KafkaConsumer组(属性group.id),Kafka将当前偏移量存储在内部主题__consumer_offsets中。如果您每24小时读出一次此主题,例如使用cron作业和kafka控制台使用者,您将能够查看单个应用程序从某个Kafka主题获取了多少条消息。

获得适当计数的其他方法是仅使用日志记录机制。

编辑:再次阅读您的问题,我意识到您正在寻找过去几天的信息。在这种情况下,我的回答将无济于事。不幸的是,我不允许添加评论。但很高兴立即删除与问题无关的答案。

答案 2 :(得分:0)

我们从主题中消费的消息不仅具有键值,还具有其他信息,例如时间戳

可用于跟踪消费者流量。

时间戳 经纪人或生产者根据主题配置更新时间戳。如果Topic配置的时间戳类型为CREATE_TIME,则代理将使用生产者记录中的时间戳,而如果Topic配置为LOG_APPEND_TIME,则代理在添加记录时将使用代理本地时间覆盖时间戳。

  1. 因此,如果将时间戳记存储在任何地方,则可以很好地跟踪每天或每小时的消息速率。

  2. 以其他方式可以使用一些Kafka仪表板,例如Confluent Control Center(许可证价格)或Grafana(免费)或任何其他工具来跟踪消息流。

  3. 在我们的示例中,在使用消息以及存储或处理消息的同时,我们还将消息的元详细信息路由到Elastic Search,我们可以通过Kibana对其进行可视化。

答案 3 :(得分:0)

另一种检索此信息而不计算两个版本之间的行的方法是使用 Delta table history。这样做有几个优点 - 您无需阅读整个数据集,您也可以考虑更新和删除,例如,如果您正在执行 MERGE 操作(无法比较 .count不同的版本,因为更新是替换实际值,或者删除行)

例如,对于仅追加,以下代码将计算由普通 append 操作写入的所有插入行(对于其他操作,例如 MERGE/UPDATE/DELETE,我们可能需要查看其他 metrics ):

from delta.tables import *

df = DeltaTable.forName(spark, "ml_versioning.airbnb").history()\
  .filter("timestamp > 'begin_of_day' and timestamp < 'end_of_day'")\
  .selectExpr("cast(nvl(element_at(operationMetrics, 'numOutputRows'), '0') as long) as rows")\
  .groupBy().sum()