Вопрос

Вопрос в двух словах

Каков наилучший способ заставить Python и Java хорошо взаимодействовать друг с другом?

Более подробное объяснение

У меня несколько сложная ситуация.Я постараюсь сделать все возможное, чтобы объяснить как картинками, так и словами.Вот текущая архитектура системы:

Current system architecture

У нас есть агентно-ориентированное моделирование, написанное на Java.Он имеет опции либо локальной записи в CSV-файлы, либо удаленной через подключение к Java-серверу для HDF5 файл.Каждый запуск симуляции выдает более гигабайта данных, и мы запускаем симуляцию десятки раз.Нам нужно иметь возможность агрегировать по нескольким запускам одного и того же сценария (с разными случайными начальными значениями), чтобы увидеть некоторые тенденции (напримерминимальное, максимальное, медианное, среднее значение).Как вы можете себе представить, попытка переместить все эти CSV-файлы - настоящий кошмар;за один запуск создается несколько файлов, и, как я уже сказал, некоторые из них огромны.Именно по этой причине мы пытались перейти к решению HDF5, в котором все данные для исследования хранятся в одном месте, а не разбросаны по десяткам обычных текстовых файлов.Кроме того, поскольку это двоичный формат файла, он должен обеспечивать значительную экономию места по сравнению с несжатыми CSV-файлами.

Как показано на диаграмме, текущая постобработка, которую мы выполняем для необработанных выходных данных из simulation, также выполняется на Java и считывается в CSV-файлах, созданных local output.Этот модуль постобработки использует JFreeChart для создания некоторых диаграмм, связанных с моделированием.

В чем проблема

