ruanhang1993 commented on pull request #14376:
URL: https://github.com/apache/flink/pull/14376#issuecomment-790247456
> @ruanhang1993 Many thanks for finding issues of this PR.
> I tried to solve two issues you raised.
>
> 1. Regarding the first issue, I relocate protobuf package in pom.xml
> 2. I'm not sure that open method will be called or not during checkpoint
recovery process. @libenchao Could you help answer this question?
@maosuhan I am honored to receive your reply. I use the fixed version for
problem 1 in flink 1.12.1 recently.
In flink 1.12.1, the problem 2 is gone. The `open` method will be called in
flink 1.12.1 during checkpoint recovery process.
With the fixed code for problem 1 in flink 1.12.1, I got the error like this:
```
Caused by: java.lang.ClassCastException:
com.google.protobuf.Descriptors$Descriptor cannot be cast to
org.apache.flink.formats.protobuf.shaded.com.google.protobuf.Descriptors$Descriptor
at
org.apache.flink.formats.protobuf.PbFormatUtils.getDescriptor(PbFormatUtils.java:81)
~[?:?]
at
org.apache.flink.formats.protobuf.deserialize.PbRowDataDeserializationSchema.<init>(PbRowDataDeserializationSchema.java:67)
~[?:?]
at
org.apache.flink.formats.protobuf.PbDecodingFormat.createRuntimeDecoder(PbDecodingFormat.java:49)
~[?:?]
at
org.apache.flink.formats.protobuf.PbDecodingFormat.createRuntimeDecoder(PbDecodingFormat.java:31)
~[?:?]
at
org.apache.flink.streaming.connectors.kafka.table.KafkaDynamicSource.createDeserialization(KafkaDynamicSource.java:427)
~[?:?]
......
```
I generate the protobuf message class and package like this, and use it when
submitting the flink job.
```bash
protoc -I=$PROTO_FILE_PATH --java_out=$JAVA_OUTPUT/src $PROTO_FILE
javac -cp $JAVA_OUTPUT/libs/protobuf-java.jar -d $JAVA_OUTPUT/target
$JAVA_OUTPUT/src/$PACKAGE_PATH/*.java
cd $JAVA_OUTPUT
jar -cvf $JAR_NAME -C $JAVA_OUTPUT/target/ .
```
The problem is that the `getDescriptor` in my class return the
`com.google.protobuf.Descriptors$Descriptor` class, which can not cast to the
relocated class.
```java
public static Descriptors.Descriptor getDescriptor(String className) {
try {
Class<?> pbClass = Class.forName(className);
return (Descriptors.Descriptor)
pbClass.getMethod(PbConstant.PB_METHOD_GET_DESCRIPTOR).invoke(null);
} catch (Exception y) {
throw new IllegalArgumentException(
String.format("get %s
descriptors error!", className), y);
}
}
```
Do I need to relocate the class like you when generating the protobuf
message class?
Or is there some other way to fix it?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]