Подходы для распределенной реализации приложения C ++ (древовидная структура)

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

Абстрактная функциональность существующего приложения является относительно общей:

  • задача имеет несбалансированную древовидную форму, на каждой вершине вычислений
    с нетривиальным временем должно быть сделано (вычисления становятся более
    комплекс дальше вниз по дереву), некоторые вершины развилки
  • форма дерева заранее не известна, исследование дерева и вычисление выполняются на лету
  • важен порядок, в котором исследуется дерево (DFS в порядке, но должен быть настраиваемым)
  • вершины могут быть исследованы независимо друг от друга, но локальность важна из-за кэширования (то есть ветвь должна быть исследована одним и тем же модулем обработки)
  • глобальная статистика должна быть собрана во время пробега
  • Функциональность похожа на состояние освоения космоса. Программа относительно сложная, но ядро ​​это просто цикл

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

Требования к распределенной реализации:

  • на данный момент целью является 50-150 машин, но потенциально должно быть в состоянии хорошо масштабироваться до 1000 узлов
  • Постоянство пространства состояний (особенно со всеми данными) не важно, но было бы неплохо

Простой способ — реализовать коммуникацию, разбиение, балансировку нагрузки и т. Д. Вручную, используя ZeroMQ, NanoMSG или некоторую другую библиотеку сообщений (или даже MPI). Это то, что я не хочу делать, потому что это занимает много времени, подвержено ошибкам, и я, вероятно, в конечном итоге реализую многие вещи, которые уже существуют.

Я думал об использовании Pregel-подобных систем обработки графиков (Giraph, GraphX, GraphLab), но они не предназначены для динамического построения графиков, а скорее для выполнения вычислений на существующих графах.

Тогда я подумал, что мог бы использовать Apache Spark или, возможно, Hama (на самом деле это был бы довольно интересный подход). Но здесь моя проблема заключается в том, что исходное приложение написано на C ++ (и является относительно большим и сложным), но Spark не имеет C / C ++ API. Я никогда не писал многоязычный код и не слишком много знаю о JNI / JNA / BridJ / SWIG, и я не уверен, сколько это будет работать и насколько велики будут потери производительности. Или, если это вообще возможно.

Вот почему я хотел бы спросить сообщество, особенно людей с опытом в распределенном программировании:
Какой подход (вышеупомянутые или новые) возможен и подходит для такой проблемы, как с точки зрения шаблонов (BSP, выполнение DAG, простой мастер-работник и т. Д.), Так и конкретных инструментов (Giraph, Spark, библиотеки обмена сообщениями, так далее.)?
Как насчет взаимодействия Java-C ++, если я решу использовать фреймворк на основе JVM?
Любые другие комментарии или советы?

Большое спасибо!

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]