啟動R後,在互動終端中執行 install.packages("rJava"),下載下傳rJava包編譯一會兒,報類似下面錯誤:
Error : .onLoad failed in loadNamespace() for 'rJava', details:
call: dyn.load(file, DLLpath = DLLpath, ...)
error: unable to load shared object '/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so':
libjvm.so: cannot open shared object file:No such file or directory
Error: loading failed
Execution halted
ERROR: loading failed
* removing ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’
* restoring previous ‘/home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava’
起初 ls -l /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava/libs/rJava.so,沒有rJava.so沒編譯出來。
百度了一番,基本都是說$JAVA_HOME沒設或設定不對,再三确認,$JAVA_HOME是對的,指向環境中的jdk1.8, 并且通過
Sys.setenv(JAVA_HOME=‘/usr/lib/jvm/jdk1.8.0_131’), 也還是不行。
繼續查日志,注意到編譯過程中-I引用的目錄不是java_home所指向的目錄,而是其它java版本的路徑(本機裝了多個JDK),如下:
-I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include -I/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/../include/linux
看來确實是環境變量和引用路徑的問題,繼續改配置:
~/.bashrc中增加:
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$HIVE_HOME/lib:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
這下編譯過了,rJava.so也出來了,并且是64bit的。
但是還有下面的錯:libjvm.so 找不到,導緻rJava 安裝後加載不了,rJava包還是沒通過。
libjvm.so: cannot open shared object file: No such file or directory
進$JAVA_HOME路徑中搜libjvm.so,确實是存在的,還是環境變量的問題? 繼續百度和嘗試,終于下面方面試通了,還有個變量要設:
export LD_LIBRARY_PATH=$JRE_HOME/lib/amd64/server:$JRE_HOME/lib/amd64/
好事多磨,終于看到了可愛的提示:
installing via 'install.libs.R' to /home/hadoop/R/x86_64-pc-linux-gnu-library/3.0/rJava
** R
** inst
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
* DONE (rJava)
The downloaded source packages are in
‘/tmp/RtmpOkzZDC/downloaded_packages’
>
回顧整個過程,總結起來有兩點:
1.各種問題和錯誤都有其原因,一定要有耐心,總能把它找出來并解決掉。
2.配置中的問題與環境相關性較大,最終發現兩個問題都是環境和環境變量設定的問題。回想以前環境JAVA配置過程中好像從來沒expo過這麼多變量,這次可能與本地安裝了多個JDK版本有關吧。
後記:指令行中輸入可檢視R環境中JAVA相關的設定,如下:
$ sudo R CMD javareconf
Java interpreter : /usr/bin/java
Java version : 1.8.0_131
Java home path : /usr/lib/jvm/jdk1.8.0_131/jre
Java compiler : /usr/bin/javac
Java headers gen.: /usr/bin/javah
Java archive tool: /usr/bin/jar
trying to compile and link a JNI progam
detected JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
detected JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG -I/usr/lib/jvm/jdk1.8.0_131/jre/../include -I/usr/lib/jvm/jdk1.8.0_131/jre/../include/linux -fpic -O3 -pipe -g -c conftest.c -o conftest.o
gcc -std=gnu99 -shared -o conftest.so conftest.o -L/usr/lib/jvm/jdk1.8.0_131/jre/lib/amd64/server -ljvm -L/usr/lib/R/lib -lR
JAVA_HOME : /usr/lib/jvm/jdk1.8.0_131/jre
Java library path: $(JAVA_HOME)/lib/amd64/server
JNI cpp flags : -I$(JAVA_HOME)/../include -I$(JAVA_HOME)/../include/linux
JNI linker flags : -L$(JAVA_HOME)/lib/amd64/server -ljvm
Updating Java configuration in /usr/lib/R
Done.