Ein DoFn
in unserem Datenfluss Pipelines einen Typen mit einem enthält Random
Feld zu einem SecureRandom
Beispiel zeigt, und das Feld nicht deserialisieren, wenn Ausführen im Dataflow-Dienst unter Verwendung von DataflowPipelineRunner
. (Stack-Trace unten)„ClassNotFoundException: sun.security.provider.Sun“ beim Ausführen von Google Cloud Dataflow-Pipeline in Google App Engine
Wir schaffen die SecureRandom
seinen Standard Ctor verwenden, die eine Instanz zur Hand zurück kommt vor, dass sun.security.provider.Sun
als java.security.Provider
(siehe SecureRandom#getProvider
) verwendet. SecureRandom
erweitert Random
, die serialisierbar ist.
Der Dataflow-Dienst erstickt beim Versuch, diese Klasse zu deserialisieren, da er sun.security.provider.Sun
nicht erstellen kann.
Bei genauerer Betrachtung des Stack-Trace, ich sehe, dass Deserialisierung durch com.google.apphosting.runtime.security.UserClassLoader
passiert, und jetzt ist meine Theorie, dass diese nicht Classloader Laden von sun.*
Klassen erlaubt es, oder zumindest diese besondere sun.*
Klasse.
java.lang.IllegalArgumentException: unable to deserialize [email protected]
at com.google.cloud.dataflow.sdk.util.SerializableUtils.deserializeFromByteArray(SerializableUtils.java:73)
at com.google.cloud.dataflow.sdk.util.SerializableUtils.clone(SerializableUtils.java:88)
at com.google.cloud.dataflow.sdk.transforms.ParDo$Bound.<init>(ParDo.java:683)
[...]
Caused by: java.lang.ClassNotFoundException: sun.security.provider.Sun
at com.google.apphosting.runtime.security.UserClassLoader.loadClass(UserClassLoader.java:442)
at java.lang.ClassLoader.loadClass(ClassLoader.java:375)
at java.lang.Class.forName0(Native Method)
[...]