我们正在GCP Dataflow中运行管道,并遇到pubsub消息的最大消息大小[1] 发生这种情况时,管道的滞后时间将开始累积,最终停滞不前...
此日志消息是在GCP堆栈驱动程序的“ dataflow_step”下生成的,
我的问题,有没有一种方法可以在管道中定义错误处理...
.apply(PubsubIO.writeMessages()
.to("topic")
.withTimestampAttribute(Instant.now().toString()));
类似
.onError(...perform error handling ...)
以与Java8流api类似的流畅方式。这将允许管道继续在pubsub限制内的输出。
欢迎使用其他解决此情况的解决方案。
谢谢, 克里斯托夫·布希耶(Christophe Bouhier)
[1]由于验证错误而无法提交请求:generic :: invalid_argument:Pubsub发布请求的大小限制为10MB,拒绝超过7MB的消息,以免超出byte64请求编码的限制。
答案 0 :(得分:3)
对于数据流上PubpubIO的特殊情况,请注意,数据流将覆盖PubsubIO,并作为其流实现的一部分来处理对Pubsub的读写消息。由于这种替换,我已经看到了您正在讨论的相同错误,它显示在日志中的“ shuffler”而不是“ worker”下。
我通过在PubsubIO.write()步骤之前实现自定义转换来解决了相同的问题。 LimitPayloadSize转换仅检查PubsubMessage中有多少字节,并且仅允许有效载荷小于7 MB的消息通过。
目前还没有流利的API用于转换中的错误处理,尽管已对此进行了讨论。目前,可接受的模式是定义一个具有多个输出集合的转换,然后将失败消息的集合写入其他位置(例如,通过FileIO的GCS)。您可以将其实现为裸DoFn,也可以查看分区:
PCollectionList<PubsubMessage> limitedPayloads = input.apply("Limit payload size", Partition.of(2, new PartitionFn<PubsubMessage>)) {
public int partitionFor(PubsubMessage message, int numPartitions) {
return message.getPayload().size < 7 * 1000 * 1000 ? 0 : 1;
}
}));
limitedPayloads.get(0).apply(PubsubIO.write()...);
limitedPayloads.get(1).apply(FileIO.write()...);