我正在使用
spark 1.5.2
。我需要使用 kafka 作为流源来运行 Spark 流作业。我需要读取 kafka 中的多个主题并以不同的方式处理每个主题。
我做了以下观察,以防对某人有帮助:
创建多个流有两个好处: 1. 您不需要应用过滤操作来以不同的方式处理不同的主题。 2. 您可以并行读取多个流(而不是在单个流的情况下逐一读取)。为此,有一个未记录的配置参数
spark.streaming.concurrentJobs*
。所以,我决定创建多个流。
sparkConf.set("spark.streaming.concurrentJobs", "4");
我认为正确的解决方案取决于您的用例。
如果你对所有主题的数据的处理逻辑都是相同的,那么毫无疑问,这是一个更好的方法。
如果处理逻辑不同,我猜你从所有主题中得到一个RDD,你必须为每个处理逻辑创建一个pairedrdd并单独处理。问题在于,这会创建一种处理分组,并且整体处理速度将由需要最长处理时间的主题决定。因此,数据较少的主题必须等到所有主题的数据都处理完毕。一个优点是,如果它是时间序列数据,那么处理会一起进行,这可能是一件好事。
运行独立作业的另一个优点是您可以获得更好的控制并可以调整资源共享。例如:处理高吞吐量主题的作业可以分配更高的 CPU/内存。
Spark 结构化流似乎正在解决这个问题。我稍后会分享示例代码。同时可以浏览this答案