【问题标题】:Memory Limit in Spark/kafkaSpark/kafka 中的内存限制
【发布时间】:2022-02-14 02:05:29
【问题描述】:

在使用来自 Kafka 的数据时,有什么方法可以设置记录数限制。 即我在 Kafka 中有 1000 条记录,在消费来自 Kafka 的事件后,放置在 HDFS 位置。我正在尝试添加配置(通过 spark submit 命令),因此它一次只能读取和处理 100 条记录,而不是消耗所有 1000 条记录,因此这样会消耗更少的内存。

【问题讨论】:

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


    【解决方案1】:

    有一个设置maxOffsetsPerTrigger 来限制要获取的记录数

    但是,要限制总内存,可以强制 Spark 执行程序具有固定的堆大小,并且您可以尝试将 kafka.max.poll.records 配置选项传递给 readStream 选项,以便对消费者更明确地限制轮询记录。


    您也可以使用 Kafka Connect HDFS Sink,它有一个 flush.size 参数用于记录每个文件。

    请注意,HDFS 更喜欢大文件,而不是很多小文件

    【讨论】:

    • 我尝试在消费者配置中设置 'max.poll.records=100' 仍然在我检查作业日志时显示“numInputRows”:1000。@OneCricketeer
    • 在日志中,您应该看到ConsumerConfig 部分。确保输出中的max.poll.records 与您设置的匹配。也有可能 Spark 轮询多次(每个执行程序一次),然后将它们全部返回为您的数据集;因此,例如,10 个执行器可以读取 10 个主题分区,轮询 100 条记录,总共有 1000 条记录。无论如何,Kafka 记录的默认限制为 1MB,因此 1000 条记录只有 1GB,这比我个人使用过的大多数 Spark 执行器堆大小要小。
    • 感谢@OneCricketeer。它与 maxOffsetPerTrigger 属性一起使用。
    • 我已更新我的答案以反映这一点
    猜你喜欢
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 2017-02-20
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多