将数据帧从 Spark 写入 Kafka 时出错(org.apache.kafka.common.errors.RecordTooLargeException)

时间:2021-01-29 16:54:12

标签: apache-spark apache-kafka

我正在使用以下参数将一个包含 30000 个条目的 Dataframe 写入 kafka

pc.amat2<-addBgKnowledge(pag2cpdag(fci.fit),x=1,y=2)
class(pc.amat2)<-"matrix"
plot(as(t(pc.amat2),"graphNEL"))

我不明白 Spark 如何对 Dataframe 进行分区,我收到错误

    .format("kafka")
    .option("kafka.bootstrap.servers", kafka_brokers)
    .option("kafka.compression.type","lz4")
    .option("kafka.max.request.size", 1048576)
    .option("kafka.message.max.bytes", 750000)
    .option("kafka.max.request.size",750000)
    .option("kafka.max.partition.fetch.bytes",750000)
    .option("kafka.batch.size", 100)
    .option("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
    .option("value.serializer", "org.apache.kafka.common.serialization.JsonSerializer")
    .option("topic", product_kafka_topic)
    .option("partition",15)

我该如何解决?

1 个答案:

答案 0 :(得分:1)

<块引用>

序列化时消息为10540452字节,大于750000

您已明确限制消息大小

.option("kafka.message.max.bytes", 750000)
<块引用>

我不明白 Spark 如何对 Dataframe 进行分区

它需要您的 key, value 列以及可选的 timestamppartition 列,然后将每一行打包到 Kafka 记录中,这些记录在请求批次中生成。

.option("kafka.max.request.size", 1048576)
.option("kafka.max.request.size", 750000)

鉴于您用第二个值重复了该选项,这就是将在配置中使用的值

一个请求中可以有多个消息,但该值是字节,而不是记录数。

.option("kafka.batch.size", 100)

这不是单独在 Spark 中可以解决的问题;代理也会拒绝大消息 -- 请参阅此处的解决方案 How can I send large messages with Kafka (over 15MB)?


旁白:结构化流不使用 key.serializervalue.serializerpartition 作为配置选项