У меня есть приложение apache-beam, которое запускает конвейер как локально с прямым бегуном, так и в облаке Google с помощью бегуна потока данных. Он работает локально, но не работает с обработчиком потока данных Google.
Вот следы ошибок:
Это указывает на
"... невозможно десериализовать сериализованный DoFnInfo"
а также
"... java.lang.ClassNotFoundException: Header_H"
Я подозреваю, что это как-то связано с тем, что я использовал код bytebuddy для создания класса
Header_H
. Я использовал bytebuddy для создания подкласса на основеsome.class
в существующем исходном коде и дополнительных вводимых пользователем данных из файла конфигурации во время выполнения, т.е.Header_H
становится доступным только во время выполнения.
мой код bytebuddy примерно такой:
Затем clazz
(в данном случае Header_H
) будет передан конвейеру в потоке данных. Когда я проверил содержимое jar-файла во временном местоположении облачной сцены Google, я вижу some.class
, но не Header_H.class
, и это, вероятно, вызывает ошибку «ClassNotFoundException».
builder = new ByteBuddy().subclass(some.class).name("Header_H").modifiers(PUBLIC);
.defineField("serialVersionUID", long.class, STATIC, PRIVATE, FINAL).value(37L)
.implement(Serializable.class);
Class <?> clazz = builder.make().load(getClass().getClassLoader()).getLoaded();
Итак, если мои рассуждения верны, то как я могу заставить Beam помещать класс, созданный во время выполнения, в файл jar для отправки в средство выполнения потока данных, учитывая, что у меня есть implement(Serializable.class)
в создании моего класса?
Byte Buddy может внедрить класс в файл jar через: