Avro Records -> Kafka -> Kafka Connect Sink -> Amazon S3 Storage. Идемпотентность?

Итак, у моего работодателя есть сообщения Avro, проходящие через Kafka. Мы хотим архивировать все сообщения в Amazon S3. В идеале, днем ​​они должны храниться в S3-подобных каталогах и использовать структуру пути, например:

s3://my-bucket/data/day=2016-03-04/data.avro

Есть ли ссылка или лучшие практики, как это сделать хорошо?

У меня есть один вопрос: идемпотентность: как обеспечить идемпотентность записи, когда запись может быть отправлена ​​моему приемнику записи более одного раза, но сохранена на S3 только один раз.

Я правильно понимаю, что мне нужна идемпотентность? Если я реализую простое добавление (неидемпотентное), Kafka Connect может отправлять одни и те же записи дважды, и они могут храниться избыточно?


person clay    schedule 07.06.2016    source источник


Ответы (3)


Насколько я знаю, вы не можете добавить объект S3 (файл): https://news.ycombinator.com/item?id=10746969 - если что-то изменилось совсем недавно....

Вы также не хотите записывать каждое событие в S3 по отдельности, а делать это партиями — по очевидным причинам производительности.

Итак, как мы это делаем — используем Cassandra в качестве промежуточного хранилища для сбора событий за некоторый период времени (timeslice) — сохраняем их сгруппированными по времени события , а не обрабатывая раз, а затем периодически записывать те временные срезы, к которым обращались, в S3. Один временной интервал будет храниться в одном объекте S3, а информация о временном интервале будет частью имени файла.

Если/когда для какого-то прошедшего временного интервала приходит больше событий, он добавляется в эту таблицу временных интервалов в Cassandra, и [в конечном итоге] запускается повторная запись в S3, которая снова получает все события для этого временного интервала и записывает в S3 с тем же имя файла, эффективно перезаписывая существующий файл, если таковой имеется.

Вы должны решить, как долго вы хотите хранить данные в Cassandra — в зависимости от того, как работает ваш конвейер и насколько «старыми» могут быть ваши входящие события.

Так мы достигаем идемпотентности. Это, вероятно, не самый эффективный способ, но он хорошо работает для нас, поскольку у нас очень большие объемы и скорости обработки событий, а Cassandra отлично подходит для быстрой записи.

Я хотел бы услышать, как другие решают подобные проблемы!

person Marina    schedule 09.06.2016

Почему бы не использовать что-то вроде secor? Он также имеет некоторые гарантии ровно один раз доставки.

Вы также можете рассмотреть реализации на основе "kafka connect", такие как streamx.

person Cheeko    schedule 08.07.2016

Из описания похоже, что вы ищете это 1) Данные Avro записываются на S3

2) Данные для разделения в S3

3) Ровно однократная поддержка при написании.

Qubole StreamX поддерживает множество преобразований форматов, одним из которых является avro, наряду с разделением данных. И ровно один раз находится в нашей разработке, которая скоро выйдет.

Принимая во внимание, что secor устаревает (упомянутый в одном из их ответов в группе Google), и он также не поддерживает avro.

Таким образом, вы можете использовать qubole streamx для начала.

person Ashish    schedule 16.11.2017
comment
Я слышал, что StreamX также устарел или, по крайней мере, не поддерживается и не обновляется. - person OneCricketeer; 06.09.2018