Spark: как статическая переменная java работает с несколькими партитоинами

#java #apache-spark #static #mapreduce #rdd

Вопрос:

У меня есть класс Person, который имеет статическую переменную int totalCounter и идентификатор переменной экземпляра int. Всякий раз, когда создается экземпляр нового человека, у него должен быть новый уникальный идентификатор для каждой JVM.

 public class Person {
    public static int totalCounter = 1;
    public int id = 1;
    public Person() {
        synchronized (Person.class) {
            id = totalCounter;
            totalCounter  ;
        }
    }
}
 

Я ожидал, что все экземпляры person будут иметь последовательный и уникальный идентификатор, начиная с 1,2,3 до n

     final JavaPairRDD<Integer, Tuple2<Integer, Person>> entityAddAttributes = baseEntity.mapPartitionsToPair(entities -> {
                    return Iterators.transform(entities, entity -> {
                        Person person = new Person();
                        return new Tuple2<>(entity._1, new Tuple2<>(entity._2, person));
                    });
                });
    final JavaPairRDD<UUID, String> formattedRecords = entityAddAttributes.mapPartitionsToPair(input -> Iterators.transform(input,
                        person -> new Tuple2<>(UUID.randomUUID(), String.valueOf(person._2._2.id)));
...
saveAsTextFile();
 

Я отправил задание spark только с 1 исполнителем и 200 разделами, и идентификатор фактически начинается с 3151 вместо 1. Если я изменю разделы на 1, идентификатор будет начинаться с 1. может ли кто-нибудь помочь объяснить? тх!