Diese Frage ist eine Folge zu this one. Ich versuche, Apache Beam zu verwenden, um Daten aus einer Google-Schlüssel-Tabelle zu lesen (und dann einige Datenverarbeitung). Ich schrieb das folgende Mindest Beispiel des Java-SDK:Fehler bei der Verwendung von SpannerIO in Apache-Balken
package com.google.cloud.dataflow.examples;
import java.io.IOException;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.io.gcp.spanner.SpannerIO;
import org.apache.beam.sdk.options.PipelineOptions;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.values.PCollection;
import com.google.cloud.spanner.Struct;
public class backup {
public static void main(String[] args) throws IOException {
PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);
PCollection<Struct> rows = p.apply(
SpannerIO.read()
.withInstanceId("my_instance")
.withDatabaseId("my_db")
.withQuery("SELECT t.table_name FROM information_schema.tables AS t")
);
PipelineResult result = p.run();
try {
result.waitUntilFinish();
} catch (Exception exc) {
result.cancel();
}
}
}
Wenn ich versuche, den Code mit dem DirectRunner auszuführen, erhalte ich die folgende Fehlermeldung:
org.apache.beam.runners.direct .repackaged.com.google.common.util.concurrent.UncheckedExecutionException:
org.apache.beam.sdk.util.UserCodeException: java.lang.NoClassDefFoundError: Could not initialize class com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
[...] Caused by: org.apache.beam.sdk.util.UserCodeException: java.lang.NoClassDefFoundError: Could not initialize class com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
[...] Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.google.cloud.spanner.spi.v1.SpannerErrorInterceptor
Oder mit den DataflowRunner:
org.apache.beam.runners.direct.repackaged.com.google.common.util.concurrent.UncheckedExecutionException: org.apache.beam.sdk.util.UserCodeException: java.lang.NoSuchFieldError: internal_static_google_rpc_LocalizedMessage_fieldAccessorTable
[...] Caused by: org.apache.beam.sdk.util.UserCodeException: java.lang.NoSuchFieldError: internal_static_google_rpc_LocalizedMessage_fieldAccessorTable
[...] Caused by: java.lang.NoSuchFieldError: internal_static_google_rpc_LocalizedMessage_fieldAccessorTable
In beiden Fällen ist die Fehlermeldung eher kryptisch, und ich konnte keine klaren Ideen finden, was den Fehler bei einer Google-Suche verursacht. Ich konnte auch keine Beispielskripte mit dem SpannerIO-Modul finden.
Ist dieser Fehler auf einen offensichtlichen Fehler in meinem Code zurückzuführen, oder liegt es an einer fehlerhaften Installation der Google Cloud-Tools?
Argh, Sie treffen wahrscheinlich Abhängigkeitskonflikt https://issues.apache.org/jira/browse/BEAM-2837. Es wurde behoben, aber wir müssen auf neue Version des Balkens warten. Sie können Beam Binaries selbst aus der Quelle erstellen oder verwenden Sie diesen Trick in Ihrer pom.xml https://gist.github.com/mairbek/0c770ff7b591e3db58936b0b9294215a –
Oh. Vielen Dank ! Ich schätze, ich probiere den Fehler aus. –