通过将PubsubIO.Read映射到PubsubIO.Read /PubsubUnboundedSource来更新作业,为'步骤的编码器或类型已更改'兼容性检查失败?

时间:2018-04-16 18:12:28

标签: google-cloud-platform google-cloud-dataflow google-cloud-pubsub

我正在将当前运行的google云数据流作业从v1.8 Java Dataflow SDK更新为v2.4 Java Dataflow SDK,并根据1.x - >的发行说明更新该过程的一部分。 2.x move(https://cloud.google.com/dataflow/release-notes/release-notes-java-2#changed_pubsubio_api)我正在更改PubsubIO.Read函数,如下所示:

 PCollection<String> streamData =
      pipeline
        .apply(PubsubIO.Read
                .timestampLabel(PUBSUB_TIMESTAMP_LABEL_KEY)
                .topic(options.getPubsubTopic()));

改为PubsubIO.readStrings(),如下所示:

PCollection<String> streamData =
      pipeline
        .apply(PubsubIO.readStrings()
                .withTimestampAttribute(PUBSUB_TIMESTAMP_LABEL_KEY)
                .fromTopic(options.getPubsubTopic()));

然后,我需要使用变换映射命令行参数,如此

'--transformNameMapping={\"PubsubIO.Read\": \"PubsubIO.Read/PubsubUnboundedSource\"}'

但是我得到了相应的检查失败:

  

工作流程失败。原因:新作业与之不兼容   2016-12-13_15_23_40 -....。原来的工作还没有中止   编码器或类型为步骤PubsubIO.Read/PubsubUnboundedSource有   改变。

这让我感到困惑,因为看起来旧代码正在处理字符串并且新代码仍在使用字符串,任何人都可以帮助我理解此错误消息告诉我的内容吗?有没有办法让我添加一个日志声明,告诉我我正在使用的编码器,以便我可以使用旧代码和新代码运行我的测试,看看有什么区别?

1 个答案:

答案 0 :(得分:0)

我认为问题在于您正在尝试更新现有作业。由于2.x版本引入了重大更改,因此无法更新流式作业。用户从documentation page顶部的1.x升级时会发出警告:

  
      
  • 更新不兼容性:Dataflow SDK 2.x for Java与Dataflow 1.x更新不兼容。使用Dataflow流式传输作业   1.x SDK无法更新为使用Dataflow 2.x SDK。 Dataflow 2.x管道只能在以SDK开头的版本中更新   版本2.0.0。
  •   

关于编码器的更改,BEAM-1415有一些解释:

  

不再有办法读/写通用类型T.相反,   有PubsubIO. {read,write} {Strings,Protos,PubsubMessages}。   字符串和protos是一种非常常见的情况,因此它们有短缺。对于   其他一切,使用PubsubMessage并自己解析。的情况下   阅读,您可以使用或不使用属性来阅读它们。这摆脱了   难以使用Coder解码消息的有效载荷(禁止使用   样式指南),因为PubsubMessage很容易编码   样式指南也要求明确地使用它作为   输入/返回类型的转换

在测试中,您可以使用CoderRegistry.getCoder()中的let params = (new URL(document.location)).searchParams; let values = params.getAll("param-name");