Spark 2.2 представил структурированный потоковый источник Kafka. Насколько я понимаю, он полагается на контрольную точку HDFS для хранения смещений и гарантирует доставку сообщений "точно один раз".
Но старые доки (например, https://blog.cloudera.com/blog/2017/06/offset-management-for-apache-kafka-with-apache-spark-streaming/) говорят, что контрольные точки Spark Streaming не восстанавливаются в приложениях или обновлениях Spark и, следовательно, не очень надежны. В качестве решения существует практика поддержки хранения смещений во внешнем хранилище, которая поддерживает такие транзакции, как MySQL или RedshiftDB.
Если я хочу сохранить смещения из источника Кафки в транзакционную БД, как я могу получить смещение от партии структурированного потока?
Раньше это можно было сделать, переведя RDD в "HasOffsetRanges":
val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges
Но с новым Streaming API у меня есть набор данных InternalRow
, и я не могу найти простой способ для извлечения смещений. API-интерфейс Sink имеет только метод addBatch(batchId: Long, data: DataFrame)
и как я могу предположить, чтобы получить смещение для заданного идентификатора пакета?