我是Kafka的新手,我想做以下事情:
例如:我有两台服务器分别推送'a'
和'b'
。我需要spark应用程序在数据框中接收值'a'
和'b'
,以便可以一起处理它们。 10分钟后,2台服务器推送'c'
和'd'
。 spark应用程序应同时收到值'c'
和'd'
,等等。
我的spark应用程序需要推送所有最新数据,因此我认为流式处理方法不正确,可能采用批处理方法(或者可能采用不同方式)。
我的Spark应用需要DataFrame
。
答案 0 :(得分:0)
您的问题听起来不像通常的Kafka用例。但是,如果必须使用Kafka,您可以使用Kafka主题对数据进行分组。通过创建主题A_B
和C_D
,您可以确保价值观和价值。和' b'将被一起消费并与' c'并且' d'值。然后,您的Spark应用必须验证它是否从A_B
和C_D
获得了所有需要的数据并继续执行。
如果您的Spark应用程序能够缓冲所有数据并确定何时消耗了所有需要的消息,则此设计将起作用。
答案 1 :(得分:0)
首次加载应用时,需要保存Kafka主题的当前偏移量。然后,每隔10分钟从Kafka加载数据并执行逻辑。所以你基本上可以运行以下例程:
加载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,然后运行以下例程:
在这种情况下初始化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