Spark:并行处理多个kafka主题
Spark: processing multiple kafka topic in parallel
我正在使用 spark 1.5.2
。我需要 运行 以 kafka 作为流媒体源来激发流媒体作业。我需要阅读 kafka 中的多个主题并以不同方式处理每个主题。
- 在同一份工作中这样做是个好主意吗?如果是这样,我应该为每个主题创建一个具有多个分区或不同流的单个流吗?
- 我正在使用 Kafka 直接蒸汽。据我所知,spark 为每个分区启动 long-运行ning 接收器。我有一个相对较小的集群,6 个节点,每个节点有 4 个核心。如果我在每个主题中有很多主题和分区,效率是否会受到影响,因为大多数执行者都忙于 long-运行ning 接收者? 这里理解有误请指正
我认为正确的解决方案取决于您的用例。
如果您对所有主题的数据的处理逻辑相同,那么毫无疑问,这是一种更好的方法。
如果处理逻辑不同,我猜你从所有主题中得到一个 RDD,你必须为每个处理逻辑创建一个 pairedrdd 并分别处理。问题在于,这会创建一种处理分组,并且整体处理速度将由需要最长处理时间的主题决定。因此,数据较少的主题必须等到处理完所有主题的数据。一个优点是,如果它是时间序列数据,那么处理会一起进行,这可能是一件好事。
运行 独立工作的另一个优势是您可以更好地控制并调整您的资源共享。例如:处理高吞吐量主题的作业可以分配更高的 CPU/memory.
我做了以下观察,以防对某人有帮助:
- 在 kafka 直接流中,接收者不是 运行 长 运行ning 任务。在每个批次间隔开始时,首先从执行器中的 kafka 读取数据。一旦读取,处理部分接管。
- 如果我们创建一个包含多个主题的流,则主题会一个接一个地阅读。此外,过滤 dstream 以应用不同的处理逻辑会给作业增加另一个步骤
创建多个流将在两个方面有所帮助: 1. 您不需要应用过滤操作来以不同方式处理不同的主题。 2. 您可以并行读取多个流(而不是在单个流的情况下一个一个地读取)。为此,有一个未记录的配置参数 spark.streaming.concurrentJobs*
。所以,我决定创建多个流。
sparkConf.set("spark.streaming.concurrentJobs", "4");
我正在使用 spark 1.5.2
。我需要 运行 以 kafka 作为流媒体源来激发流媒体作业。我需要阅读 kafka 中的多个主题并以不同方式处理每个主题。
- 在同一份工作中这样做是个好主意吗?如果是这样,我应该为每个主题创建一个具有多个分区或不同流的单个流吗?
- 我正在使用 Kafka 直接蒸汽。据我所知,spark 为每个分区启动 long-运行ning 接收器。我有一个相对较小的集群,6 个节点,每个节点有 4 个核心。如果我在每个主题中有很多主题和分区,效率是否会受到影响,因为大多数执行者都忙于 long-运行ning 接收者? 这里理解有误请指正
我认为正确的解决方案取决于您的用例。
如果您对所有主题的数据的处理逻辑相同,那么毫无疑问,这是一种更好的方法。
如果处理逻辑不同,我猜你从所有主题中得到一个 RDD,你必须为每个处理逻辑创建一个 pairedrdd 并分别处理。问题在于,这会创建一种处理分组,并且整体处理速度将由需要最长处理时间的主题决定。因此,数据较少的主题必须等到处理完所有主题的数据。一个优点是,如果它是时间序列数据,那么处理会一起进行,这可能是一件好事。
运行 独立工作的另一个优势是您可以更好地控制并调整您的资源共享。例如:处理高吞吐量主题的作业可以分配更高的 CPU/memory.
我做了以下观察,以防对某人有帮助:
- 在 kafka 直接流中,接收者不是 运行 长 运行ning 任务。在每个批次间隔开始时,首先从执行器中的 kafka 读取数据。一旦读取,处理部分接管。
- 如果我们创建一个包含多个主题的流,则主题会一个接一个地阅读。此外,过滤 dstream 以应用不同的处理逻辑会给作业增加另一个步骤
创建多个流将在两个方面有所帮助: 1. 您不需要应用过滤操作来以不同方式处理不同的主题。 2. 您可以并行读取多个流(而不是在单个流的情况下一个一个地读取)。为此,有一个未记录的配置参数
spark.streaming.concurrentJobs*
。所以,我决定创建多个流。sparkConf.set("spark.streaming.concurrentJobs", "4");