在数据流中查询数据存储时无法找到 DEFAULT_INSTANCE

Unable to find DEFAULT_INSTANCE when query datastore in dataflow

我基本上只是按照 word count example 从数据流中的数据存储中提取数据,例如

DatastoreV1.Query.Builder q = DatastoreV1.Query.newBuilder();
    q.addKindBuilder().setName([entity kind]);
    DatastoreV1.Query query = q.build();

    DatastoreIO.Source source = DatastoreIO.source()
            .withDataset([...])
            .withQuery(query)
            .withNamespace([...]);

    PCollection<DatastoreV1.Entity> collection = pipeline.apply(Read.from(source));

但它总是失败:

java.lang.RuntimeException:无法在 com.google.api.services.datastore.DatastoreV1$Query 中找到 DEFAULT_INSTANCE com.google.protobuf.GeneratedMessageLite$SerializedForm.readResolve(GeneratedMessageLite.java:1065)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 ...

目前在互联网上找不到任何似乎相关的解决方案。

有人可以就可能出现的问题提出一个大概的方向吗?

协议缓冲区有一定的限制。除其他外,您必须在 protobuf Java 运行时中 link 与生成代码的 protoc 编译器版本相匹配,并且您可以(通常)拥有只有一个运行时存在。这适用于 Protocol Buffers 的所有用例,并且它们不是特定于数据流的。

Dataflow SDK for Java,版本 1.4.0 及更早版本,取决于 protobuf 版本 2.5 和 links 在使用相应的 [=11= 生成的数据存储客户端库中] 编译器。最简单的解决方案是不覆盖任何 protobuf-javagoogle-api-services-datastore-protobuf 依赖项,让 Dataflow SDK 将它们引入您的项目。

如果你真的因为不相关的原因必须升级到 protobuf 版本 3,你也应该将 google-api-services-datastore-protobuf 升级到版本 v1beta2-rev1-4.0.0,因为那个版本是用相应的 protoc编译器。请注意,这是仅适用于数据存储的 解决方法 -- 我希望其他需要 protobuf 版本 2 的依赖项会中断,除非它们也已升级。

现在,我们正在积极致力于将 Dataflow SDK 升级到 protobuf 版本 3。我希望在下一个次要版本(可能是 1.5.0)中提供此功能。由于任何版本的 Dataflow SDK 一次只能支持一个 protobuf,届时对版本 2 的支持将中断,除非手动回滚一些依赖项。