Apache Beam:为什么它在REPORT_FAILURES模式下两次写入Spanner?

时间:2018-09-24 12:38:24

标签: google-cloud-platform apache-beam google-cloud-spanner

我在查看SpannerIO时发现了有趣的写操作代码,并想了解原因。

在write(WriteToSpannerFn)和REPORT_FAILURES失败模式下,似乎试图两次写入失败的突变。
我认为这是用于记录每个突变的异常。这是正确的假设吗,有什么解决方法吗?
下面,为简单起见,我删除了几行。

public void processElement(ProcessContext c) {
  Iterable<MutationGroup> mutations = c.element();
  boolean tryIndividual = false;

  try {
    Iterable<Mutation> batch = Iterables.concat(mutations);
    spannerAccessor.getDatabaseClient().writeAtLeastOnce(batch);
  } catch (SpannerException e) {
    if (failureMode == FailureMode.REPORT_FAILURES) {
      tryIndividual = true;
    } else {
      ...
    }
  }
  if (tryIndividual) {
    for (MutationGroup mg : mutations) {
      try {
        spannerAccessor.getDatabaseClient().writeAtLeastOnce(mg);
      } catch (SpannerException e) {
        LOG.warn("Failed to submit the mutation group", e);
        c.output(failedTag, mg);
      }
    }
  }
}

1 个答案:

答案 0 :(得分:2)

因此,不是将每个Mutation单独写入数据库,而是为了提高效率,SpannerIO.write()连接器尝试在单个事务中写入一批Mutations。

如果批处理中只有其中一种突变失败,则整个交易都会失败,因此在REPORT_FAILURES模式下,将分别重试突变以找出哪些突变是有问题的...