2016-03-21 2 views
1

Ich versuche, einen Datenflussjob über eine (bereits vorhandene) AppEngine-Anwendung zu starten. Der DataFlow-Job liest Daten, die von der in DataStore gespeicherten GAE-Anwendung generiert wurden, und schreibt die verarbeiteten Daten in BigQuery. Ich erhalte den folgenden Fehler.Dataflow-Jobs mit App Engine-Fehlern mit einer SecurityException auf addShutdownHook für BigQueryTableInserter starten

java.lang.SecurityException: Google App Engine does not support Runtime.addShutdownHook 
at com.google.appengine.runtime.Request.process-a010d936cef53bc8(Request.java) 
at java.lang.Runtime.addShutdownHook(Runtime.java:46) 
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.addShutdownHook(MoreExecutors.java:232) 
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.addDelayedShutdownHook(MoreExecutors.java:204) 
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors$Application.getExitingExecutorService(MoreExecutors.java:188) 
at com.google.cloud.dataflow.sdk.repackaged.com.google.common.util.concurrent.MoreExecutors.getExitingExecutorService(MoreExecutors.java:89) 
at com.google.cloud.dataflow.sdk.util.BigQueryTableInserter.<clinit>(BigQueryTableInserter.java:79) 
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.verifyTableEmpty(BigQueryIO.java:886) 
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.apply(BigQueryIO.java:942) 
at com.google.cloud.dataflow.sdk.io.BigQueryIO$Write$Bound.apply(BigQueryIO.java:724) 
at com.google.cloud.dataflow.sdk.runners.PipelineRunner.apply(PipelineRunner.java:74) 
at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.apply(DataflowPipelineRunner.java:327) 
at com.google.cloud.dataflow.sdk.Pipeline.applyInternal(Pipeline.java:367) 
at com.google.cloud.dataflow.sdk.Pipeline.applyTransform(Pipeline.java:274) 
at com.google.cloud.dataflow.sdk.values.PCollection.apply(PCollection.java:161) 

Gibt es eine Möglichkeit in Datenfluß zu einem BigQuery Tabelle schreiben zu können, wenn sie über GAE gekickt werden? Ich setze den Läufer auf DataflowPipelineRunner, also sollte es nicht versuchen, es auf der GAE-Instanz selbst auszuführen. (Gibt es eine Möglichkeit, dies zu überprüfen?)

Antwort

1

DataflowPipelineRunner versucht, Ihre Pipeline zu validieren, bevor der Auftrag an den Google Cloud Dataflow-Dienst gesendet wird. In diesem Stack-Trace versuchen wir zu überprüfen, dass die BigQuery-Zieltabelle leer ist.

Während dieses Vorgangs initialisieren wir eine ExecutorService, die nicht in Google App Engine ausgeführt werden darf. Dies ist bedauerlich, da dies in diesem Szenario nicht unbedingt erforderlich ist. Der Fix für dieses wird als BEAM-142 verfolgt, bitte überprüfen Sie dort für irgendwelche Updates.

Eine Problemumgehung wäre das Deaktivieren der Validierung in der App Engine-Umgebung. Verwenden Sie BigQueryIO.Write.withoutValidation() in Ihrer BigQuery-Senke.

+0

BEAM-142 wurde bereits für eine Weile aufgelöst, aber es scheint mir, dass es nicht zu Dataflow SDK portiert wurde (nicht einmal zum 'Master'-Zweig). Weißt du ob/wann das passieren wird? –

+0

Hi Helder, leider unterstützt Dataflow den AppEngine-Standard nicht mehr - aus Gründen der kritischen Stabilität verlassen wir uns jetzt auf irgendeinen JNI-Code. Wie Mete betont, können Dataflow-Jobs von App Engine Flex gesendet werden. –

+0

@Dan Es ist ein bisschen bedauerlich, dass Google uns dazu drängt, eine Technologie zu verwenden, die noch ohne SLA (AppEngine Flex) funktioniert, während wir dies in der Produktion betreiben und SLAs erfüllen müssen. Danke trotzdem für das Update. –

1

Sie können stattdessen App Engine Flexible Environment ausprobieren, die hinsichtlich der zulässigen JRE-Klassen nicht so restriktiv wie App Engine Standard ist.

Verwandte Themen