Переменная Beam DoFn stati c, используемая в JVM - PullRequest
1 голос
/ 10 апреля 2020

Итак, я пытаюсь выяснить поведение переменных состояния c в Beam DoFn, распределяется ли оно между потоками (внутри одной и той же JVM)?

В основном пытаюсь понять следующее из Руководство по программированию:

4.3.2. Совместимость с потоками
… Обратите внимание, что члены stati c в вашем функциональном объекте не передаются рабочим экземплярам и что несколько экземпляров вашей функции могут быть доступны из разных потоков.

https://beam.apache.org/documentation/programming-guide/#requirements -for-write-user-code-for-beam-transforms

Похоже, что следующий «счетчик» объекта stati c был инициализирован, сериализован и применен в worker (Flink engine), соответствует ли он приведенному выше выражению?

Если рабочие потоки попадают в разные процессы / JVM, очевидно, не будут совместно использоваться. Но в случае падения на ту же JVM будет ли «счетчик» разделен?

public class myTransform extends DoFn<KV<String >,String> implements Serializable {
    private static AtomicLong counter = new AtomicLong(0);
         ...
         @ProcessElement
         public void processElement(ProcessContext c) {
             ...
             counter.incrementAndGet();
         }
}

спасибо

1 Ответ

0 голосов
/ 10 апреля 2020

Я думаю, что часть инициализации относится, например, к установке некоторого значения в конструкторе DoFn или к чему-то еще. Ваш код будет инициализирован, так как Worker должен загрузить myTransform class.

Если они работают в одной и той же JVM, то да, это будет общим. Люди Beam пытались донести, что в любом случае вы не должны основывать logi c, и параллельный экземпляр оператора может выполняться на любом узле.

...