Возврат большой структуры данных из рабочего узла Dataflow, застревание в сериализующем графе

У меня есть большой граф ~ 100 тыс. вершин и ~ 1 миллион ребер, которые строятся в функции DoFn. Когда я пытаюсь вывести этот график в DoFn, выполнение функции останавливается на c.output(graph);.

    public static class Prep extends DoFn<TableRow, TableRows> {

        @Override
        public void processElement(ProcessContext c) {
            //Graph creation logic runs very fast, no problem here

            LOG.info("Starting Graph Output");  // can see this in logs
            c.output(graph); //outputs data from DoFn function
            LOG.info("Ending Graph Output"); // never see this logs
    }
  }

Мой класс графа - это просто карта вершин, сериализуемых с помощью AvroCoder.

import org.apache.avro.reflect.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.X.Prep;
import com.google.cloud.dataflow.sdk.coders.AvroCoder;
import com.google.cloud.dataflow.sdk.coders.DefaultCoder;

//Class that creates Graph data structure for custom seg definitions 
@DefaultCoder(AvroCoder.class)
public class MyGraph {
  @Nullable
  public Map<String,GraphVertex> vertexList = new HashMap<String,GraphVertex>(); 
}

Я пробовал сериализацию json-simple, gson, jackson json, и все они слишком долго сериализуют этот график.


person PUG    schedule 23.05.2017    source источник
comment
Графический объект, вероятно, слишком велик, чтобы его можно было закодировать и передать как элемент. Рассматривали ли вы другие механизмы, такие как создание бокового ввода с несколькими значениями карты (с ключом по вершине)? Это позволит вам иметь PCollection<Key, Value> (обрабатывается параллельно)? В качестве альтернативы, поскольку логика создания графа работает очень быстро, просто запускайте эту логику для каждого рабочего, а не пытаетесь сериализовать весь граф?   -  person Ben Chambers    schedule 23.05.2017
comment
Я запускаю логику создания графа на каждом воркере, она отлично работает. Спасибо!   -  person PUG    schedule 05.06.2017
comment
@BenChambers, вы можете добавить этот комментарий в качестве ответа   -  person Pablo    schedule 15.08.2017


Ответы (1)


Графический объект, вероятно, слишком велик, чтобы его можно было закодировать и передать как элемент. Вам следует изучить другие механизмы передачи графа рабочим процессам. Например, создание бокового ввода с несколькими значениями карты (с ключом по вершине). Это позволит вам иметь PCollection (обрабатывается параллельно).

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

person Ben Chambers    schedule 15.08.2017