[英]DataFlow SDK 2.x: how to consume from PubSubIO using java serialization
我是Dataflow的新手,並且將以下代碼段從Java SDK 1.9.0遷移到2.3.0:
//SDK 1.9.0
PCollection<MyType> pubsub = p.apply(
PubsubIO.Read.named("Read from Pubsub")
.topic(myTopic)
.withCoder(SerializableCoder.of(MyType.class))
.timestampLabel("myDate"));
我將其轉換為
//SDK 2.3.0
PCollection<MyType> pubsub = p.apply("Read from Pubsub",
PubsubIO.<MyType>read () // <-- COMPILE ERROR here, private method
.fromTopic(myTopic)
.withTimestampAttribute ("myDate"))
.setCoder(SerializableCoder.of(MyType.class));
但從Java SDK 2.3.0開始, PubsubIO.read()
方法是私有的。
因此,我需要使用帶MyType
序列化實例的消息,但是PubsubIO
公開的方法似乎僅適用於文本消息,avro,protobuf等。
如何從PubsubIO主題中讀取消息包含序列化Java對象的主題?
更新:
我可以這樣調整(尚未嘗試)...
PCollection<MyType> pubsub = p.apply("Read from Pubsub",
PubsubIO.readMessagesWithAttributes ()
.fromTopic(myTopic)
.withTimestampAttribute ("myDate"))
.apply (MapElements.via(new SimpleFunction<PubsubMessage, MyType> () {
@Override
public MyType apply (final PubsubMessage message) {
final byte[] payload = message.getPayload ();
try {
try (final ObjectInputStream stream = new ObjectInputStream (new ByteArrayInputStream (payload))) {
return (MyType) stream.readObject ();
}
} catch (IOException e) {
throw new RuntimeException (e);
} catch (ClassNotFoundException e) {
throw new RuntimeException (e);
}
}
}))
您更新的代碼看起來應該可以正常工作。 請注意,如果您不使用屬性映射,則還存在PubsubIO.readPubsubMessagesWithoutAttributes()
。
PR#2634中刪除了先前的功能,將其替換為用於最常見的編碼類型(原型,avro,字符串)的專用方法。
我懷疑由於依賴Java序列化的內在危險,沒有保留通過SerializableCoder
進行的任意對象解碼。 請參閱SerializableCoder
javadoc或相關問題Java序列化-優點和缺點,使用還是避免? 。 但是,如果您覺得缺少API,那么Beam SDK是開源的,社區歡迎您的貢獻 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.