簡體   English   中英

Spark Structured Streaming Kafka Offset 管理

[英]Spark Structured Streaming Kafka Offset Management

我正在研究在 kafka 內部存儲 kafka 偏移量以用於 Spark Structured Streaming,就像它適用於 DStreams stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)一樣,我正在尋找相同但用於結構化流。 它是否支持結構化流媒體? 如果是,我該如何實現?

我知道使用.option("checkpointLocation", checkpointLocation) hdfs 檢查.option("checkpointLocation", checkpointLocation) ,但我對內置偏移管理完全感興趣。

我期待 kafka 只在內部存儲偏移量,而沒有 spark hdfs 檢查點。

我正在使用在某處找到的這段代碼。

public class OffsetManager {

    private String storagePrefix;

    public OffsetManager(String storagePrefix) {
        this.storagePrefix = storagePrefix;
    }

    /**
     * Overwrite the offset for the topic in an external storage.
     *
     * @param topic     - Topic name.
     * @param partition - Partition of the topic.
     * @param offset    - offset to be stored.
     */
    void saveOffsetInExternalStore(String topic, int partition, long offset) {

        try {

            FileWriter writer = new FileWriter(storageName(topic, partition), false);

            BufferedWriter bufferedWriter = new BufferedWriter(writer);
            bufferedWriter.write(offset + "");
            bufferedWriter.flush();
            bufferedWriter.close();

        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * @return he last offset + 1 for the provided topic and partition.
     */
    long readOffsetFromExternalStore(String topic, int partition) {

        try {

            Stream<String> stream = Files.lines(Paths.get(storageName(topic, partition)));

            return Long.parseLong(stream.collect(Collectors.toList()).get(0)) + 1;

        } catch (Exception e) {
            e.printStackTrace();
        }

        return 0;
    }

    private String storageName(String topic, int partition) {
        return "Offsets\\" + storagePrefix + "-" + topic + "-" + partition;
    }

}

SaveOffset...在記錄處理成功后調用,否則不存儲偏移量。 並且我使用 Kafka 主題作為源,因此我將起始偏移量指定為從 ReadOffsets 中檢索到的偏移量...

“它支持結構化流媒體嗎?”

不,Structured Streaming 不支持將偏移量提交回 Kafka,類似於使用 Spark Streaming (DStreams) 可以完成的操作。 關於Kafka 特定配置的 Spark Structured Streaming + Kafka 集成指南對此非常精確:

“Kafka 源沒有提交任何偏移量。”

我在How to manual set groupId and commit Kafka offsets in Spark Structured Streaming 中寫了一個更全面的答案。

暫無
暫無

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

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