hmm: Stecknadel im Heuaufen: Programmpfad geht auf WIndows aber nicht auf Ubuntu

Hi Leute,

ich habe eine Web Anwendung geschrieben, welche dies tut:

Ich kann mit JavaScript Code ein JSP Servlet ansprechen, welches Java Klassen ausführt, die wiederum R Skripte aus ihren Ressourcen einlesen und ausführen. Das Ergebnis der Berechnungen wird dann an das Java Script geschickt.

-> Funktioniert auf meinem Windows Rechner.

Auf meinem Ubuntu Server bekomme ich aber die folgende Fehlermeldung:

rcaller.exception.RCallerExecutionException: Can not handle R results due to : rcaller.exception.RCallerParseException: Can not parse the R output: org.xml.sax.SAXParseException; systemId: file:/tmp/tomcat7-tomcat7-tmp/Routput5011886626404538268; lineNumber: 1; columnNumber: 1; Vorzeitiges Dateiende.
	rcaller.RCaller.runAndReturnResult(RCaller.java:407)
	mainServerApi.ReadAndCallRScript.callRCode(ReadAndCallRScript.java:67)
	mainServerApi.PortfolioServlet.getPortfolio(PortfolioServlet.java:74)
	mainServerApi.PortfolioServlet.doGet(PortfolioServlet.java:33)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Ich denke, dass auf meinem Ubuntu Server eins der folgenden Probleme auftritt:

  1. Das Java Programm findet die R installation nicht, bzw. nicht die richtige Version (ich habe in meinen Java Ressourcen einen Pfad zu R angegeben: "/usr/bin/Rscript" bei Ubuntu und bei Windows "C:/Program Files/R/R-3.1.1/bin/RScript")

  2. Ich könnte die jar RCaller falsch installiert haben die für die kommunikation zwischen Java und R gebraucht wird (http://stdioe.blogspot.de/search/label/rcaller).

  3. Ich könnte R nicht ausreichend installiert haben. Bei der Anleitung: https://wiki.ubuntuusers.de/R/

Habe ich die geschichte mit dem R_Home ausgelassen.

Könnt ihr mir paar Tipps zur fehlersuche geben? Das Programm ohne R Script funktioniert auch auf Ubuntu.

  1. Hallo,

    -> Funktioniert auf meinem Windows Rechner.

    Auf meinem Ubuntu Server bekomme ich aber die folgende Fehlermeldung:

    das erste, was mir bei solchen Effekten einfällt: Groß/Kleinschreibung.

    Während es unter Windows egal ist, ob man Groß- oder Kleinbuchstaben in Dateinamen notiert, unterscheidet Unix/Linux exakt zwischen verschiedenen Schreibweisen. Wenn ein Verzeichnis beispielsweise Includes heißt, wird includes als Alternative nicht gefunden.

    So long,
     Martin

  2. Hallo,

    1. Das Java Programm findet die R installation nicht, bzw. nicht die richtige Version (ich habe in meinen Java Ressourcen einen Pfad zu R angegeben: "/usr/bin/Rscript" bei Ubuntu und bei Windows "C:/Program Files/R/R-3.1.1/bin/RScript")

    Was Der Martin allgemein formuliert hat, könnte im Speziellen genau hier zutreffen: Rscript vs. RScript

    Gruß
    Kalk

    1. danke für die antworten. der pfad müsste mit Rscript richtig sein, hab das in meiner ubuntu console mal durchgeklickt.

      zum testen habe ich jetzt folgenden code verwendet:

         private String getTest() throws IOException {
          	    	
          	 RCaller rcaller = new RCaller();
               RCode code = new RCode();
               rcaller.setRscriptExecutable("/usr/bin/Rscript");
              		 //"C:/Program Files/R/R-3.1.1/bin/RScript");
              		 //"/usr/bin/Rscript");
      
               code.addRCode("a <- 3");
               code.addRCode("b <- 10.45");
               code.addRCode("d <- TRUE");
               code.addRCode("avector <- c(9,6,5,6)");
               code.addRCode("allvars <- as.list(globalenv())");
      
               rcaller.setRCode(code);
      
               rcaller.runAndReturnResult("allvars");
      
          	
          	return listToStr( rcaller.getParser().getNames());
          }
          
          private String listToStr( ArrayList<String> list) {
          	
          	String output = "";
          	
          	for(int i=0; i<list.size(); i++) {
          		
          		output += " " + list.get(i);
          	}
          	System.out.println( output);
          	return output;
          }
      

      und immernoch die gleiche fehlermeldung.

      1. Tach,

           private String getTest() throws IOException {
            	    	
            	 RCaller rcaller = new RCaller();
                 RCode code = new RCode();
                 rcaller.setRscriptExecutable("/usr/bin/Rscript");
                		 //"C:/Program Files/R/R-3.1.1/bin/RScript");
                		 //"/usr/bin/Rscript");
        
                 code.addRCode("a <- 3");
                 code.addRCode("b <- 10.45");
                 code.addRCode("d <- TRUE");
                 code.addRCode("avector <- c(9,6,5,6)");
                 code.addRCode("allvars <- as.list(globalenv())");
        
                 rcaller.setRCode(code);
        
                 rcaller.runAndReturnResult("allvars");
        
            	
            	return listToStr( rcaller.getParser().getNames());
            }
            
            private String listToStr( ArrayList<String> list) {
            	
            	String output = "";
            	
            	for(int i=0; i<list.size(); i++) {
            		
            		output += " " + list.get(i);
            	}
            	System.out.println( output);
            	return output;
            }
        

        und immernoch die gleiche fehlermeldung.

        läuft bei mir ohne Fehler. Welche Version von RCaller benutzt du?

        mfg
        Woodfighter

        1. Moin,

          RCaller2.1.0

          1. Tach,

            RCaller2.1.0

            ich hatte es mit dem letzten als jar verfügbaren Release 2.5 ausprobiert.

            mfg
            Woodfighter

            1. die hab ich jetzt auch eingebaut aber das problem besteht weiter.

              ich bau mir mit maven eine war datei die ich im tomcat hochlade. die wardatei enthält ein packet lib das wiederum die rCaller jar enthält. eingebunden in maven:

              <dependency>
              			<groupId>rcaller</groupId>
              			<artifactId>RCaller</artifactId>
              			<version>2.5</version>
              			<scope>system</scope>
              			<systemPath>${project.basedir}/lib/RCaller-2.5.jar</systemPath>
              		</dependency>
              

              kann das ein problem darstellen? wie hast du R eingerichtet und wie den Rcaller? bzw wie hast du das mit rununiversal gemacht?

              1. Tach,

                wie hast du R eingerichtet

                ich habe nur r-base aus meinem Debian installiert.

                und wie den Rcaller?

                Das jar runtergeladen und in meinem Eclipse im Testprojekt in den classpath geworfen.

                bzw wie hast du das mit rununiversal gemacht?

                Ich weiß nichtmal was das ist.

                mfg
                Woodfighter

                1. hm, apropro eclipse. ich hab mir bei eclipse mars die code farbgebung verhuntzt und seitdem nurnoch schwarz weiß. weißt du wie ich die farbe wieder auf default bekomme? ich vermute sogar dass ich mir irgendeine datei weggehauen habe so das meine eigene default nichtmehr viel mit farben zutun haben

  3. Tach,

    file:/tmp/tomcat7-tomcat7-tmp/Routput5011886626404538268; lineNumber: 1; columnNumber: 1; Vorzeitiges Dateiende.

    der Output ist also leer.

    1. Das Java Programm findet die R installation nicht, bzw. nicht die richtige Version (ich habe in meinen Java Ressourcen einen Pfad zu R angegeben: "/usr/bin/Rscript" bei Ubuntu und bei Windows "C:/Program Files/R/R-3.1.1/bin/RScript")

    Das würde dann eine Exception an anderer Stelle auslösen, wie sieht der Code für den Aufruf von R aus?

    1. Ich könnte die jar RCaller falsch installiert haben die für die kommunikation zwischen Java und R gebraucht wird (http://stdioe.blogspot.de/search/label/rcaller).

    Da dieses jar ja offensichtlich genutzt wird, wäre das unwahrscheinlich.

    1. Ich könnte R nicht ausreichend installiert haben. Bei der Anleitung: https://wiki.ubuntuusers.de/R/

    Welche der drei dort angegebenen Alternativen hast du genutzt?

    Habe ich die geschichte mit dem R_Home ausgelassen.

    Du meinst die Zeile sudo make rhome=/usr/local/lib/R-2.xx.x/? Das wäre dann diejenige, die das Programm kompiliert.

    Kannst du R denn ohne Java ausführen? Als der User in dessen Kontext es später laufen wird?

    mfg
    Woodfighter

    1. Das würde dann eine Exception an anderer Stelle auslösen, wie sieht der Code für den Aufruf von R aus?

      analog zu dem code den ich oben gespotet habe. bzw. hab ich noch einen der R aus einer datei einließt und ausführt (alter Code den ich irgendwann mal überarbeiten muss):

      package mainServerApi;
      
      import java.io.BufferedReader;
      import java.io.File;
      import java.io.FileReader;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;
      import java.util.ArrayList;
      import java.util.Properties;
      
      import rcaller.RCaller;
      
      public class ReadAndCallRScript {
      
      	private RCaller call;
      	private String rCode;
      	private ArrayList<String> functionName;
      	private String pfadToR;
      
      	/**
      	 * Der Konstruktor speichert alle relevanten Informationen und erzeugt einen
      	 * RCaller.
      	 * 
      	 * @param nameRScript
      	 * @throws IOException
      	 */
      	public ReadAndCallRScript(ArrayList<String> nameRScript) throws IOException {
      		
      		Properties props = new Properties();
      		props.load(ReadAndCallRScript.class.getResourceAsStream("/portfolioOptimierungTWS.property"));
      		
      		pfadToR = "/usr/bin/Rscript";
      		//props.getProperty("portfolioOptimierungTWS.rPath");
      		call = new RCaller();
      		call.setRscriptExecutable(pfadToR);
      
      		functionName = nameRScript;
      		rCode = "";
      
      		for (int i = 0; i < nameRScript.size(); i++)
      			rCode += "\n" + read("/rSourceLib/" + nameRScript.get(i) + ".R");
      
      	}
      
      	/**
      	 * Ruft das R Script mit dem Input input_timeline auf und returnt das
      	 * Erebniss. visualisierung==true: es wir die methode zum aufrufen von r
      	 * plots genutzt.
      	 * 
      	 * @param input_timeline
      	 * @param visualisierung
      	 * @return
      	 * @throws IOException
      	 */
      	public String callRCode(double[] rendite, String[] input_timeline) throws IOException {
      		String result = "";
      
      		/*
      		 * if(visualisierung) callVisualisierung(); else {
      		 */
      		call.addDoubleArray("rendite", rendite);
      		call.addStringArray("x", input_timeline);
      		call.addRCode(rCode);
      		call.addRCode("result<-" + functionName.get(0) + "(x)");
      
      		call.runAndReturnResult("result");
      		result = call.getParser().getAsStringArray("result")[0];
      
      		call.cleanRCode();
      		//String pfadToR = read("rSourceLib/R.properties");
      		call = new RCaller();
      		call.setRscriptExecutable(pfadToR);
      		// }
      
      		return result;
      	}
      
      	/*public String callRCodeTwo(int[] n, double[] input_timeline) throws IOException {
      		String result = "";
      
      		call.addIntArray("n", n);
      		call.addDoubleArray("x", input_timeline);
      		call.addRCode(rCode);
      		call.addRCode("result<-" + functionName.get(0) + "(n,x)");
      
      		call.runAndReturnResult("result");
      		result = call.getParser().getAsStringArray("result");
      
      		call.cleanRCode();
      		//String pfadToR = read("/R.properties");
      		call = new RCaller();
      		call.setRscriptExecutable(pfadToR);
      
      		return result;
      	}*/
      
      	/**
      	 * Liesst die Datei aus den lokalen Ressourcen ein, die unter dem Pfad pfad
      	 * zufinden ist.
      	 * 
      	 * @param pfad
      	 * @return
      	 * @throws IOException
      	 */
      	public static String read(String pfad) throws IOException {
      		String str = "";
      
      		InputStream is = ReadAndCallRScript.class.getResourceAsStream(pfad);
      		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      
      		String row = "";
      		while ((row = reader.readLine()) != null)
      			str += "\n" + row;
      
      		reader.close();
      		return str;
      	}
      
      	public static ArrayList<String> readA(String pfad) throws IOException {
      		ArrayList<String> l = new ArrayList<String>();
      
      		InputStream is = ReadAndCallRScript.class.getResourceAsStream(pfad);
      		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      
      		String row = "";
      		while ((row = reader.readLine()) != null)
      			l.add(row);
      
      		reader.close();
      		return l;
      	}
      
      	/**
      	 * Liesst die Datei ein, die unter dem Pfad pfad zufinden ist.
      	 * 
      	 * @param pfad
      	 * @return
      	 * @throws IOException
      	 */
      	public static String read2(String pfad) throws IOException {
      		String str = "";
      
      		File file = new File(pfad);
      		BufferedReader reader = new BufferedReader(new FileReader(file));
      
      		String row = "";
      		while ((row = reader.readLine()) != null) {
      			if (!str.equals(""))
      				str += "\n";
      
      			str += row;
      		}
      
      		reader.close();
      		return str;
      	}
      
      }
      
      
      1. Ich könnte die jar RCaller falsch installiert haben die für die kommunikation zwischen Java und R gebraucht wird (http://stdioe.blogspot.de/search/label/rcaller).

      Da dieses jar ja offensichtlich genutzt wird, wäre das unwahrscheinlich.

      ich benutze "sudo R" um dann Runiversal mit installPackag zu installieren. sprich ich hab den befehl in die R console geschrieben und fertig. ich denke das reicht (so hats zumindest bei windows gereicht)?

      1. Ich könnte R nicht ausreichend installiert haben. Bei der Anleitung: https://wiki.ubuntuusers.de/R/

      Welche der drei dort angegebenen Alternativen hast du genutzt?

      ich habe ubuntu 15 (glaube ich) und habe:

      das hier irgendwo in die conf eingetragen: deb http://ftp5.gwdg.de/pub/misc/cran/bin/linux/ubuntu trusty/

      das hier gemacht: sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com E084DAB9

      und das hier: sudo apt-get install r-base

      Kannst du R denn ohne Java ausführen? Als der User in dessen Kontext es später laufen wird?

      als ein user kann ich das, welchen user mein tomcat benutzt weiß ich aber garnicht. es gibt eigendlich nur einen user auf meinem ubuntu und das was als root da war, mein tomcat müsste vom root installiert werden sein (als default beim ubuntu installieren)

      1. Tach,

        ich habe ubuntu 15

        spielt hier zwar keine Rolle, aber das ist keine vollständige Ubuntu-Versionsnummer, da hängt auch immer noch die Monatsangabe mit dran (lsb_release -a verrät genaueres).

        als ein user kann ich das, welchen user mein tomcat benutzt weiß ich aber garnicht.

        grep USER /etc/default/tomcat*

        es gibt eigendlich nur einen user auf meinem ubuntu und das was als root da war,

        Ich würde eher davon ausgehen, dass es so 30 aufwärts sind (wc -l /etc/passwd).

        mein tomcat müsste vom root installiert werden sein (als default beim ubuntu installieren)

        Dann heißt der Tomcat-User vermutlich tomcat8 (Versionsnummer passend auswählen).

        mfg
        Woodfighter

        1. Ubuntu 15.15 und tomcat7 als Tomcat_User

          Wie kann ich mich mit tomcat7 als User anmelden? per putty console bin ich standartmäßig mit meinem Standartnutzer drin, wie kann ich von diesem wechseln und wie finde ich das passwort für tomcat7? bzw. ist das passwort analog zur webanwendung von tomcat?

          1. username tomcat7 kann ich bei putty eingeben, aber das passwort find ich nicht

          2. Tach,

            Wie kann ich mich mit tomcat7 als User anmelden? per putty console bin ich standartmäßig mit meinem Standartnutzer drin, wie kann ich von diesem wechseln

            sudo su - tomcat7 -s/bin/bash

            und wie finde ich das passwort für tomcat7? bzw. ist das passwort analog zur webanwendung von tomcat?

            Der User hat kein PW und soll sich auch nicht einloggen können.

            Das alles wird aber dein Problem nicht lösen, würde RCaller das RScript nicht aufrufen können, bekämst du eine andere Fehlermeldung.

            mfg
            Woodfighter

            1. hm und was mach ich jetzt?

              1. https://github.com/Jaccobi/rcaller/issues/1

                im link steht auch was von install.packages("Runiversal") bei einer ähnlichen fehlermeldung.

                aber ka wie ich kontrolliere ob mir dieses packet bei ubuntu ins richtige verzeichnis gehauen wird etc.

  4. Tach,

    das ganze funktioniert jetzt. Das Problem war das ich die rcaller jar zweimal im Projekt hatte, einmal in einem lib Ordner auf Ebene des SRC Ordner uns einmal im Ordner WEB-INF. Bei Letzterem habe ich leider vergessen die rcaller jar gegen die 2.5 version auszutauschen. Jetzt nachdem ich das gemacht habe, funktioniert alles auf ubuntu wie es soll.

    hintergrund ist, dass bei WAR Projekten, externe jars aus dem WEB-INF verzeichnis geholt werden sollen.