在推送所有数据后批量使用Kafka

时间:2017-08-29 12:19:19

标签: pyspark apache-kafka kafka-consumer-api kafka-producer-api

我是Kafka的新手,我想做以下事情:

  • 我有一堆服务器每隔10分钟就会向Kafka推送一些数据。
  • 我有一个spark应用程序,需要所有服务器推送的最新数据。

例如:我有两台服务器分别推送'a''b'。我需要spark应用程序在数据框中接收值'a''b',以便可以一起处理它们。 10分钟后,2台服务器推送'c''d'。 spark应用程序应同时收到值'c''d',等等。

我的spark应用程序需要推送所有最新数据,因此我认为流式处理方法不正确,可能采用批处理方法(或者可能采用不同方式)。

我的Spark应用需要DataFrame

2 个答案:

答案 0 :(得分:0)

您的问题听起来不像通常的Kafka用例。但是,如果必须使用Kafka,您可以使用Kafka主题对数据进行分组。通过创建主题A_BC_D,您可以确保价值观和价值。和' b'将被一起消费并与' c'并且' d'值。然后,您的Spark应用必须验证它是否从A_BC_D获得了所有需要的数据并继续执行。 如果您的Spark应用程序能够缓冲所有数据并确定何时消耗了所有需要的消息,则此设计将起作用。

答案 1 :(得分:0)

首次加载应用时,需要保存Kafka主题的当前偏移量。然后,每隔10分钟从Kafka加载数据并执行逻辑。所以你基本上可以运行以下例程:

  • 存储当前偏移
  • 等待10分钟
  • 初始化DataFrame并从Kafka加载数据(在您的情况下,它首次加载' a'' b')
  • 执行您的逻辑

加载DataFrame时,您可以指定偏移量,从而确保获得过去10分钟内收到的数据。

例如,您可以执行以下操作来初始化DataFrame:

df = spark.read.format("kafka") \
     .option("kafka.bootstrap.servers", "host1:port1,host2:port2") \
     .option("subscribe", "your_topic") \
     .option("startingOffsets", """{"your_topic":{"0":saved_offset}}""") \
     .option("endingOffsets", """{"your_topic":{"0":-1}}""") \
     .load()

或者,如果您想使用流媒体应用程序,这个想法几乎是一样的。但是,在这种情况下,您从当前Kafka位置开始(或者将起始偏移量存储一次并从中开始),然后运行的每个其他查询将继续前一个查询中断的位置。因此,在这种情况下,首先启动DataFrame,然后运行以下例程:

  • 等待10分钟
  • 查询DataFrame并执行逻辑

在这种情况下初始化DataFrame将如下:

df = spark.readStream.format("kafka") \
     .option("kafka.bootstrap.servers", "host1:port1,host2:port2") \
     .option("subscribe", "your_topic") \
     .load()

您可以在此处获取更多信息: https://spark.apache.org/docs/latest/structured-streaming-kafka-integration.html