DoFn
がSecureRandom
インスタンスを指しRandom
フィールドを持つタイプが含まれ、そのフィールドがときデシリアライズに失敗しますDataflowPipelineRunner
を使用してデータフローサービスで実行します。 (以下のスタックトレース)「にClassNotFoundException:sun.security.provider.Sun」私たちのデータフローパイプラインでのGoogle App EngineのでGoogleクラウドデータフローパイプラインを実行している
我々はSecureRandom
としてsun.security.provider.Sun
を使用してインスタンスをバック手にたまたまそのデフォルトctorのを、使用して作成してjava.security.Provider
(SecureRandom#getProvider
を参照してください)。 SecureRandom
は、Random
を継承します。これはシリアル化可能です。
sun.security.provider.Sun
を作成できないため、このクラスを逆シリアル化しようとすると、データフローサービスが異常終了します。近いスタックトレースで探し
は、私は、逆シリアル化がcom.google.apphosting.runtime.security.UserClassLoader
を通じて起こることがわかり、そして今、私の理論は、このクラスローダがsun.*
クラスのロード、または少なくともこの特定のsun.*
クラスを許可していないということです。
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)
[...]