วิธีทำให้ daemon Rserve ทำงานในฐานะผู้ปฏิบัติงาน dyno บน Heroku

คำถามนี้เป็นปัญหาที่ไม่ชัดเจน - ขออภัยที่ยาว ฉันกำลังพยายามปรับใช้แอปกับ Heroku แอปนี้เรียกใช้ Rserve ซึ่งเป็นภูตของภาษา R สำหรับการเรียกใช้รายงานทางสถิติ โดยหลักการแล้วสิ่งนี้ไม่น่าจะยากไปกว่าการได้รับ daemon ใดๆ เช่น memcached เพื่อทำงานใน Heroku

ใน Mac OSX ฉันเพิ่งเริ่ม daemon ในบรรทัดคำสั่งแล้วลืมมันไป - ทุกอย่างทำงานได้ดี ฉันกำลังเชื่อมต่อกับ Rserve จาก node.js โดยใช้ https://github.com/albertosantini/node-rio (ไม่ใช่ปัจจัยที่นี่)

แต่ในการปรับใช้กับ Heroku โชคไม่ดีนัก ฉันใช้ มัลติแพ็ก จาก R และ node. การติดตั้งดำเนินไปด้วยดี ขั้นตอนการสร้างทั้งหมดออกจากระบบได้ ส่วน R เริ่มทำงานได้ดี

ตอนนี้มาถึงงานในการเริ่มต้น Rserve daemon บน dyno ของผู้ปฏิบัติงาน

โปรไฟล์ของฉันมีลักษณะดังนี้:

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() อยู่ที่นี่: http://www.rforge.net/Rserve/doc.html ฉันไม่เชี่ยวชาญในการกำหนดค่า แต่อาจมีบางอย่างในนั้นที่ฉันควรทำเพื่อให้มันทำงานในสภาพแวดล้อมนี้ได้

สิ่งที่แปลกประหลาดคือคุณสามารถเรียกใช้สิ่งนี้ได้โดยไม่มีข้อผิดพลาดจากคอนโซลการเรียกใช้ Heroku แต่ (ดูด้านล่าง) ดูเหมือนว่าจะไม่ทำงานจริงเมื่อฉันพยายามเข้าถึงจาก node.js:

heroku run R CMD Rserve

[กู้คืนพื้นที่ทำงานที่บันทึกไว้ก่อนหน้านี้แล้ว]

Rserv เริ่มต้นในโหมด daemon >

ใน node.js (heroku run node) ฉันลองทดสอบดังนี้:

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

ซึ่งทำให้เกิดข้อผิดพลาด "การโทรสำรองล้มเหลว"

สิ่งนี้ทำให้ฉันคิดว่ามีบางอย่างผิดปกติโดยพื้นฐานกับสิ่งที่ฉันพยายามทำหรือวิธีที่ฉันพยายามทำ


person Community    schedule 21.07.2013    source แหล่งที่มา
comment
ดังนั้นฉันจึงลองหลายวิธีเพื่อเริ่มต้นใช้งานไดโนคนงาน แต่ทุกอย่างก็ล้มเหลว ฉันไม่เคยเข้าใจถึงปัญหาสิ่งแวดล้อมทั้งหมดเลย - ฉันไม่เชี่ยวชาญเรื่อง Unix มากนัก อย่างไรก็ตาม... ฉันทำให้มันใช้งานได้โดยการวางกระบวนการลูกเพื่อรัน Rserve ที่ส่วนท้ายของสคริปต์เริ่มต้น server.js บนเว็บ dyno ของฉัน มันใช้งานได้ แต่มันทำให้คุณรู้สึกบ้าหรือเปราะหรือเปล่า? childProcess.exec('R CMD Rserve --save', function (error, stdout, stderr) {});   -  person metalaureate    schedule 22.07.2013
comment
แผนของฉันคือการปรับใช้ในลักษณะนี้ในกระบวนการของผู้ปฏิบัติงาน และใช้ Web Workers เพื่อสื่อสารระหว่างสภาพแวดล้อมที่แยกจากกัน github.com/pgriess/node-webworker/blob/master/README เอ็มดี   -  person metalaureate    schedule 22.07.2013


คำตอบ (2)


Rserve ทำงานเป็น daemon ตามค่าเริ่มต้น ดังนั้นให้ใช้สคริปต์เพื่อดำเนินการเพื่อให้รัน "อยู่ระหว่างดำเนินการ"

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
person Community    schedule 27.10.2013

ดังนั้นฉันจึงลองหลายวิธีเพื่อเริ่มต้นใช้งานไดโนคนงาน แต่ทุกอย่างก็ล้มเหลว ฉันไม่เคยเข้าใจถึงปัญหาสิ่งแวดล้อมทั้งหมดเลย - ฉันไม่เชี่ยวชาญเรื่อง Unix มากนัก อย่างไรก็ตาม... ฉันทำให้มันใช้งานได้โดยการวางกระบวนการลูกเพื่อรัน Rserve ที่ส่วนท้ายของสคริปต์เริ่มต้น server.js บนเว็บ dyno ของฉัน มันได้ผล.

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

แผนของฉันคือการใช้วิธีนี้ในกระบวนการของผู้ปฏิบัติงานและใช้ Web Workers เพื่อสื่อสารระหว่างสภาพแวดล้อมที่แยกจากกัน

person Community    schedule 22.07.2013