簡體   English   中英

DataFlow SDK 2.x:如何使用Java序列化從PubSubIO進行消費

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM