spark-streaming-kafka-0-10:如何限制 Spark 分区的数量
spark-streaming-kafka-0-10: How to limit number of Spark partitions
是否可以使用 spark-streaming-kafka-0-10 库配置 Spark 以通过单个任务读取多个 Kafka 分区或整个 Kafka 主题而不是创建每个可用的 Kafka 分区都有不同的 Spark 任务?
请原谅我对这些技术的粗略理解;我想我对 Spark 和 Kafka 还是陌生的。体系结构和设置大多只是乱七八糟地探索和了解这些技术如何协同工作。
我有四个虚拟主机,一个有一个 Spark master,每个都有一个 Spark worker。其中一位主机也是 运行 基于 Spotify's Docker image 的 Kafka 代理。每个主机有四个内核和大约 8 GB 未使用的 RAM。
Kafka broker有206个topic,每个topic有10个partition。所以总共有2060个分区供应用程序读取。
我正在使用 spark-streaming-kafka-0-10 库(目前处于试验阶段)从 Spark Streaming 作业订阅 Kafka 中的主题。我正在使用 SubscribePattern
class 订阅来自 Spark 的所有 206 个主题:
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
SubscribePattern[String, String](Pattern.compile("(pid\.)\d+"),
kafkaParams)
)
当我将此作业提交给 Spark master 时,似乎启动了 16 个执行程序,一个用于集群中的每个核心。看起来每个 Kafka 分区都有自己的任务,总共有 2,060 个任务。我认为我的 16 名执行者集群在完成如此多的任务时遇到了麻烦,因为作业在完成 1500 到 1800 个任务之间的不同点不断失败。
我发现 a tutorial by Michael Noll from 2014 哪些地址使用 spark-streaming-kafka-0-8 库来控制每个主题的消费者线程数:
val kafkaParams: Map[String, String] = Map("group.id" -> "terran", ...)
val consumerThreadsPerInputDstream = 3
val topics = Map("zerg.hydra" -> consumerThreadsPerInputDstream)
val stream = KafkaUtils.createStream(ssc, kafkaParams, topics, ...)
Is it possible to configure Spark with the spark-streaming-kafka-0-10 library to read multiple Kafka partitions or an entire Kafka topic with a single task instead of creating a different Spark task for every Kafka partition available?
您可以通过在流上调用 repartition
来更改生成的分区数,但是您会丢失 Kafka 和 RDD 分区之间的 1:1 对应关系。
Kafka 分区生成的任务数与您有 16 个执行程序这一事实无关。执行者的数量取决于您的设置和您使用的资源管理器。
Kafka 分区和 RDD 分区之间有一个 1:1 映射与直接流 API,每个执行者将从这些分区的一个子集获取来自 Kafka 的消费和进程,其中每个分区是独立的并且可以自己计算。这与基于接收器的 API 不同,它在任意执行器上创建单个接收器并通过节点上的线程本身使用数据。
如果您有 206 个主题,每个主题有 10 个分区,您最好有一个大小合适的集群来处理生成的任务的负载。您可以控制每个分区生成的最大消息数,但您可以更改分区数,除非您要调用 repartition
转换的洗牌效果。
第二种方法最适合您的要求。只有你必须设置 consumerThreadsPerInputDstream = 1。因此每次读取操作只会创建一个线程,因此每个集群将涉及一台机器。
是否可以使用 spark-streaming-kafka-0-10 库配置 Spark 以通过单个任务读取多个 Kafka 分区或整个 Kafka 主题而不是创建每个可用的 Kafka 分区都有不同的 Spark 任务?
请原谅我对这些技术的粗略理解;我想我对 Spark 和 Kafka 还是陌生的。体系结构和设置大多只是乱七八糟地探索和了解这些技术如何协同工作。
我有四个虚拟主机,一个有一个 Spark master,每个都有一个 Spark worker。其中一位主机也是 运行 基于 Spotify's Docker image 的 Kafka 代理。每个主机有四个内核和大约 8 GB 未使用的 RAM。
Kafka broker有206个topic,每个topic有10个partition。所以总共有2060个分区供应用程序读取。
我正在使用 spark-streaming-kafka-0-10 库(目前处于试验阶段)从 Spark Streaming 作业订阅 Kafka 中的主题。我正在使用 SubscribePattern
class 订阅来自 Spark 的所有 206 个主题:
val stream = KafkaUtils.createDirectStream[String, String](
ssc,
PreferConsistent,
SubscribePattern[String, String](Pattern.compile("(pid\.)\d+"),
kafkaParams)
)
当我将此作业提交给 Spark master 时,似乎启动了 16 个执行程序,一个用于集群中的每个核心。看起来每个 Kafka 分区都有自己的任务,总共有 2,060 个任务。我认为我的 16 名执行者集群在完成如此多的任务时遇到了麻烦,因为作业在完成 1500 到 1800 个任务之间的不同点不断失败。
我发现 a tutorial by Michael Noll from 2014 哪些地址使用 spark-streaming-kafka-0-8 库来控制每个主题的消费者线程数:
val kafkaParams: Map[String, String] = Map("group.id" -> "terran", ...)
val consumerThreadsPerInputDstream = 3
val topics = Map("zerg.hydra" -> consumerThreadsPerInputDstream)
val stream = KafkaUtils.createStream(ssc, kafkaParams, topics, ...)
Is it possible to configure Spark with the spark-streaming-kafka-0-10 library to read multiple Kafka partitions or an entire Kafka topic with a single task instead of creating a different Spark task for every Kafka partition available?
您可以通过在流上调用 repartition
来更改生成的分区数,但是您会丢失 Kafka 和 RDD 分区之间的 1:1 对应关系。
Kafka 分区生成的任务数与您有 16 个执行程序这一事实无关。执行者的数量取决于您的设置和您使用的资源管理器。
Kafka 分区和 RDD 分区之间有一个 1:1 映射与直接流 API,每个执行者将从这些分区的一个子集获取来自 Kafka 的消费和进程,其中每个分区是独立的并且可以自己计算。这与基于接收器的 API 不同,它在任意执行器上创建单个接收器并通过节点上的线程本身使用数据。
如果您有 206 个主题,每个主题有 10 个分区,您最好有一个大小合适的集群来处理生成的任务的负载。您可以控制每个分区生成的最大消息数,但您可以更改分区数,除非您要调用 repartition
转换的洗牌效果。
第二种方法最适合您的要求。只有你必须设置 consumerThreadsPerInputDstream = 1。因此每次读取操作只会创建一个线程,因此每个集群将涉及一台机器。