Как запустить зависимую от данных функцию в секционированной области в группе участников? - PullRequest
3 голосов
/ 14 января 2020

Моя команда использует Geode как импровизированный аналитический движок. Мы храним коллекцию массивных необработанных объектов данных (по 200 МБ + каждый) в Geode, но эти объекты никогда напрямую не возвращаются клиенту. Вместо этого мы в значительной степени полагаемся на выполнение пользовательских функций для обработки этих наборов данных внутри Geode и возвращаем только набор результатов анализа.

У нас есть новое требование для реализации двухуровневой точности анализа данных. Для высокоточной аналитики потребуются большие наборы необработанных данных и больше процессорного времени. Крайне важно, чтобы эти высокоточные анализы никоим образом не препятствовали работе низкоточных аналитиков. Таким образом, я ищу решение, которое хранит эти наборы данных изолированными для разных серверов.

Я создал PO C, который хранит каждый набор данных в своем собственном регионе (оба РАЗДЕЛЕНЫ). Эти регионы настроены на принадлежность к отдельным группам участников, затем каждый сервер настроен на присоединение к одной из двух групп. Я могу установить этот кластер локально без проблем, и gf sh указывает, что все выглядит правильно: describe member показывает каждого участника, на котором размещены ожидаемые регионы.

Мой код клиента настраивает ClientCache, который указывает на одиночный локатор кластера. Моя команда выполнения функции обычно выглядит следующим образом:

FunctionService
  .onRegion(highPrecisionRegion)
  .setArguments(inputObject)
  .filter(keySet)
  .execute(function);

Когда я запускаю только высокоточный сервер, я могу выполнить функцию в области высокой точности. Когда я запускаю только сервер с низкой точностью, я могу выполнить функцию для области с низкой точностью. Однако, когда я запускаю оба сервера и выполняю функции одну за другой, я неизменно получаю исключение, утверждающее, что один областей не может быть найден. Посмотрите следующую Gist для примера моего кода и исключения. https://gist.github.com/dLoewy/c9f695d67f77ec18a7e60a25c4e62b01

Ключевые точки TLDR:

  1. При использовании групп участников область A находится на сервере 1, а область B - на сервере 2.
  2. Эти регионы должны быть РАЗДЕЛЕНЫ в Производство.
  3. Мне нужно запустить функцию в зависимости от данных в одном из этих регионов; Код клиента выбирает, какой.
  4. Как есть, мой код клиента всегда не может найти один регионов.

Может кто-нибудь, пожалуйста, помогите мне войти отслеживать? Есть ли у меня совершенно другая кластерная архитектура? Мы рады предоставить более подробную информацию по запросу.

Большое спасибо за ваше время!

Дэвид

К вашему сведению, на следующих страницах документации упоминается выполнение функций в группах участников, но очень маленькая деталь В первой ссылке описывается запуск данных- независимых функций в группах участников, но не говорится о том, как и ничего не говорится о выполнении данных- зависимых функций в группах элементов. https://gemfire.docs.pivotal.io/99/geode/developing/function_exec/how_function_execution_works.html https://gemfire.docs.pivotal.io/99/geode/developing/function_exec/function_execution.html

Ответы [ 2 ]

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

Вы пытались создать на клиенте два разных пула, каждый из которых нацелен на определенный c server-group, и выполняете функцию как обычно с onRegion? Я считаю, что это должно сработать. Для получения дополнительной информации, пожалуйста, взгляните на Организация серверов в логические группы участников .

Надеюсь, это поможет. Приветствия.

1 голос
/ 14 января 2020

Поскольку данные региона не реплицируются на серверы, похоже, что вам нужно ориентироваться на методы onMembers или onServers, а также на onRegion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...