Apache Beam: почему он дважды пишет в Spanner в режиме REPORT_FAILURES? - PullRequest
0 голосов
/ 24 сентября 2018

Я нашел интересные коды операций записи, глядя на SpannerIO, и хочу понять причины.

При записи (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 голосов
/ 24 сентября 2018

Таким образом, вместо того, чтобы записывать каждую мутацию отдельно в базу данных, коннектор SpannerIO.write () пытается записать пакет мутаций в одной транзакции для эффективности.

Если произойдет сбой только одной из этих мутаций в пакете, то произойдет сбой всей транзакции, поэтому в режиме REPORT_FAILURES мутации повторяются по отдельности, чтобы определить, какие мутации являются проблемными ...

...