2017-01-25 13 views
0

Обновление:Каким образом записи, помещенные в Kinesis, должны быть эффективно упакованы, если они меньше, чем минимальная единица полезной нагрузки в 25 КБ?

Чтобы подробнее узнать о проблеме, put_records оплачивается в зависимости от количества представленных записей (разделов) и размера записей. Любая запись, которая меньше 25 КБ, заряжается как один PU (Payload Unit). Наши индивидуальные записи составляют около 100 байт в секунду. Если мы поместим их отдельно, мы потратим на пару порядков больше денег на ПУ, чем нам нужно.

Независимо от решения, мы хотим, чтобы данный UID всегда оказывался в одном и том же осколке, чтобы упростить работу на другом конце Kinesis. Это происходит, естественно, если UID используется как ключ раздела.

Одним из способов борьбы с этим было бы продолжать делать помехи для каждого UID, но буферизировать их во времени. Но для эффективного использования PU мы закончили бы с задержкой в ​​250 секунд, введенной в поток.

Комбинация приведенного здесь ответа и this question дает мне стратегию для сопоставления нескольких идентификаторов пользователей статическим (предопределенным) ключам разделов для каждого осколка.

Это позволило бы объединить несколько UID в один блок полезной нагрузки (с использованием разделяемого ключа разделов для целевого осколка), чтобы они могли быть выписаны, когда они приходят каждую секунду, в то время как данный UID заканчивается в правильном осколке ,

Затем мне нужен буфер для каждого осколка, и как только будет получено достаточно записей, всего лишь до 25 КБ или 500 записей (максимум за вызов put_records), данные могут быть сдвинуты.

Это просто перестает вычисляться раньше времени, что может привести к тому, что данный UID будет отображаться, если бы он использовался в качестве ключа раздела.

AWS Kinesis documentation говорит, что это метод:

ключи Перегородки являются Unicode строки с максимальным ограничением длины 256 байт. Хеш-функция MD5 используется для сопоставления ключей разделов с 128-битными значениями и сопоставления связанных записей данных с осколками.

Если кто-то этого не сделал, прежде чем я попытаюсь посмотреть, способ ли в this question генерирует действительные сопоставления. Мне интересно, нужно ли преобразовать обычную строку Python в строку юникода, прежде чем делать MD5.

Возможно, существуют другие решения, но это должно работать, и я буду принимать существующий ответ здесь, если не появится претендента.

+0

у вас есть два вопроса здесь или только один? не могли бы вы уточнить свой точный вопрос? –

ответ

0

Выдержка из предыдущего ответа:

  1. Попробуйте сгенерировать несколько случайных partition_keys, и отправить определенное значение с ними в потоке.
  2. Запустите потребительское приложение и посмотрите, какой осколок доставил какое значение.
  3. Затем сопоставьте ключи раздела, которые вы использовали для отправки каждой записи с соответствующим осколком.

Итак, теперь вы знаете, какой ключ из разделов использовать при отправке данных конкретного осколка, вы можете использовать эту карту во время передачи этих специального «в мультиплексироваться» запись ...

Это хаки и грубой силы, но это сработает.

Также см предыдущего ответа по поводу ключей разделов и осколков: https://stackoverflow.com/a/31377477/1622134

Надеется, что это помогает.

PS: Если вы используете API уровня Kinesis низкого уровня и создаете пользовательский запрос PutRecord , в ответе вы можете найти, какая информация о размещении . PutRecordResponse содержит информацию shardId;

http://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html

Источник: https://stackoverflow.com/a/34901425/1622134

+0

Если вопрос является дубликатом, отметьте его как таковой. – Cubic

+0

Я не уверен, что тег python немного запутан. – az3

+0

Этот другой вопрос не совсем то же самое. Интересное решение, но не желаемое в этом случае, поскольку оно будет падать клиенту, чтобы сбалансировать фактические uids через случайные ключи раздела, и у нас есть 13M из них. Мы не можем случайным образом генерировать ключ раздела для каждого предложения, как этот другой ответ, потому что у нас будет несколько потребителей, и мы хотим, чтобы данный uid всегда обращался к одному и тому же потребителю. – systemjack

 Смежные вопросы

  • Нет связанных вопросов^_^