2013-07-21 4 views
1

Этот вопрос является неясной проблемой - извините за длину. Я пытаюсь развернуть приложение в Heroku. Приложение запускает Rserve - демон языка R для запуска статистических отчетов. Это в принципе не должно быть труднее, чем заставить любого демона, например memcached, работать в Heroku.Как получить демон Rserve как рабочий dyno на Heroku

В Mac OSX Я просто запускаю демона в командной строке и забываю об этом - все работает нормально. Я взаимодействую с Rserve от node.js, используя https://github.com/albertosantini/node-rio (здесь не фактор).

Но в развертывании в Героку, не имея большой удачи. Я использую multipackR и узел. Установка работает нормально, все шаги сборки завершаются хорошо, R запускается нормально.

Теперь приступает к запуску демона Rserve на рабочем динамо.

Мой PROCFILE выглядит следующим образом:

web: node server.js 
worker: R CMD Rserve --no-save 

Когда я бегу, я получаю следующее сообщение об ошибке в журналах (прокручивать до конца блока):

Rserv started in daemon mode. 
heroku[worker.1]: State changed from starting to crashed 

Rserve() конфигурации docs: http://www.rforge.net/Rserve/doc.html Я не эксперт в настройке, но, возможно, есть что-то там, что я должен делать, чтобы он работал в этой среде?

странность в том, что вы можете запустить без ошибок из консоли запустить Heroku, но (смотри ниже), это, кажется, не быть на самом деле работает, когда я пытаюсь получить доступ к нему из Node.js:

heroku run R CMD Rserve 

[Ранее сохраненное рабочее пространство восстановлено]

Rserv запущен в режиме демона. >

В node.js (heroku run node), я стараюсь испытывать его таким образом:

var rio = require('rio'); 
rio.evaluate("pi/2 * 2"); 

, который дает ошибку "не удалось Rserve вызов".

Это заставляет меня думать, что что-то принципиально неправильно с тем, что я пытаюсь сделать или как я пытаюсь это сделать.

+0

Так что я попробовал дюжину способов, чтобы получить это началось на рабочий дино, но все обрушится. Я никогда не сталкивался со всеми проблемами окружающей среды - я не очень разбираюсь в Unix. Тем не менее ... Я получил эту работу, создав дочерний процесс, чтобы запустить Rserve в конце моего сценария инициализации server.js на моем веб-дино. Это работает, но делает ли это ударом вас как сумасшедшие или хрупкие? 'childProcess.exec ('R CMD Rserve --save', function (error, stdout, stderr) {});' – metalaureate

+0

Мой план состоит в том, чтобы реализовать его таким образом в рабочем процессе и использовать Web Workers для связи между отдельными средами , https://github.com/pgriess/node-webworker/blob/master/README.md – metalaureate

ответ

2

Rserve работает как демон по умолчанию, поэтому используйте сценарий для его выполнения, чтобы он запускался «in process».

E.g.

# example R script for executing Rserve 
require('Rserve') 

# get the port from environment (heroku) 
port <- Sys.getenv('PORT') 

# run Rserve in process 
run.Rserve(debug = FALSE, port, args = NULL, config.file = "rserve.conf") 

И тогда ваш Procfile будет иметь следующую запись:

rserve: R -f rserve.r --gui-none --no-save 
0

Итак, я попробовал дюжину способов, чтобы это началось на рабочем динамо, но все бы сработало. Я никогда не сталкивался со всеми проблемами окружающей среды - я не очень разбираюсь в Unix. Тем не менее ... Я получил эту работу, создав дочерний процесс, чтобы запустить Rserve в конце моего сценария инициализации server.js на моем веб-дино. Оно работает.

childProcess.exec('R CMD Rserve --no-save', function (error, stdout, stderr) {}); 

Мой план заключается в реализации его таким образом в рабочем процессе и использовать Web Workers для обмена данными между отдельными средами.