从数据流工作节点返回大型数据结构,卡在序列化图中
Returning a large data structure from Dataflow worker node, getting stuck in serializing graph
我在 DoFn
函数中构建了约 10 万个顶点和约 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
}
}
我的图表 class 只是一个用 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 序列化所有这些都需要很长时间来序列化这个图。
图形对象可能太大而无法作为元素进行编码和传递。您应该探索其他机制来将图表提供给工作人员。例如,创建一个多地图值侧输入(由顶点键控)。这将允许您拥有一个 PCollection(并行处理)。
或者,由于图形创建逻辑 运行 非常快 运行 每个 worker 上的逻辑,而不是尝试序列化整个图形。
我在 DoFn
函数中构建了约 10 万个顶点和约 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
}
}
我的图表 class 只是一个用 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 序列化所有这些都需要很长时间来序列化这个图。
图形对象可能太大而无法作为元素进行编码和传递。您应该探索其他机制来将图表提供给工作人员。例如,创建一个多地图值侧输入(由顶点键控)。这将允许您拥有一个 PCollection(并行处理)。
或者,由于图形创建逻辑 运行 非常快 运行 每个 worker 上的逻辑,而不是尝试序列化整个图形。