2016-06-22 4 views
0

Прецедент, что я пытаюсь решить следующим образом:Flink пример пользовательского разметки

  • У нас есть поток данных, поступающих из Кафки
  • Мы хотели бы, чтобы гарантировать, что сообщение/записи, содержащие тот же значение для конкретного объекта обрабатывается одним и тем же оператором.
  • Мы хотели бы поддерживать состояние этого оператора, чтобы мы могли обогащать будущие сообщения.

Так, например:

  • Давайте предположим, что все сообщения являются массивы байтов, имеющие представляющие кодированные данные.
  • Все сообщения, которые имеют определенное значение в кодированных данных, должны обрабатываться одним оператором.
  • Это так, что, когда мы получаем специальные сообщения, которые также соответствуют одному значению, они могут быть сохранены как состояние на Операторе (после разделителя) и могут использоваться для обогащения последующих сообщений.

Вопросы:

  1. Будет ли пользовательские разметки помощь с этим?
  2. Если нет, то было бы хорошим решением для этого?
  3. Может ли кто-нибудь поделиться примером пользовательского разделителя в Flink для Datastream. Я не смог найти никаких полных примеров.

ответ

1

Пользовательский разделитель поможет, но это не обязательно для вас.

Вы можете просто извлечь значение группировки из своих сообщений и использовать его в качестве группы группировки. Таким образом, после того, как источники считывают данные, вы используете map для извлечения значения (например, Record -> (groupingValue, Record) с типами данных byte[] -> Tuple2<keyType,byte[]>, если вы хотите сохранить необработанное сообщение). Впоследствии вы можете использовать .keyBy(0) и применять любой оператор, который вы хотите на нем. keyBy гарантирует, что все записи с таким же значением в первом поле Tuple2 обрабатываются одним и тем же оператором.

+0

Как это будет работать в кластере? Будет ли Flink маршрутизировать сообщения, обрабатываемые любым узлом, одному оператору на одном узле? Я также начинаю думать, что это можно решить, поддерживая глобальный кеш в кластере. Я не уверен, поддерживается ли это Flink. @ Matthias, что вы думаете? –

+1

В кластере Flink будет перераспределять данные для отправки всех записей с одним и тем же ключом на одну машину (это то, что делает 'keyBy()'). На каждой машине будет один или несколько операторов/потоков (в зависимости от вашей конфигурации), обрабатывающих записи (внутренне каждый оператор отделяет обработку для каждой клавиши - так что клавиши не мешают - то есть, если вы программируете пользовательские UDF, вы не увидите нескольких ключей в вашем UDF - будет несколько экземпляров UDF, то есть по одному для каждого ключа). Так что ты ничего не делаешь - Флинк позаботится о тебе. –

+0

Спасибо. Также мне интересно, что произойдет, если эта машина опустится. Я предполагаю, что Флинк, вероятно, повторит это на другом узле. Это будет означать, что я потеряю состояние оператора. Есть ли способ обойти это? –

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

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