PubsubIO,味精超过最大大小,如何执行错误处理

时间:2019-01-15 11:03:00

标签: apache-beam google-cloud-pubsub dataflow

我们正在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请求编码的限制。

1 个答案:

答案 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()...);