[英]Failing Apache Beam Pipeline when consuming events through KafkaIO on Flink runner
我有一個帶有多個階段的光束管道,它通過 KafkaIO 消耗數據,代碼如下所示,
pipeline.apply("Read Data from Stream", StreamReader.read())
.apply("Decode event and extract relevant fields", ParDo.of(new DecodeExtractFields()))
.apply(...);
StreamReader.read()
方法實現,
public static KafkaIO.Read<String, String> read() {
return KafkaIO.<String, String>read()
.withBootstrapServers(Constants.BOOTSTRAP_SERVER)
.withTopics(Constants.KAFKA_TOPICS)
.withConsumerConfigUpdates(Constants.CONSUMER_PROPERTIES)
.withKeyDeserializer(StringDeserializer.class)
.withValueDeserializer(StringDeserializer.class)
//Line-A .withMaxReadTime(Duration.standardDays(10))
.withLogAppendTime();
}
在Direct Runner上運行管道時,它運行時不會引發任何錯誤。 但就我而言,我必須使用Flink Runner並且當管道在Flink Runner上運行時,它會引發以下錯誤,
Exception in thread "main" java.lang.RuntimeException: Error while translating UnboundedSource: org.apache.beam.sdk.io.kafka.KafkaUnboundedSource@14b31e37
at org.apache.beam.runners.flink.FlinkStreamingTransformTranslators$UnboundedReadSourceTranslator.translateNode(FlinkStreamingTransformTranslators.java:250)
at org.apache.beam.runners.flink.FlinkStreamingTransformTranslators$ReadSourceTranslator.translateNode(FlinkStreamingTransformTranslators.java:336)
at org.apache.beam.runners.flink.FlinkStreamingPipelineTranslator.applyStreamingTransform(FlinkStreamingPipelineTranslator.java:161)
....
at Main.main(Main.java:6)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @2c34f934
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:354)
at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:297)
at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:178)
at java.base/java.lang.reflect.Field.setAccessible(Field.java:172)
at org.apache.flink.api.java.ClosureCleaner.clean(ClosureCleaner.java:106)
Caused by: java.lang.reflect.InaccessibleObjectException: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not "opens java.lang" to unnamed module @2c34f934
可以通過取消注釋上述StreamReader.read()
方法中的Line-A來解決該錯誤,但該方法withMaxReadTime(...)
不應使用,除非根據文檔用於測試/演示。
像這樣完成的管道實例化,
PipelineOptions pipelineOptions = PipelineOptionsFactory.create();
pipelineOptions.setRunner(FlinkRunner.class);
Pipeline pLine = Pipeline.create(pipelineOptions);
問題:
如果可能,請提供一些相關資源。
該錯誤似乎不在 Beam 中,而是在 Flink 的關閉清理器中,它修改了用戶的私有部分或 SDK 代碼。 這似乎是最新版本的 Java 和 Flink 的已知問題。 請參閱示例 flink 作業的錯誤消息:無法使字段私有最終字節 [] java.lang.String.value 可訪問
為什么注釋行會改變事情? 通常,從 Kafka 讀取時,您會在無限制讀取中讀取 stream。 當您指定withMaxReadTime
時,這將成為有界讀取。 所以對底層 Flink 操作符的轉換是不同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.