File协议
startRemoteEngine.sh
java -Xmx1024m -classpath ../db_drivers/mysql-connector-java-5.1.46.jar;remoteEngine.jar;../weka3.7.13.jar -Djava.security.policy=remote.policy weka.experiment.RemoteEngine
在Ubuntu上执行报错:
./startRemoteEngine.sh: line 1: remoteEngine.jar: command not found
./startRemoteEngine.sh: line 1: /home/ubuntu/WorkSpace/experiment/weka3.7.13.jar: cannot execute binary file: Exec format error
修改:
./remoteEngine.jar
修改weka3.7.13的执行权限:chmod +x weka3.7.13.jar(不管用)
-claspath在windows环境下用分号分隔,在Linux环境下用冒号分隔后可以运行,但Linux下出现如下问题:
ubuntu@VM-16-184-ubuntu:~/WorkSpace/experiment/remote_engine$ ./startRemoteEngine.sh
Host name : localhost.localdomain
RemoteEngine exception: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")
java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
java.security.AccessController.checkPermission(AccessController.java:884)
java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
java.net.Socket.connect(Socket.java:584)
java.net.Socket.connect(Socket.java:538)
java.net.Socket.<init>(Socket.java:434)
java.net.Socket.<init>(Socket.java:211)
sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147)
java.rmi.Naming.rebind(Naming.java:177)
weka.experiment.RemoteEngine.main(RemoteEngine.java:360)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
at java.net.Socket.connect(Socket.java:584)
at java.net.Socket.connect(Socket.java:538)
at java.net.Socket.<init>(Socket.java:434)
at java.net.Socket.<init>(Socket.java:211)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338)
at sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147)
at java.rmi.Naming.rebind(Naming.java:177)
at weka.experiment.RemoteEngine.main(RemoteEngine.java:360)
原因是remote.policy文件没有起作用,修改为-Djava.security.policy=./remote.policy
关键在于Linux下的当前文件夹不可省略./ ,而在Windows下当前文件夹可以省略./
运行实验时出错:
15:59:07: Started
15:59:09: Starting dataset :breast-cancer.arff on host 119.29.23.188
15:59:10: Connection to 119.29.23.188 failed. Scheduling dataset :breast-cancer.arff for execution on another host.
15:59:10: Experiment aborted! All connections to remote hosts failed.
参考Java RMI:rmi Connection refused to host: 127.0.0.1异常解决后在startRemoteEngine.sh(Linux端)添加:-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
最终执行成功!
注意每次实验前
drop database weka;
create database weka;
commit;