apache-spark - Kafka 主题分区到 Spark 流

标签 apache-spark apache-kafka spark-streaming

我有一些用例想要更清楚地说明,关于 Kafka 主题分区 -> Spark 流资源利用率。

我使用spark独立模式,所以我只有“执行器总数”和“执行器内存”设置。据我所知,根据文档,将并行性引入 Spark 流的方法是使用分区 Kafka 主题 -> 当我使用 Spark-kafka 直接流集成时,RDD 将具有与 kafka 相同数量的分区。

因此,如果主题中有 1 个分区和 1 个执行器核心,该核心将按顺序从 Kafka 读取。

如果我有会发生什么:

  • 主题中有 2 个分区,但只有 1 个执行器核心?该核心是否会先从一个分区读取,然后再从第二个分区读取,因此对主题进行分区不会有任何好处?

  • 主题中有 2 个分区和 2 个核心?那么 1 个执行器核心会从 1 个分区读取数据,而第二个执行器核心会从第二个分区读取数据吗?

  • 1 个 kafka 分区和 2 个执行器核心?

谢谢。

最佳答案

基本规则是您可以扩展 Kafka 分区的数量。如果将 spark.executor.cores 设置为大于分区数,则某些线程将处于空闲状态。如果它小于分区数,Spark 将使线程先从一个分区读取,然后再从另一个分区读取。所以:

  1. 2 个分区,1 个执行程序:先从一个分区读取,然后从其他分区读取。 (我不确定 Spark 如何决定在切换之前从每个读取多少内容)

  2. 2p、2c:并行执行

  3. 1p、2c:一个线程空闲

对于情况#1,请注意,分区数多于执行器数是可以的,因为它允许您稍后进行扩展而无需重新分区。诀窍是确保您的分区可以被执行器的数量整除。在将数据传递到管道中的下一步之前,Spark 必须处理所有分区。因此,如果您有“剩余”分区,这可能会减慢处理速度。例如,5 个分区和 4 个线程 => 处理需要 2 个分区的时间 - 一次 4 个分区,然后一个线程自行运行第 5 个分区。

另请注意,如果通过在 reduceByKey() 等函数中显式设置数据分区的数量来保持整个管道中分区/RDD 的数量相同,您也可能会看到更好的处理吞吐量。

关于apache-spark - Kafka 主题分区到 Spark 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37810709/

相关文章:

json - Spark 2.1.1 : Parsed JSON values do not match with class constructor

apache-spark - 如何在 Spark 和 Cassandra 之间配置 SSL?

python - Kafka python API 是否支持流处理?

java - spring Kafka ConsumerFactory bean 未找到

apache-spark - Spark 跨接收器的结构化流一致性

apache-spark - DStream updateStateByKey更新函数实现

apache-spark - 如何反转 RDD.takeOrdered() 的顺序?

java - 使用启用了 TLS 的 kafka-topics cli 命令时出现问题

mysql - Spark rdd通过查询mysql进行过滤

apache-spark - Spark ML - MulticlassClassificationEvaluator - 我们可以通过每个类标签获得精度/召回率吗?