簡體   English   中英

在 Flink 運行器上通過 KafkaIO 消費事件時,Apache Beam Pipeline 失敗

[英]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);

問題:

  1. 為什么會出現這個錯誤?
  2. 我該如何解決這個問題?

如果可能,請提供一些相關資源。

該錯誤似乎不在 Beam 中,而是在 Flink 的關閉清理器中,它修改了用戶的私有部分或 SDK 代碼。 這似乎是最新版本的 Java 和 Flink 的已知問題。 請參閱示例 flink 作業的錯誤消息:無法使字段私有最終字節 [] java.lang.String.value 可訪問

為什么注釋行會改變事情? 通常,從 Kafka 讀取時,您會在無限制讀取中讀取 stream。 當您指定withMaxReadTime時,這將成為有讀取。 所以對底層 Flink 操作符的轉換是不同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM