在数据流中查询数据存储时无法找到 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-java
和 google-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 的支持将中断,除非手动回滚一些依赖项。
我基本上只是按照 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-java
和 google-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 的支持将中断,除非手动回滚一些依赖项。