Java 从Dataflow worker节点返回大型数据结构,陷入序列化图形

Java 从Dataflow worker节点返回大型数据结构,陷入序列化图形,java,serialization,avro,google-cloud-dataflow,apache-beam,Java,Serialization,Avro,Google Cloud Dataflow,Apache Beam,我在DoFn函数中构造了约100k个顶点和约100万条边的大型图。当我试图在DoFn中输出该图时,函数执行被卡在c.output(图) 公共静态类Prep扩展了DoFn{ @凌驾 公共void processElement(ProcessContext c){ //图形创建逻辑运行得非常快,这里没有问题 LOG.info(“启动图形输出”);//可以在日志中看到这一点 c、 输出(图形);//从DoFn函数输出数据 LOG.info(“结束图形输出”);//从未看到此日志 } } 我的grap

我在
DoFn
函数中构造了约100k个顶点和约100万条边的大型图。当我试图在DoFn中输出该图时,函数执行被卡在
c.output(图)

公共静态类Prep扩展了DoFn{
@凌驾
公共void processElement(ProcessContext c){
//图形创建逻辑运行得非常快,这里没有问题
LOG.info(“启动图形输出”);//可以在日志中看到这一点
c、 输出(图形);//从DoFn函数输出数据
LOG.info(“结束图形输出”);//从未看到此日志
}
}
我的graph类只是一个用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>(); 
}
import org.apache.avro.reflect.Nullable;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.X.Prep;
导入com.google.cloud.dataflow.sdk.coders.AvroCoder;
导入com.google.cloud.dataflow.sdk.coders.DefaultCoder;
//类,该类为自定义seg定义创建图形数据结构
@DefaultCoder(AvroCoder.class)
公共类MyGraph{
@可空
公共映射顶点列表=新建HashMap();
}

我尝试过json simple、gson和jackson json序列化,所有这些方法都需要很长时间来序列化此图。

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


或者,由于图形创建逻辑运行得非常快,因此只需在每个辅助对象上运行该逻辑,而不是尝试序列化整个图形。

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


或者,由于图形创建逻辑运行得非常快,因此只需在每个辅助对象上运行该逻辑,而不是尝试序列化整个图形。

图形对象可能太大,无法作为元素进行编码和传递。您是否考虑过其他机制,例如创建多贴图值的边输入(由顶点设置关键帧)?这将允许您有一个
PCollection
(并行处理)?或者,由于图形创建逻辑运行得非常快,所以只需在每个工作程序上运行该逻辑,而不是尝试序列化整个图形?我在每个工作程序上运行图形创建逻辑,它工作得非常好。谢谢@BenChambers您可能希望添加此注释作为答案图形对象可能太大,无法作为元素进行编码和传递。您是否考虑过其他机制,例如创建多贴图值的边输入(由顶点设置关键帧)?这将允许您有一个
PCollection
(并行处理)?或者,由于图形创建逻辑运行得非常快,所以只需在每个工作程序上运行该逻辑,而不是尝试序列化整个图形?我在每个工作程序上运行图形创建逻辑,它工作得非常好。谢谢@你可能想把这句话作为回答
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>(); 
}