Serialization Flink序列化错误

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

我正在尝试在Apache Flink Gelly图形上运行标签传播协议。
这是我的密码:

        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;}}`