Java Google云数据流数据存储的读写依赖性问题
我需要的是:能够通过DatastoreIO.v1()在Dataflow(v.1.9.0)中读/写数据存储的依赖版本的正确组合。读/写以及哪些依赖需要在pom中引用 数据流1.9.0的mavenrepo pom中引用的特定于数据流的依赖项:Java Google云数据流数据存储的读写依赖性问题,java,maven,dependencies,google-cloud-datastore,google-cloud-dataflow,Java,Maven,Dependencies,Google Cloud Datastore,Google Cloud Dataflow,我需要的是:能够通过DatastoreIO.v1()在Dataflow(v.1.9.0)中读/写数据存储的依赖版本的正确组合。读/写以及哪些依赖需要在pom中引用 数据流1.9.0的mavenrepo pom中引用的特定于数据流的依赖项: com.google.cloud.dataflow/google-cloud-dataflow-java-sdk-all/1.9.0 com.google.cloud.datastore/datastore-v1-protos/1.0.1 com.google
com.google.cloud.dataflow/google-cloud-dataflow-java-sdk-all/1.9.0
com.google.cloud.datastore/datastore-v1-protos/1.0.1
com.google.cloud.datastore/datastore-v1-proto-client/1.1.0
com.google.protobuf/protobuf-java/3.0.0-beta-1
在写入数据存储时(实际上是在构建实体时),我会遇到以下异常:
// CamelExecutionException (Setup running with Camel-Routes, but for development purposes not in Fuse but as a local CamelRoute in Eclipse)
Caused by: java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.google.datastore.v1.Value.toBuilder(Value.java:749)
at com.google.datastore.v1.Value.newBuilder(Value.java:743)
at xmlsource.dataflow.test.EntityUtil.getStringValue(EntityUtil.java:404)
at xmlsource.dataflow.test.EntityUtil.getArticleEntity(EntityUtil.java:152)
at xmlsource.dataflow.test.parser.ArticleToEntity.processElement(ArticleToEntity.java:21)
at com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:139)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateHelper(ParDo.java:1229)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateSingleHelper(ParDo.java:1098)
at com.google.cloud.dataflow.sdk.transforms.ParDo.access$300(ParDo.java:457)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1084)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1079)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.visitTransform(DirectPipelineRunner.java:858)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:221)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:103)
at com.google.cloud.dataflow.sdk.Pipeline.traverseTopologically(Pipeline.java:260)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.run(DirectPipelineRunner.java:814)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:526)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:96)
at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:181)
at xmlsource.dataflow.test.PipelineParseTest.createAndRun(PipelineParseTest.java:208)
at xmlsource.dataflow.test.PipelineTester.process(PipelineTester.java:11)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
... 8 more
xmlsource.dataflow.test.EntityUtil.getStringValue(EntityUtil.java:404)中引用的行:
当读到大致相同的内容时:
java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3
…
将依赖项更改为时(仅protobuf java的测试版)
在尝试写入时,出现以下异常:
// CamelExecutionException...
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
Location:
com/google/datastore/v1/Value$Builder.mergeGeoPointValue(Lcom/google/type/LatLng;)Lcom/google/datastore/v1/Value$Builder; @76: invokevirtual
Reason:
Type 'com/google/type/LatLng' (current frame, stack[1]) is not assignable to 'com/google/protobuf/GeneratedMessage'
Current Frame:
bci: @76
flags: { }
locals: { 'com/google/datastore/v1/Value$Builder', 'com/google/type/LatLng' }
stack: { 'com/google/protobuf/SingleFieldBuilder', 'com/google/type/LatLng' }
Bytecode:
someBytecode
Stackmap Table:
same_frame(@50)
same_frame(@55)
same_frame(@62)
same_frame(@80)
same_frame(@89)
at com.google.datastore.v1.Value.toBuilder(Value.java:749)
at com.google.datastore.v1.Value.newBuilder(Value.java:743)
at xmlsource.dataflow.test.EntityUtil.getStringValue(EntityUtil.java:404)
at xmlsource.dataflow.test.EntityUtil.getArticleEntity(EntityUtil.java:152)
at xmlsource.dataflow.test.parser.ArticleToEntity.processElement(ArticleToEntity.java:21)
at com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:139)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateHelper(ParDo.java:1229)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateSingleHelper(ParDo.java:1098)
at com.google.cloud.dataflow.sdk.transforms.ParDo.access$300(ParDo.java:457)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1084)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1079)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.visitTransform(DirectPipelineRunner.java:858)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:221)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:103)
at com.google.cloud.dataflow.sdk.Pipeline.traverseTopologically(Pipeline.java:260)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.run(DirectPipelineRunner.java:814)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:526)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:96)
at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:181)
at xmlsource.dataflow.test.PipelineParseTest.createAndRun(PipelineParseTest.java:208)
at xmlsource.dataflow.test.PipelineTester.process(PipelineTester.java:11)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
在这里,异常引用函数mergeopointvalue,而我的代码从不调用任何函数来设置LatLng或GeoPoint值。代码中引用的行再次只是设置字符串值
在读取时,我有同样的异常,同样是在将POJO转换为数据存储实体时
Value.newBuilder().setStringValue("someString").build()
整个查询:
Query query = Query.newBuilder()
.addKind(KindExpression.newBuilder()
.setName("test_article").build())
.setFilter(Filter.newBuilder()
.setPropertyFilter(PropertyFilter.newBuilder()
.setProperty(PropertyReference.newBuilder()
.setName("somePropertyName"))
.setOp(PropertyFilter.Operator.EQUAL)
.setValue(Value.newBuilder()
.setStringValue("someString").build())
.build())
.build())
.build();
将依赖项更改为(datastore-v1-protos/1.3.0):
使用此设置,我可以通过.apply(DatastoreIO.v1().write().withProjectId(“someProjectId”))成功写入数据存储代码>
尝试读取时,查询对象已成功生成,但…:
// CamelExecutionException
Caused by: java.lang.NoSuchMethodError: com.google.datastore.v1.Query$Builder.clone()Lcom/google/protobuf/GeneratedMessage$Builder;
at com.google.cloud.dataflow.sdk.io.datastore.DatastoreV1$Read$ReadFn.processElement(DatastoreV1.java:648)
at com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:139)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateHelper(ParDo.java:1229)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateSingleHelper(ParDo.java:1098)
at com.google.cloud.dataflow.sdk.transforms.ParDo.access$300(ParDo.java:457)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1084)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1079)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.visitTransform(DirectPipelineRunner.java:858)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:221)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:103)
at com.google.cloud.dataflow.sdk.Pipeline.traverseTopologically(Pipeline.java:260)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.run(DirectPipelineRunner.java:814)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:526)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:96)
at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:181)
at xmlsource.dataflow.test.PipelineParseTest.createAndRun(PipelineParseTest.java:208)
at xmlsource.dataflow.test.PipelineTester.process(PipelineTester.java:11)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
... 8 more
我尝试从数据存储中读取的行:
PCollection<Entity> entityCollection = p.apply(
DatastoreIO.v1().read().withNamespace("test_ns_df")
.withProjectId("someProjectId")
.withQuery(query));
PCollection entityCollection=p.apply(
DatastoreIO.v1().read().withNamespace(“test\n\u df”)
.withProjectId(“someProjectId”)
.withQuery(query));
编辑:
当使用来自的依赖项(和父pom)时,我再次得到java.lang.NoClassDefFoundError:com/google/protobuf/GeneratedMessageV3
为查询生成值时
所以我从来没有让阅读发挥作用。。。有没有人遇到过类似的问题并找到了解决方法?还是我需要以不同的方式构建价值观?使用DatastoreHelper.makeValue时也会出现相同的异常。。。工作项目中引用的依赖项也会有很大帮助
我原以为这是一个依赖关系/版本问题,但也许你们中的某个人知道得更清楚。不可能,我是第一个在java.lang.NoSuchMethodError:com.google.datastore.v1.Query$Builder.clone()
上遇到这些问题的人,就像这个刚推出错误版本的家伙一样,但在我这方面,这并没有带来成功
提前感谢发现问题:
由于在同一个项目中有一个预处理,它使用Camel Fuse在Google Storage中存储文件,因此我依赖Google Storage:
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>0.6.0</version>
</dependency>
com.google.cloud
谷歌云存储
0.6.0
在数据流依赖项之前,pom.xml中提到了此依赖项。在切换依赖项的顺序(数据流先于数据存储)并删除所有其他依赖项之后,数据存储就完美地工作了!然后,根据您的操作(例如XMLSource),需要添加一些运行时依赖项请提供帮助?还是没能让阅读发挥作用。从谷歌上看,依赖关系真的像一团乱,但由于v1.9.0是推荐的生产版本,这必须起作用!
// CamelExecutionException
Caused by: java.lang.NoSuchMethodError: com.google.datastore.v1.Query$Builder.clone()Lcom/google/protobuf/GeneratedMessage$Builder;
at com.google.cloud.dataflow.sdk.io.datastore.DatastoreV1$Read$ReadFn.processElement(DatastoreV1.java:648)
at com.google.cloud.dataflow.sdk.util.SimpleDoFnRunner.invokeProcessElement(SimpleDoFnRunner.java:49)
at com.google.cloud.dataflow.sdk.util.DoFnRunnerBase.processElement(DoFnRunnerBase.java:139)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateHelper(ParDo.java:1229)
at com.google.cloud.dataflow.sdk.transforms.ParDo.evaluateSingleHelper(ParDo.java:1098)
at com.google.cloud.dataflow.sdk.transforms.ParDo.access$300(ParDo.java:457)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1084)
at com.google.cloud.dataflow.sdk.transforms.ParDo$1.evaluate(ParDo.java:1079)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.visitTransform(DirectPipelineRunner.java:858)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:221)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformTreeNode.visit(TransformTreeNode.java:217)
at com.google.cloud.dataflow.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:103)
at com.google.cloud.dataflow.sdk.Pipeline.traverseTopologically(Pipeline.java:260)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner$Evaluator.run(DirectPipelineRunner.java:814)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:526)
at com.google.cloud.dataflow.sdk.runners.DirectPipelineRunner.run(DirectPipelineRunner.java:96)
at com.google.cloud.dataflow.sdk.Pipeline.run(Pipeline.java:181)
at xmlsource.dataflow.test.PipelineParseTest.createAndRun(PipelineParseTest.java:208)
at xmlsource.dataflow.test.PipelineTester.process(PipelineTester.java:11)
at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
... 8 more
PCollection<Entity> entityCollection = p.apply(
DatastoreIO.v1().read().withNamespace("test_ns_df")
.withProjectId("someProjectId")
.withQuery(query));
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
<version>0.6.0</version>
</dependency>