如何在Kafka主题中流式传输100GB数据?

时间:2018-12-20 06:18:12

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

因此,在我们的kafka主题之一中,接近100 GB的数据。 我们正在运行火花结构化流以获取S3中的数据

当数据高达10GB时,流运行良好,我们能够在S3中获取数据。 但是有了100GB,花大量时间在kafka中流式传输数据。

问题:火花流如何从Kafka读取数据? 是否从当前偏移量获取全部数据? 还是需要批量处理?

1 个答案:

答案 0 :(得分:2)

Spark将像其他任何Kafka消费者一样,以消费群体为对象,但要分批进行。因此,它从上次消耗的偏移量中获取尽可能多的数据(基于各种Kafka用户设置)。从理论上讲,如果您拥有相同数量的分区,并且提交间隔与10 GB相同,那么100 GB的存储时间只需要10倍。您尚未说明当前需要花费多长时间,但是对于某些人来说,1分钟对10分钟似乎肯定是“永远”

我建议您使用kafka-consumer-groups命令行工具并结合诸如Burrow或Remora之类的图表来绘制消费者滞后时间...如果您注意到滞后量呈上升趋势,则Spark为没有足够快地消耗记录。 为了克服这个问题,第一种选择是确保Spark执行程序的数量均匀地消耗所有Kafka分区。

您还需要确保在使用和写入记录之间不进行简单的过滤器和映射之外的其他主要数据转换,因为这也会带来滞后。


对于非火花方法,我想指出,Confluent S3连接器也是批处理的,因为它只会定期刷新到S3,但是消耗本身比Spark更接近实时。我可以验证它能够写入非常大的S3文件(大小为GB),如果堆足够大并且刷新配置设置为大值。

Pinterest的Secor是另一种不需要手动编码的选项