Я читаю статью о точной однократной обработке, реализованной некоторыми источниками и приемниками потока данных, и у меня возникают проблемы с пониманием примера с приемником BigQuery.Из статьи
Генерация случайного UUID является недетерминированной операцией, поэтому мы должны добавить перестановку , прежде чем вставить ее в BigQuery .После этого при любых повторных попытках Cloud Dataflow всегда будет использоваться тот же UUID, который был перетасован.Повторные попытки вставки в BigQuery всегда будут иметь одинаковый идентификатор вставки, поэтому BigQuery может их фильтровать
// Apply a unique identifier to each record
c
.apply(new DoFn<> {
@ProcessElement
public void processElement(ProcessContext context) {
String uniqueId = UUID.randomUUID().toString();
context.output(KV.of(ThreadLocalRandom.current().nextInt(0, 50),
new RecordWithId(context.element(), uniqueId)));
}
})
// Reshuffle the data so that the applied identifiers are stable and will not change.
.apply(Reshuffle.of<Integer, RecordWithId>of())
// Stream records into BigQuery with unique ids for deduplication.
.apply(ParDo.of(new DoFn<..> {
@ProcessElement
public void processElement(ProcessContext context) {
insertIntoBigQuery(context.element().record(), context.element.id());
}
});
Что означает rehuffle и как он может предотвратить генерациюдругой UUID для той же вставки при последующих попытках?