适用于1000多个主题的Spark Streaming设计

Sha*_*shi 1 apache-spark spark-streaming spark-dataframe

我必须使用以下用例设计一个Spark Streaming应用程序。我正在为此寻找最佳方法。

我有一个将数据推入1000多个不同主题的应用程序,每个主题都有不同的用途。Spark流式处理将从每个主题接收数据,并且在处理之后,它将回写到相应的另一个主题。

Ex. 

Input Type 1 Topic  --> Spark Streaming --> Output Type 1 Topic 
Input Type 2 Topic  --> Spark Streaming --> Output Type 2 Topic 
Input Type 3 Topic  --> Spark Streaming --> Output Type 3 Topic 
.
.
.
Input Type N Topic  --> Spark Streaming --> Output Type N Topic  and so on.
Run Code Online (Sandbox Code Playgroud)

我需要回答以下问题。

  1. 每个主题启动1000个以上的Spark Streaming应用程序是一个好主意吗?或者我应该为所有主题提供一个流应用程序,因为处理逻辑将是相同的?
  2. 如果是一个流上下文,那么我将如何确定哪个RDD属于哪个Kafka主题,以便在处理之后可以将其写回到其对应的OUTPUT主题?
  3. 客户端可以从Kafka添加/删除主题,如何在Spark流中动态处理?
  4. 如何在出现故障时自动重新启动作业?

你们还有其他问题吗?

非常感谢您的回应。

Pau*_*rcq 5

  1. 1000个不同的Spark应用程序将无法维护,请想象部署或升级每个应用程序。

您将必须使用推荐的“直接方法”而不是Receiver方法,否则您的应用程序将使用1000个以上的内核,如果您没有更多的内核,它将能够从Kafka的主题中接收数据,但不能处理它们。从Spark Streaming Doc

请注意,如果要在流应用程序中并行接收多个数据流,则可以创建多个输入DStream(在“性能调整”部分中进一步讨论)。这将创建多个接收器,这些接收器将同时接收多个数据流。但是请注意,Spark工作者/执行程序是一项长期运行的任务,因此它占用了分配给Spark Streaming应用程序的核心之一。

  1. 您可以在Kafka Integration(Kafka 0.8中有一个,而0.10中有一个)文档中如何查看消息属于哪个主题

  2. 如果客户端添加新主题或分区,则需要更新Spark Streaming的主题conf,然后重新部署它。如果您使用Kafka 0.10,则还可以使用RegEx作为主题名称,请参阅《消费者策略》。我已经从Kafka 0.8中删除的主题中进行了阅读,没有任何问题,请继续进行验证(“信任,但请进行验证”)

  3. 请参阅Spark Streaming的有关Fault Tolerance的文档,还可以在--supervise将应用程序提交到集群时使用该模式,请参阅Deploying文档以获取更多信息。

为了实现一次语义,我建议Spark Streaming的主要提交者提供以下Github:https : //github.com/koeninger/kafka-exactly-once

奖励,类似StackOverFlow的好帖子:Spark:并行处理多个kafka主题

Bonus2:注意即将发布的Spark 2.2和结构化流组件