java.lang.IllegalStateException:无法在数据流2.X中返回默认编码器

时间:2017-12-08 00:34:31

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

我在dataflow 2.1 sdk中有一个简单的管道。从pubsub读取数据然后将DoFn应用于它。

PCollection<MyClass> e = streamData.apply("ToE", ParDo.of(new MyDoFNClass()));

在此管道上获得以下错误:

  

java.lang.IllegalStateException:无法返回ToEvents / ParMultiDo(MyDoFNClass).out0 [PCollection]的默认编码器。更正以下根本原因之一:     没有手动指定编码器;你可以使用.setCoder()来完成。     从CoderRegistry推断编码器失败:无法为com.X.X.model.MyClass提供编码器。

MyDoFn课程如下:

@DefaultCoder(AvroCoder.class)

public class MyClass{

    public long id;
    public HashMap<String,HashSet<String>> a;

    @SerializedName("a")
    public Integer Id;
    @SerializedName("ae")
    public String ae;
}

2 个答案:

答案 0 :(得分:9)

找到解决方案只需将implements Serializable添加到MyClass

@DefaultCoder(AvroCoder.class)

public class MyClass implements Serializable {

public long id;
public HashMap<String,HashSet<String>> a;

@SerializedName("a")
public Integer Id;
@SerializedName("ae")
public String ae;
}

答案 1 :(得分:0)

以下是Beam编程指南中有关编码器的一些文档

Beam SDK对于管道中的每个PCollection都需要一个编码器。在大多数情况下,Beam SDK能够根据其元素类型或生成它的转换自动为PCollection推断一个编码器,但是,在某些情况下,管道作者将需要显式指定编码器,或为他们的自定义类型。

每个管道对象都有一个CoderRegistry对象,该对象将语言类型映射到管道应用于这些类型的默认编码器。您可以自己使用CoderRegistry查找给定类型的默认编码器,或注册给定类型的新默认编码器。

转到下面的链接以查看光束库使用的默认编码器- https://beam.apache.org/documentation/programming-guide/#default-coders-and-the-coderregistry

如果您在pCollections中使用的对象不在默认编码器之内,则可能必须为该对象提供自定义编码器。 例如如果您查看PubsubIO.write()/ PubsubIO.read()方法的实现,则它们使用自定义编码器。例如PubsubMessagePayloadOnlyCoder

假设您正在将字符串转换为Pubsub消息。您可以将此编码器提供给您的pcollection。

PCollection<PubsubMessage> pubsubMessagePCollection = pCollectionTuple.get(accountId);
pubsubMessagePCollection.setCoder(PubsubMessagePayloadOnlyCoder.of());