In case anyone else runs into this, here's what I discovered: For whatever reason, the classloader used by org.apache.flink.api.java.typeutils.TypeExtractor did not have access to the classes in my udf.jar file. However, if I changed my KeyedDeserializationSchema implementation to use standard Avro classes (i.e. GenericRecord rather than a SpecificRecord), the classloader didn't require any of the generated Avro classes in udf.jar during the ExecutionGraph stage.
At execution time, my deserializer forced the returned GenericRecord into the my custom Avro SpecificRecord class, which was available to the classloader at this point. -- Sent from: http://apache-flink-user-mailing-list-archive.2336050.n4.nabble.com/