Serialization Flink序列化错误
我正在尝试在Apache Flink Gelly图形上运行标签传播协议。Serialization Flink序列化错误,serialization,apache-flink,gelly,Serialization,Apache Flink,Gelly,我正在尝试在Apache Flink Gelly图形上运行标签传播协议。 这是我的密码: Graph<String, Long, String> ugraph = Graph.fromDataSet(vertex, edgeSet, env).getUndirected(); DataSet<Tuple2<String, Long>> idsWithInitialLabels = DataSetUtils
这是我的密码:
Graph<String, Long, String> ugraph = Graph.fromDataSet(vertex, edgeSet, env).getUndirected();
DataSet<Tuple2<String, Long>> idsWithInitialLabels = DataSetUtils
.zipWithUniqueId(graph.getVertexIds())
.map(new MapFunction<Tuple2<Long, String>, Tuple2<String, Long>>() {
public Tuple2<String, Long> map(Tuple2<Long, String> tuple2) throws Exception {
return new Tuple2<String, Long>(tuple2.f1, tuple2.f0);
}
});
DataSet<Vertex<String, Long>> verticesWithCommunity = graph.joinWithVertices(idsWithInitialLabels,
new VertexJoinFunction<Long, Long>() {
public Long vertexJoin(Long vertexValue, Long inputValue) {
return inputValue;
}})
.run(new LabelPropagation<String, Long, String>(10));
Graph ugraph=Graph.fromDataSet(顶点、边集、环境).getUndirected();
DataSet idsWithInitialLabels=DataSetUtils
.zipWithUniqueId(graph.getVertexID())
.map(新的映射函数(){
公共Tuple2映射(Tuple2 Tuple2)引发异常{
返回新的Tuple2(Tuple2.f1,Tuple2.f0);
}
});
DataSet verticesWithCommunity=graph.joinWithVertices(idsWithInitialLabels,
新的VertexJoinFunction(){
公共长顶点连接(长顶点值、长输入值){
返回输入值;
}})
.运行(新标签传播(10));
我收到以下错误消息:
org.apache.flink.api.common.invalidProgrameException:对象org.apache.flink.graph.graph$ApplyCoGroupToVertexValues@4dde0543不可序列化
位于org.apache.flink.api.java.ClosureCleaner.ensureSerializable(ClosureCleaner.java:99)
位于org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:61)
位于org.apache.flink.api.java.DataSet.clean(DataSet.java:186)
位于org.apache.flink.api.java.operators.CoGroupOperator$CoGroupOperatorSets$CoGroupOperatorSets预测$CoGroupOperatorWithoutFunction.with(CoGroupOperator.java:619)
位于org.apache.flink.graph.graph.joinWithVertexts(graph.java:587)
位于tu.master.ConceptDetection.TextProcessor.clustering(TextProcessor.java:405)
位于tu.master.ConceptDetection.TextProcessor$4.actionPerformed(TextProcessor.java:210)
谢谢您的帮助:)我猜包含图形代码的类不是可序列化的。Java中的匿名类实际上是非静态的内部类,这意味着它们引用了包含类的
this
(请参阅)。如果包含的类不可序列化,此
引用将不会序列化,匿名类也不会序列化
这就解释了为什么切换到lambda表达式会使其序列化。Lambda表达式不是匿名类,因此它们不会自动捕获隐式此
引用
它没有解释为什么将
MapFunction
声明为匿名类仍然有效。如果你还有这个代码,@Nesrine,我会很好奇整个类是什么样子的。我猜包含图形代码的类是不可序列化的。Java中的匿名类实际上是非静态的内部类,这意味着它们引用了包含类的this
(请参阅)。如果包含的类不可序列化,此
引用将不会序列化,匿名类也不会序列化
这就解释了为什么切换到lambda表达式会使其序列化。Lambda表达式不是匿名类,因此它们不会自动捕获隐式此
引用
它没有解释为什么将
MapFunction
声明为匿名类仍然有效。如果你还有这个代码,@Nesrine,我会很好奇整个班级是什么样子的。嗨,Nesrine,我试过重现你的问题,但我做不到。您使用的是哪种Flink版本?还有一个提示:您正在创建图形,然后使用唯一ID压缩顶点,并与原始顶点集合并。通过在创建图形之前压缩顶点,然后将初始化的顶点集用作fromDataSet(…)
的参数,可以避免连接。H Vasia,感谢您的回复。通过使用lambda表达式而不是:`new VertexJoinFunction(){public Long vertexJoin(Long vertexValue,Long inputValue){return inputValue;}}}`Hi Nesrine,我尝试重现您的问题,但无法解决。您使用的是哪种Flink版本?还有一个提示:您正在创建图形,然后使用唯一ID压缩顶点,并与原始顶点集合并。通过在创建图形之前压缩顶点,然后将初始化的顶点集用作fromDataSet(…)
的参数,可以避免连接。H Vasia,感谢您的回复。通过使用lambda表达式而不是:`new VertexJoinFunction(){public Long vertexJoin(Long vertexValue,Long inputValue){return inputValue;}}`