【问题标题】:How to stream 100GB of data in Kafka topic?如何在 Kafka 主题中流式传输 100GB 的数据?
【发布时间】:2019-05-20 15:53:10
【问题描述】:

因此,在我们的一个 kafka 主题中,有接近 100 GB 的数据。 我们正在运行 spark-structured streaming 以获取 S3 中的数据

当数据达到 10GB 时,流式传输运行良好,我们能够在 S3 中获取数据。 但是对于 100GB,在 kafka 中流式传输数据需要很长时间。

问题:spark-streaming 如何从 Kafka 读取数据? 它是否从当前偏移量中获取全部数据? 还是分批批量处理?

【问题讨论】:

  • 您使用 Spark Streaming 有什么原因吗?为什么不直接使用 Kafka Connect,它是 Apache Kafka 的一部分,专为与 S3 等其他系统集成而设计。
  • (如果您需要先处理数据,请对其进行处理并将其写回 Kafka 主题,然后使用 Kafka Connect 将其流式传输到 S3)
  • Spark 是否用于“但是使用 100GB,在 kafka 中流式传输数据需要很长时间。”?我认为您在从 Kafka 读取数据时遇到问题?

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


【解决方案1】:

Spark 将像任何其他 Kafka 消费者一样处理消费者组,但分批处理。因此,它尽可能从上次消费的偏移量中获取尽可能多的数据(基于各种 Kafka 消费者设置)。理论上,如果您有相同数量的分区,并且提交间隔与 10 GB 相同,那么完成 100 GB 只需要 10 倍的时间。您没有说明目前需要多长时间,但对于某些人来说,1 分钟与 10 分钟可能看起来像“永远”,当然。

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

您还需要确保除了简单的过滤器和在使用记录和写入记录之间的映射之外,您没有进行主要的数据转换,因为这也会引入延迟。


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

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

【讨论】:

  • OP 说 “我们正在运行 spark-structured streaming” 所以 “Spark StreamingContext 间隔” 在这里没有意义,不是吗?跨度>
  • 好吧,如果没有明确定义,微批处理间隔仍然存在,对吧?例如。 trigger interval
  • 微批量正在慢慢消失,用于连续处理模式。请参阅github.com/apache/spark/blob/v2.4.0/sql/core/src/main/java/org/… 概念是否相似并不重要。您的回答似乎没有太大帮助。
  • 您有权发表自己的意见。随意提供一个替代答案,展示 Spark 2.3+ 的新连续处理功能
猜你喜欢
  • 2018-11-18
  • 2018-05-13
  • 2018-11-16
  • 2020-10-07
  • 2019-07-21
  • 1970-01-01
  • 2020-10-02
  • 2019-05-05
相关资源
最近更新 更多