我通过kafka传输大量数据。然后我有火花流,消耗这些消息。基本上下线,火花流引发了这个错误:
kafka.common.OffsetOutOfRangeException
现在我知道这个错误意味着什么。所以我将保留政策更改为5天。但是我仍然遇到了同样的问题。然后我在kafka中使用--from-beginning列出了主题的所有消息。当然,从kafka流媒体部分开始的大量消息都不存在,因为火花流媒体有点落后于kafka流媒体部分,所以火花流媒体试图消耗已被kafka删除的消息。但是我认为更改保留策略会解决这个问题:
--add-config retention.ms=....
我怀疑kafka正在删除主题中的消息以释放新消息的空间(因为我们正在传输大量数据)。是否有一个我可以配置的属性,它指定kafka在删除先前消息之前可以存储多少字节的数据?
答案 0 :(得分:0)
您可以使用主题配置属性retention.bytes
通过控制台创建主题时设置主题的最大大小,如:
bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic my-topic --partitions 1 --replication-factor 1 --config retention.bytes=10485760 --config
或者您可以使用全局代理配置属性log.retention.bytes
来设置所有主题的最大大小。
重要的是要知道log.retention.bytes
没有对主题大小强制实施硬限制,但它只是向Kafka发出信号,要求何时开始删除最旧的消息
答案 1 :(得分:0)
解决此问题的另一种方法是在配置中指定spark参数:
spark.streaming.kafka.maxRatePerPartition