我目前正在使用新的直接方法(没有接收器)在spark上运行一个流媒体应用程序消耗一个简单的kafka主题。由于我们在Kafka集群上遇到了一些问题,即使在Kafka上恢复正常之后,流媒体应用也遇到了一些麻烦:一些工作正在处理几乎空的rdds,而其他工作正在处理双倍尺寸的工作。 arverage输入率仍然与以往相同,但处理时间因此不常规。
我尝试重新启动应用,但没有任何区别。我没有在Kafka和Spark方面找到任何堆栈或线索。
有人能告诉我如何解决这类问题吗?或者至少在哪里了解一下发生了什么?
答案 0 :(得分:0)
在使用Kafka的直接无接收器方法中,Spark Master节点从Kafka 的每个分区读取当前偏移,然后告诉每个工作人员从哪个分区读取,以及从哪个偏移到什么偏移。它在Spark-Streaming Kafka Integration documentation上声明:
使用
directStream
,Spark Streaming将创建尽可能多的RDD分区 因为要使用Kafka分区,所有分区都会读取数据 来自卡夫卡并行。所以Kafka之间有一对一的映射 和RDD分区,这更容易理解和调整。
假设您有3个Spark工作人员和3个Kafka分区(为简单起见)。如果Kafka没有正确地对其数据进行分区,并且分区1和3最终接收到所有数据,而分区2没有数据,那么您将以包含2个大的分区的批次结束,并且每个火花工作者将对其中一个进行操作分区,它限制了并行数。
这看起来像Kafka问题而不是Spark问题。我建议看看Kafka如何为您正在阅读的特定主题分区数据。作为一种快速解决方法,您可以使用DStream.repartition
从Kafka读取数据后对数据进行重新分区。
答案 1 :(得分:0)
最后,我发现了什么问题:在操作之后kafka集群拓扑发生了变化,因此用于创建直接流的代理列表不是最新的。不幸的是,spark kafka消费者似乎无法自动发现和删除经纪人......