从Dataflow工作节点返回大型数据结构,卡在序列化图中

时间:2017-05-23 18:31:27

标签: java serialization avro google-cloud-dataflow apache-beam

我在DoFn函数中构造了大图~100k顶点和~100万个边。当我尝试在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序列化所有这些都需要很长时间来序列化这个图。

1 个答案:

答案 0 :(得分:0)

图形对象可能太大而无法编码并作为元素传递。您应该探索将图形提供给工人的其他机制。例如,创建一个多地图值侧输入(由顶点键控)。这将允许您进行PCollection(并行处理)。

或者,由于图形创建逻辑运行速度非常快,只需在每个工作程序上运行该逻辑,而不是尝试序列化整个图形。