Spark:并行处理多个kafka主题
Posted
技术标签:
【中文标题】Spark:并行处理多个kafka主题【英文标题】:Spark: processing multiple kafka topic in parallel 【发布时间】:2016-03-29 14:10:51 【问题描述】:我正在使用spark 1.5.2
。我需要使用 kafka 作为流媒体源来运行 spark 流媒体作业。我需要阅读 kafka 中的多个主题并以不同方式处理每个主题。
-
在同一份工作中这样做是个好主意吗?如果是这样,我应该为每个主题创建一个包含多个分区的流还是不同的流?
我正在使用 Kafka 直接蒸汽。据我所知,spark 会为每个分区启动长时间运行的接收器。我有一个相对较小的集群,6 个节点,每个节点有 4 个核心。如果我在每个主题中有很多主题和分区,效率会因为大多数执行者忙于长时间运行的接收者而受到影响吗? 如果我的理解有误请指正
【问题讨论】:
【参考方案1】:我做了以下观察,以防它对某人有帮助:
-
在 kafka 直接流中,接收器不会作为长时间运行的任务运行。在每个批次间隔开始时,首先从 executors 中的 kafka 读取数据。读取后,处理部分将接管。
如果我们创建一个包含多个主题的流,主题会一个接一个地被读取。此外,过滤 dstream 以应用不同的处理逻辑将为作业添加另一个步骤
创建多个流有两种帮助: 1. 您无需应用过滤器操作来以不同的方式处理不同的主题。 2.您可以并行读取多个流(而不是在单个流的情况下一个接一个)。为此,有一个未记录的配置参数spark.streaming.concurrentJobs*
。所以,我决定创建多个流。
sparkConf.set("spark.streaming.concurrentJobs", "4");
【讨论】:
@CodyKoeninger,在我们知道容器中的所有元素都来自同一个主题之前,我们需要下降到哪个级别?即,在 RDD 中,我是否保证所有记录都来自同一主题?还是在分区级别?在这种情况下,是否有公开它的高级 API? @Stephane 在进行转换之前,直接流的 RDD 分区与 kafka topicpartitions 是 1:1 的。见github.com/koeninger/kafka-exactly-once @prasad-khode - 我可以在其中找到与“如果我们创建一个包含多个主题的单个流,主题一个接一个地阅读”的相关性,看起来它没有记录在 kafka 中火花流。 @ASe 没有文档,但这是我通过在标准输出上打印消息所观察到的。 你是如何启动多个流的?【参考方案2】:我认为正确的解决方案取决于您的用例。
如果您对来自所有主题的数据的处理逻辑相同,那么毫无疑问,这是一种更好的方法。
如果处理逻辑不同,我猜你会从所有主题中获得一个 RDD,你必须为每个处理逻辑创建一个 pairrdd 并单独处理它。问题是这会产生一种分组处理,整体处理速度将取决于需要最长处理时间的主题。因此,数据较少的主题必须等到所有主题的数据都处理完毕。一个优点是,如果它是一个时间序列数据,那么处理会一起进行,这可能是一件好事。
运行独立作业的另一个优势是您可以更好地控制并调整资源共享。例如:处理具有高吞吐量主题的作业可以分配更高的 CPU/内存。
【讨论】:
以上是关于Spark:并行处理多个kafka主题的主要内容,如果未能解决你的问题,请参考以下文章