gpt4 book ai didi

java - 来自一个 Kafka 主题源的并发 Spark 流作业

转载 作者:行者123 更新时间:2023-12-01 23:51:58 26 4
gpt4 key购买 nike

我们有一个来自 kafka 主题(有 8 个分区)的简单 Spark 流,如下所示创建,并使用 2 个执行器(每个执行器 4 个核心)提交。

dataSet
.writeStream()
.trigger(Trigger.ProcessingTime(0))
.format("kafka");
.start();

现在考虑这种情况:

  1. 一个请求到达此主题的分区 #0。
  2. 一个 Spark 作业将从 8 个任务开始,并且只有其中一个正在运行(其他任务均成功)。
  3. 假设处理此请求需要 1 分钟。
  4. 在这 1 分钟内,有 100 个请求来到此主题(在所有 8 个分区中)。
  5. Spark 等待当前作业完成,然后创建另一个作业来处理新请求。

我们的期望是 Spark 在处理第一个请求时处理另一个作业中的其他请求,但这并没有发生。现在假设第一个作业需要 1 小时而不是 1 分钟,而其他请求在 7 个核心空闲时等待处理!这就是我们的问题。

我已经尝试从 4 个不同的线程多次发送此作业(例如 4 次),但行为仍然相同。我还尝试将此配置 spark.streaming.concurrentJobs 设置为大于 1,但没有更改!

所以我的问题是一个kafka流数据集是否可以有多个作业?如果是的话怎么办?

我们正在使用 Spark 2、Kafka 1 和 Java 8。

最佳答案

经过几天的研究和测试,我终于发现并发作业设置或在不同线程中发送作业都不是解决方案。

唯一可行的解​​决方案是为每个(或一组)主题分区创建不同的流

kafka中的并行因素是分区。 Spark(和 kafka)具有仅从特定分区读取的能力。因此,如果我们的分区有 4 个主题,我会将 Spark 作业分成 4 个不同的作业,每个作业都监听(分配)到一个分区,但所有作业都陷入同一目标。

现在,如果一个作业正忙于一个耗时的进程,其他作业(此处为 3)仍然可以处理其分配的分区中的数据,并且不需要等待其他分区上的处理完成。

配置如下:

assign: {"topic-name":[0,1,2]}

而不是

subscribe: "topic-name"

注意配置结构,它应该是有效的 JSON,并且主题列表应该以逗号分隔的字符串提及(不支持范围或排除)

关于java - 来自一个 Kafka 主题源的并发 Spark 流作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58216852/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com