Как я упоминал ранее, CSV действительно несостоятельны и плохо масштабируются, поскольку мы генерируем все больше и больше данных в результате моделирования.Кроме того, код постобработки выполняет больше, чем должен, по сути, выполняя работу с реляционной базой данных очень, очень бедного человека (создание соединений между "таблицами" (csv-файлами) на основе внешних ключей (уникальных идентификаторов агентов).В этой системе также сложно визуализировать данные другими способами (например,Prefuse, Обработка, jMonkeyEngine, получающий некоторое подмножество необработанных данных для воспроизведения в MatLab или SPSS).

Решение?

Моя группа решила, что нам действительно нужен способ фильтрации и запроса имеющихся у нас данных, а также выполнения перекрестных соединений с таблицами.Учитывая, что это ситуация с однократной записью и множеством чтений, нам действительно не нужны накладные расходы реальной реляционной базы данных;вместо этого нам просто нужен какой-то способ создать более приятный интерфейс для файлов HDF5.Я нашел несколько статей по этому поводу, например, одну, описывающую, как использовать XQuery как язык запросов к файлам HDF5, но в статье описывается необходимость написания компилятора для преобразования из XQuery / XPath в собственные вызовы HDF5, что выходит далеко за рамки наших потребностей.Войти Питаблы.Кажется, он делает именно то, что нам нужно (предоставляет два разных способа запроса данных, либо через понимание списка Python, либо через поиск в ядре (уровень C).

Предлагаемая архитектура, которую я себе представляю, такова:Envisioned architecture

Что я не совсем уверен, как это сделать, так это связать воедино код python, который будет написан для запроса, с кодом Java, который обслуживает файлы HDF5, и кодом Java, который выполняет постобработку данных.Очевидно, я захочу переписать большую часть кода постобработки, который неявно выполняет запросы, и вместо этого позволить превосходным PyTables делать это гораздо более элегантно.

Параметры Java / Python

Простой поиск в Google выдает несколько вариантов взаимодействие между Java и Python, но я настолько новичок в этой теме, что ищу какой-нибудь реальный опыт и критику предлагаемой архитектуры.Похоже, что процесс Python должен быть запущен на том же компьютере, что и Datahose, чтобы большие файлы .h5 не нужно было передавать по сети, а скорее гораздо меньшие, отфильтрованные его представления передавались клиентам. Поджигатель кажется, это интересный выбор - есть ли у кого-нибудь опыт в этом?

Это было полезно?

Решение

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

Первоначальный план использования PyTables в качестве промежуточного слоя между вашими другими элементами и файлами данных кажется надежным.Однако одно из проектных ограничений, которое не было упомянуто, является одним из наиболее важных при обработке всех данных:Какие из этих задач по обработке данных могут быть выполнены в стиле пакетной обработки, а какие задачи по обработке данных больше похожи на прямую трансляцию.

Это различие между "мы точно знаем наши входные и выходные данные и можем просто выполнить обработку" (пакет) и "мы знаем наши входные данные и то, что должно быть доступно для того, чтобы что-то еще можно было задать" (live), имеет решающее значение для архитектурного вопроса.Глядя на вашу диаграмму, можно увидеть несколько взаимосвязей, которые подразумевают различные стили обработки.

Кроме того, на вашей диаграмме у вас есть компоненты разных типов, все они используют одни и те же символы.Это немного затрудняет анализ ожидаемой производительности и КПД.

Еще одним существенным ограничением является ваша ИТ-инфраструктура.Есть ли у вас доступное высокоскоростное сетевое хранилище?Если вы это сделаете, промежуточные файлы станут отличным, простым и быстрым способом обмена данными между элементами вашей инфраструктуры для всех нужд пакетной обработки.Вы упомянули о запуске вашего приложения, использующего PyTables, на том же сервере, на котором запущена симуляция Java.Однако это означает, что сервер будет испытывать нагрузку как при записи, так и при чтении данных.(Иными словами, на среду моделирования могут влиять потребности несвязанного программного обеспечения при запросе данных.)

Чтобы напрямую ответить на ваши вопросы:

  • PyTables выглядит как хорошее совпадение.
  • Существует много способов взаимодействия Python и Java, но рассмотрите метод коммуникации, не зависящий от языка, чтобы при необходимости эти компоненты можно было изменить позже.Это так же просто, как найти библиотеки, поддерживающие как Java, так и Python, и попробовать их.API, который вы решите реализовать с любой библиотекой, в любом случае должен быть одним и тем же.(XML-RPC отлично подошел бы для создания прототипов, поскольку он находится в стандартной библиотеке, буферы протоколов Google или Facebook Thrift делают хороший выбор для производства.Но не стоит недооценивать, насколько замечательной и простой может быть простая "запись данных в промежуточные файлы", если данные предсказуемы и доступны для пакетной обработки.

Чтобы больше помогать в процессе проектирования и конкретизировать ваши потребности:

Легко взглянуть на маленький кусочек головоломки, сделать несколько разумных предположений и перейти к оценке решения.Но еще лучше взглянуть на проблему целостно, с четким пониманием ваших ограничений.Могу ли я предложить этот процесс:

  • Создайте две схемы вашей текущей архитектуры, физическую и логическую.
    • На физической схеме создайте поля для каждого физического сервера и изобразите физические соединения между ними.
      • Обязательно укажите ресурсы, доступные для каждого сервера, а также тип и ресурсы, доступные для каждого соединения.
      • Включите физическое оборудование, которое не задействовано в вашей текущей настройке, если это может оказаться полезным.(Если у вас есть доступная сеть SAN, но вы ею не пользуетесь, включите ее на случай, если решение может захотеть этого.)
    • На логической схеме создайте поля для каждого применение это работает в вашей текущей архитектуре.
      • Включите соответствующие библиотеки в виде вставок внутри поля для приложений.(Это важно, потому что ваша схема будущего решения в настоящее время содержит PyTables в виде блока, но это всего лишь библиотека, и она ничего не может сделать сама по себе.)
      • Используйте дисковые ресурсы (например, файлы HDF5 и CSV) в виде цилиндров.
      • При необходимости подключайте приложения со стрелками к другим приложениям и ресурсам.Всегда рисуйте стрелку От "актер" Для "цель".Таким образом, если приложение записывает файл HDF5, стрелка переходит от приложения к файлу.Если приложение считывает CSV-файл, стрелка переходит от приложения к файлу.
      • На каждой стрелке должен быть обозначен механизм связи.Немаркированные стрелки показывают взаимосвязь, но они не отображаются что отношения, и поэтому они не помогут вам принимать решения или сообщать об ограничениях.

Как только вы закончите с этими диаграммами, сделайте несколько их копий, а затем прямо поверх них начинайте рисовать рисунки потока данных.Имея копию диаграммы для каждого приложения "конечной точки", которому требуются ваши исходные данные, начните с моделирования и завершите в конечной точке практически сплошной плавной стрелкой.Каждый раз, когда стрелка ваших данных пересекает стрелку связи / протокола, делайте заметки о том, как изменяются данные (если таковые имеются).

На этом этапе, если вы и ваша команда согласны с тем, что изложено на бумаге, значит, вы объяснили свою текущую архитектуру таким образом, который должен быть легко доступен любому.(Не только помощникам здесь, в stackoverflow, но и боссам, менеджерам проектов и другим владельцам кошельков.)

Чтобы начать планировать свое решение, посмотрите на диаграммы потоков данных и проделайте обратный путь от конечной точки к начальной и создайте вложенный список, содержащий все приложения и промежуточные форматы на обратном пути к началу.Затем перечислите требования для каждого приложения.Обязательно включите функцию:

  • Какие форматы данных или методы может использовать это приложение для обмена данными?
  • Какие данные ему на самом деле нужны.(Это всегда одно и то же или меняется по прихоти в зависимости от других требований?)
  • Как часто ему это нужно?
  • Приблизительно, сколько ресурсов требуется приложению.
  • Что делает приложение сейчас, если оно работает не так хорошо?
  • Что это приложение может сделать сейчас, что могло бы помочь, но оно не делает?

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

Вы уже описали одну конкретную ситуацию, когда у вас есть довольно много кода постобработки Java, который выполняет "соединения" с таблицами данных в CSV-файлах, это "делать сейчас, но не очень хорошо".Итак, вы смотрите на другую сторону этого общения, чтобы увидеть, может ли другая сторона сделать это хорошо.На данном этапе другой стороной является CSV-файл, а до этого - симуляция, так что нет, в текущей архитектуре нет ничего, что могло бы сделать это лучше.

Итак, вы предложили новое приложение на Python, которое использует библиотеку PyTables, чтобы улучшить этот процесс.Пока звучит неплохо!Но на вашей следующей диаграмме вы добавили кучу других вещей, которые соотносятся с "PyTables".Теперь мы вышли за рамки понимания группы здесь, в StackOverflow, потому что мы не знаем требований этих других приложений.Но если вы составите список требований, как указано выше, вы будете точно знать, что следует учитывать.Возможно, ваше приложение на Python, использующее PyTables для выполнения запросов к файлам HDF5, может поддерживать все эти приложения.Возможно, это будет поддерживать только один или два из них.Возможно, это обеспечит оперативный запрос к постпроцессору, но периодически будет записывать промежуточные файлы для других приложений.Мы не можем сказать наверняка, но при планировании вы можете.

Некоторые заключительные рекомендации:

  • Будьте проще! Враг здесь - сложность.Чем сложнее ваше решение, тем сложнее его реализовать и тем больше вероятность того, что оно потерпит неудачу.Используйте наименьшее число операций, используйте наименее сложные операции.Иногда проще всего использовать только одно приложение для обработки запросов ко всем остальным частям вашей архитектуры.Иногда лучше использовать приложение для обработки "живых" запросов и отдельное приложение для обработки "пакетных запросов".
  • Будьте проще! Это большое дело!Не пишите ничего, что уже можно сделать за вас.(Вот почему промежуточные файлы могут быть такими замечательными, ОС справляется со всеми сложными частями.) Кроме того, вы упомянули, что реляционная база данных требует слишком больших затрат, но учтите, что реляционная база данных также поставляется с очень выразительным и хорошо известным языком запросов, сопутствующим сетевому протоколу связи, и вам не нужно ничего разрабатывать, чтобы использовать это!Какое бы решение вы ни предложили, оно должно быть лучше чем использовать готовое решение, которое наверняка будет работать очень хорошо, или это не самое лучшее решение.
  • Часто обращайтесь к документации вашего физического уровня таким образом, вы понимаете, насколько полезны ваши соображения.Медленное подключение к сети или размещение слишком большого объема данных на одном сервере могут исключить хорошие решения в остальном.
  • Сохраните эти документы. Что бы вы ни решили, документация, созданная вами в процессе, является ценной.Перенесите их в Wiki или запишите в файл, чтобы вы могли использовать их снова, когда появится тема.

И ответ на прямой вопрос "Как заставить Python и Java хорошо работать вместе?" - это просто "использовать не зависящий от языка метод коммуникации". Правда в том, что Python и Java оба не важны для вашего набора задач describe.Что важно, так это данные, которые проходят через него.Все, что может легко и эффективно обмениваться данными, будет просто отлично.

Другие советы

Не делайте это более сложным, чем необходимо.

Ваш Java-процесс может просто создать отдельный подпроцесс для выполнения ваших запросов PyTables.Позвольте операционной системе делать то, что ОС делает лучше всего.

Ваше Java-приложение может просто разветвить процесс, который имеет необходимые параметры в виде параметров командной строки.Тогда ваш Java сможет перейти к следующему этапу, пока Python работает в фоновом режиме.

Это имеет ОГРОМНЫЕ преимущества с точки зрения одновременной производительности.Ваш «бэкэнд» Python работает одновременно с «интерфейсом» вашего моделирования Java.

Вы могли бы попробовать Джитон, интерпретатор Python для JVM, который может import Классы Java.

Домашняя страница проекта Jython

К сожалению, это все, что я знаю по этому вопросу.

Не уверен, что это хороший этикет.Мне не удалось уместить все свои комментарии в обычный комментарий, и пост неактивен уже 8 месяцев.

Просто хотел посмотреть, как у тебя обстоят дела?У нас очень-очень похожая ситуация, где я работаю — только симуляция написана на C и формат хранения — бинарные файлы.Каждый раз, когда начальник хочет получить другое резюме, нам приходится создавать/изменять рукописный код для создания резюме.Размер наших двоичных файлов составляет около 10 ГБ, и на каждый год моделирования приходится один из них, поэтому, как вы можете себе представить, все становится сложнее, когда мы хотим запустить его с разными исходными кодами и тому подобным.

Я только что открыл для себя pyTables, и у меня возникла идея, похожая на вашу.Я надеялся изменить формат хранения на hdf5, а затем запустить сводные отчеты/запросы с помощью pytables.Частично это предполагает объединение таблиц за каждый год.Удалось ли вам выполнить такие типы «объединений» с помощью pytables?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top