Kafka + Spark Streaming - 分区之间的公平性?

时间:2017-10-06 14:55:55

标签: apache-spark apache-kafka spark-streaming

我在Kafka有一个20分区主题,我正在使用Spark Streaming(8个执行器,每个3个核心)阅读它。我使用直接流式阅读方法。

我遇到了问题,因为出于某种原因,前12个分区的读取速度比后8个更快。因此,过去8中的数据变得过时(好吧,staler)。

分区12-19约占90%的分区0-11;但我们正在谈论数十亿条消息;所以10%的数据在主题分区中的陈旧性非常重要。

这是正常的吗?我可以确定Kafka更公平地使用分区吗?

2 个答案:

答案 0 :(得分:2)

Kafka消费者消费将分区划分为消费者群体中的消费者实例。消费者群体中的每个消费者都是分享“公平份额”的独家消费者。这就是Kafka如何在消费者群体中对消费者进行负载平衡。消费者组中的消费者成员资格由Kafka协议动态处理。如果新的消费者加入消费者群体,它将获得分区的份额。如果消费者死亡,其分区将在消费者组中的剩余实时消费者之间分配。这就是Kafka在消费者群体中对消费者进行故障转移的方式。

<强> UnderReplicatedPartitions:

在健康的群集中,同步副本(ISR)的数量应该与副本的总数完全相等。如果分区副本远远落后于其领导者,则从ISR池中删除跟随分区,您应该看到IsrShrinksPerSec的相应增加。由于没有复制就无法满足Kafka的高可用性保证,如果该指标值在延长的时间段内超过零,则必须进行调查。

<强> IsrShrinksPerSec / IsrExpandsPerSec:

特定分区的同步副本数(ISR)应保持相当静态,唯一的例外是扩展代理群集或删除分区时。为了保持高可用性,健康的Kafka群集需要最少数量的ISR才能进行故障转移。一些副本可以从ISR池中删除,原因有两个:它远远落后于领导者的偏移量(用户可以通过设置replica.lag.max.messages配置参数进行配置),或者它没有联系领导者time(可以使用replica.socket.timeout.ms参数配置)。不管是什么原因,IsrShrinksPerSec在没有相应增加IsrExpandsPerSec之后不久就会引起关注并需要用户干预.Kafka文档提供了大量有关经纪人用户可配置参数的信息。

https://www.datadoghq.com/blog/monitoring-kafka-performance-metrics/

  

在公平分享下,Spark在“回合”中分配任务   罗宾“时尚,所以所有工作在集群中的份额大致相等   资源。这意味着在长期工作期间提交的短期工作   跑步可以立即开始接收资源,仍然可以获得好处   响应时间,无需等待长时间的工作完成。

默认情况下,Spark的调度程序以FIFO方式运行作业,第一个作业获得所有可用资源的优先级,同时其阶段具有要启动的任务,然后第二个作业获得优先级等。

Spark Streaming你可以配置fairscheduling模式,Spark Streaming的JobScheduler应该并行提交每个主题的Spark作业

要启用公平调度程序,只需在配置SparkContext时将spark.scheduler.mode属性设置为FAIR:

val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.scheduler.mode", "FAIR") val sc = new
SparkContext(conf)

答案 1 :(得分:0)

在我的特定情况下,事实证明我遇到了某种错误(可能在MapR&#39的发行中)。

该错误导致某些分区的偏移重置为0,当稍后观察时,会导致它们只是略微落后一点。

我找到了缓解此问题的配置参数,此处提供了有关该主题的更多讨论:https://community.mapr.com/thread/22319-spark-streaming-mapr-streams-losing-partitions

配置示例 - 在Spark上下文

 .set("spark.streaming.kafka.consumer.poll.ms", String.valueOf(Config.config.AGG_KAFKA_POLLING_MS))
 .set("spark.streaming.kafka.maxRetries", String.valueOf(10))

修改

确认其他人在使用Spark Streaming + MapR-Streams / Kafka时遇到过这个问题 - 这种配置似乎减少了它发生的可能性,但它最终还是回来了。

您可以通过安全检查来解决问题,并检测条件并修复&#​​34;在启动火花流之前使用标准Kafka消费者的偏移量(重新启动流媒体应用时会出现问题);但您必须在外部存储偏移量才能执行此操作。复杂化这个问题,由于另一个错误,你无法在启动时可靠地提供Spark 2.1.0流的偏移量;这就是为什么你必须在开始流媒体之前操纵消费者的偏移量;这样它就是从已经存储在Kafka中的偏移开始的。