我正在考虑将kafka偏移量存储在kafka中以用于Spark结构化流传输,就像它适用于DStreams stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
一样,除了结构化流传输之外,我一直在寻找。
是否支持结构化流?如果是,我该如何实现?
我知道使用.option("checkpointLocation", checkpointLocation)
进行hdfs检查点,但是我对内置偏移量管理非常感兴趣。
我希望kafka仅在没有Spark HDFS检查点的情况下存储偏移量。
答案 0 :(得分:0)
我正在使用在某处找到的这段代码。
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主题作为源,因此我将startoffsets指定为ReadOffsets检索到的偏移量...
答案 1 :(得分:0)
“它是否支持结构化流媒体?”
不,Structured Streaming 不支持将偏移量提交回 Kafka,类似于使用 Spark Streaming (DStreams) 可以完成的操作。 Kafka specific configurations 上的 Spark Structured Streaming + Kafka 集成指南对此非常准确:
<块引用>“Kafka 源不提交任何偏移量。”
我在 How to manually set groupId and commit Kafka offsets in Spark Structured Streaming 中写了一个更全面的答案。