Функции с состоянием в Apache Flink - PullRequest
2 голосов
/ 14 апреля 2020

Я изучаю новый Stateful Functions 2.0 API Apache Flink. Я прочитал следующую документацию по ссылке https://ci.apache.org/projects/flink/flink-statefun-docs-stable/. Также я запускал примеры в Git репо. (https://github.com/ververica/stateful-functions/tree/master/stateful-functions-examples) У меня есть несколько вопросов по поводу реализации.

https://flink.apache.org/stateful-functions.html -> Есть пример, который представляет собой Оценка транзакций для обнаружения мошенничества в конце страницы.

Первый вопрос о состоянии TTL. Как я могу дать заявить TTL? Пример говорит: Через 30 дней функция «Счетчик мошенничества» получит сообщение об истечении срока действия (от себя) и очистит свое состояние. Должен ли я сделать это руководство или есть другая функция? Как я могу сделать это руководство?

Второй вопрос о keyedstream. Пример говорит: существует несколько экземпляров «Счет мошенничества» - например, по одному на учетную запись клиента. Должен ли я поставить значения в PersistedTable<K,V>? Например <customerid,count>. Могу ли я очистить состояние, указав c ключ?

Последний вопрос касается окон и водяных знаков. Как я могу реализовать эту функцию в Stateful Functions 2.0?

1 Ответ

2 голосов
/ 14 апреля 2020

Первый вопрос о состоянии ТТЛ. Как я могу дать заявить TTL? Пример говорит: Через 30 дней функция «Счетчик мошенничества» получит сообщение об истечении срока действия (от себя) и очистит свое состояние. Должен ли я сделать это вручную или есть другая функция? Как я могу сделать это руководство?

Вы можете сделать это вручную, используя задержанное сообщение . По сути, вы можете создать триггер обратного вызова, отправив себе сообщение с задержкой. Это сообщение является надежным и не будет потеряно в случае сбоя. Если вы посмотрите на функцию подсчет мошенничества , то в примере обслуживания модели вы увидите, что она делает именно это. Когда значение получено, ttl-сообщение отправляется с 30-дневной задержкой. Когда это сообщение получено, счетчик уменьшается.

Второй вопрос о keyedstream. Пример говорит: существует несколько экземпляров «Счет мошенничества» - например, по одному на учетную запись клиента. Должен ли я поместить значения в PersistedTable? Например . Могу ли я очистить состояние для указанной клавиши c?

Все экземпляры функций являются «ключами», при этом код пользователя всегда вызывается в области действия ключа, и все сохраняемые поля ограничиваются этой областью. ключ. Ключ является компонентом "id" адреса . В вашем примере у вас может быть функция «CustomerFunction», которая отслеживает информацию о каждом клиенте вашего бизнеса. Если вы хотите взаимодействовать с этим клиентом, вы получите сообщение, в котором указывается, что клиенты используют uid в качестве «идентификатора» адреса.

new Address(new FunctionType("ns", "customer"), "customer-id-1");

Если вы отслеживаете количество клиентов, вам нужен только PersistedValue, поскольку он уже ограничен этим идентификатором клиента. Возвращаясь к примеру подсчета мошенничества, эта функция ограничена «идентификатором счета», она отслеживает количество мошеннических транзакций на банковский счет.

Последний вопрос касается окон и водяных знаков. Как реализовать эту функцию в Stateful Functions 2.0?

Эти функции напрямую не поддерживаются в statefun 2.0. Причина windows заключается в том, что они в основном применимы к обработке данных, а не к разработке приложений. В этих случаях вы, вероятно, лучше справляетесь с использованием Flink DataStream и Table API, хотя их можно реализовать самостоятельно в коде пользователя.

Время события сложное. Время события использует «водяные знаки» под капотом, чтобы отслеживать ход времени в системе. Они зависят от данных, упорядоченных относительно их водяных знаков. Это означает, что если событие x попадает с отметкой времени 1:59 перед водяным знаком на 2 часа, оно всегда должно оставаться перед этим водяным знаком. В противном случае эта своевременная запись будет ошибочно помечена как запоздалая.

Stateful Функции основаны на итерации и произвольной передаче сообщений. Поскольку записи могут go в любом направлении проходить через поток данных, время события точно не определено.

...