1

必要なもの:DatastoreIO.v1()を使用してデータフロー(v。1.9.0)でデータストアを読み書きできるようにするための依存関係の正しい組み合わせ.read/writeと、どの依存関係をpomで参照する必要がありますか?データフロー1.9.0用mavenrepoからポンポンで参照Google Cloud Dataflow DatastoreIO読み込みと書き込みの依存関係の問題

データフロー固有の依存関係:

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)の参照先行:

Value.newBuilder().setStringValue(value).build(); 

そして、多かれ少なかれ同じを読ん:

java.lang.NoClassDefFoundError: com/google/protobuf/GeneratedMessageV3 
… 

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 

と書き込もうと(いるProtobuf-javaのための唯一のないベータ版)への依存関係を変更する場合は、次の例外が発生します:私のコードは緯度経度またはGeoPoint値を設定するために、任意の関数を呼び出すことはありませんしながら、

// 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) 

ここでの例外は、関数mergeGeoPointValueを参照します。

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(); 
:データストアエンティティ

Value.newBuilder().setStringValue("someString").build() 

に全体のクエリをPOJOに変換する際に、再び、私は同じ例外を持って読んだときに私のコードで参照行が再びちょうど文字列値

を設定し、依存関係を変更

(データストア-V1-PROTOS/1.3.0):

com.google.cloud.datastore/datastore-v1-protos/1.3.0 
com.google.cloud.datastore/datastore-v1-proto-client/1.1.0 
com.google.protobuf/protobuf-java/3.0.0 (or 3.2.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 

私はデータストアから読み取るしようと行を:この設定で私は正常.apply(DatastoreIO.v1().write().withProjectId("someProjectId"));

読み取ろうとすると、クエリオブジェクトが正常に構築されている経由でデータストアへの書き込みが、...することができます:

PCollection<Entity> entityCollection = p.apply(
    DatastoreIO.v1().read().withNamespace("test_ns_df") 
    .withProjectId("someProjectId") 
    .withQuery(query)); 

EDIT: GitHubDataflowExampleからの依存関係(親-POM)を使用している場合、私は再びjava.lang.NoClassDefFoundErrorの取得:番目を構築する際に、COM /グーグル/いるProtobuf/GeneratedMessageV3 をeクエリの値....

だから私は読んだことはありません...誰も同じような問題を経験し、これを解決する方法を見つけましたか?あるいは、値を違うものにする必要がありますか? DatastoreHelper.makeValueを使用しているときにも同じ例外が発生します...作業中のプロジェクトで参照されている依存関係は、大いに役立ちます!

私はこれが依存性/バージョンの問題だと思っていましたが、多分あなたの誰かがよく知っています。私はこの人のような問題を抱えている最初の人ですNoSuchMethodError in DatastoreWordCount exampleちょうど間違ったバージョンを引っ張った人ですが、私の最終的にはこれは成功には至りません。事前

+0

助けてください。それでも読書がうまく行かなかった。 googleingから、依存関係は本当に混乱のような縫い目ですが、v1.9.0は​​プロダクション用に推奨されるバージョンなので、これはうまくいきます! – user2122552

答えて

0

おかげで問題が見つかりました:原因キャメル・ヒューズは、Googleのストレージにファイルを保存して実行している同じプロジェクトでの前処理があるという事実に

を、私はgoogle-に依存していました記憶:

<dependency> 
    <groupId>com.google.cloud</groupId> 
    <artifactId>google-cloud-storage</artifactId> 
    <version>0.6.0</version> 
</dependency> 

この依存関係は、dataflow-dependencyの前にpom.xmlに記述されています。依存関係の順序(データストアの前のデータフロー)を変更し、他のすべての依存関係を削除した後、DatastoreIOは完全に機能します。次に、操作(XMLSourceなど)に応じて、ランタイム依存性を追加する必要があります。

関連する問題