2012-10-15 1 views
1

Короче говоря, у меня есть Java-процесс, который считывает и записывает данные в/из процесса. У меня есть программа на C++, которая берет данные, обрабатывает их и затем должна передать их обратно на Java, чтобы Java могла записать их в базу данных.Как я могу запускать Java-программы C++ и наоборот, когда данные записываются в буферы протоколов?

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

В этом проблема. Я нашел буфер протокола Google, и мне кажется довольно здорово передавать данные между программами, но я не уверен, как данные сохранения Java-программы могут запускать программу C++ для обработки, а затем, когда программа C++ сохраняет результаты, как будет запускаться программа Java для сохранения результатов (это для одной или нескольких записей, но мы планируем обрабатывать миллиарды записей).

Каков наилучший подход к этой проблеме? Есть ли простой способ сделать это?

ответ

3

Простейшим подходом может быть подключение TCP Socket. Программа Java отправляет, когда вы хотите сделать это, и программа на C++ отправляет результаты.

+0

Просто так я понимаю. Hadoop отправляет данные в java-приложение -> Java-приложение отправляет в сокет TCP -> C++ прослушивает данные сокета и обработки -> C++ отправляет обработанные данные в другой TCP-сокет -> Java берет его и записывает в БД? Я правильно понимаю это? Я изучаю это, кажется хорошим (если я правильно понял). Один вопрос, может ли программа C++/java сказать другим, чтобы замедлить, если они отправляют слишком много данных? есть ли способ управления потоком? – user1735075

+0

TCP имеет встроенный контроль потока. C++ не сможет читать что-либо, что не отправляет Java, а буферы ограничены по размеру и блокируются, если вы попытаетесь написать больше, чем читатель читает. –

+0

ahh Я понимаю ... Я буду делать некоторые тесты. Большое спасибо Петру за предложение – user1735075

1

Поскольку вы собираетесь масштабировать это решение, я предлагаю использовать ZMQ.

Имейте приложение java по-прежнему извлекайте данные из Hadoop.

Затем он, в свою очередь, выталкивает данные с помощью гнезда PUSH.

Здесь у вас будет столько работников C++, кто будет обрабатывать эти данные, принимая соединения как PULL-сокеты. Это масштабируемо для множества различных процессоров/ядер/и т. Д., Которые вам нужны.

Когда каждый рабочий закончен, он вытолкнет результаты на гнездо PUSH в программу «сохранения» java, которая принимает информацию о гнезде PULL.

Это выглядит like this example (стандарт разделяй и властвуй методологии)

Этот процесс является масштабируемой, как много рабочих по мере необходимости, в качестве первой программы Java будет блокировать (но все еще обрабатывает), когда нет никаких доступных рабочих , Пока ваша конечная java-программа будет быстрой, вы увидите, что эта шкала действительно действительно красива.

Передающая и сохранение программы может быть в same program просто использовать zmq_poll устройства :)

+0

Я никогда раньше не использовал zmq, но это выглядит интересно. Производительность кажется отличной, но не уверен, хочу ли я, чтобы сложность ее настройки.Я попытаюсь сравнить его с наличием сокета, например, Peter Suggest. – user1735075

+0

Сложность IMO стоит того, что вам нравится, когда вы захотите масштабировать этот процесс, чтобы обрабатывать миллиарды записей. Используя прямые TCP-соединения, вам понадобится вручную установить эти соединения. С ZMQ в буквальном смысле это почти не работает, чтобы добавить больше рабочих ... Вы даже можете добавить больше рабочих на компьютеры, которые размещены в другой стране, и все будет работать просто отлично :) – g19fanatic