package api; import edu.ucsb.jpregel.system.ClientToMaster; import edu.ucsb.jpregel.system.Job; import edu.ucsb.jpregel.system.JobRunData; import edu.ucsb.jpregel.system.Worker; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; /** * A clique network comprising master (running an internal worker) and a distributed set of workers. * @author charlesmunger */ public class ClusterImpl extends UnicastRemoteObject implements Cluster { private transient ClientToMaster master; private final MachineGroup<ClientToMaster> masterMachine; private final MachineGroup<Worker> workerMachine; private final String[] args; public ClusterImpl(ReservationService rs,String master, String worker, int numWorkers) throws InterruptedException, ExecutionException, IOException { Future<MachineGroup<ClientToMaster>> masterMachineFut = rs.reserveMaster(master); Future<MachineGroup<Worker>> workers = rs.reserveWorkers(worker, numWorkers); this.args = new String[] {Integer.toString(numWorkers)}; this.masterMachine = masterMachineFut.get(); Future<ClientToMaster> deployMaster = masterMachine.deploy(args); this.workerMachine = workers.get(); workerMachine.deploy(masterMachine.getHostname()); this.master = deployMaster.get(); } public ClusterImpl(MachineGroup<ClientToMaster> masterMachine, MachineGroup<Worker> workerMachine, String[] args) throws IOException, InterruptedException, ExecutionException { this.args = args; this.masterMachine = masterMachine; this.workerMachine = workerMachine; Future<ClientToMaster> deployMaster = masterMachine.deploy(args); workerMachine.deploy(masterMachine.getHostname()); this.master = deployMaster.get(); } public static Cluster getCluster() throws NotBoundException, MalformedURLException, RemoteException { String url = "rmi://localhost:" + Cluster.PORT+ "/" + Cluster.SERVICE_NAME; return (Cluster) Naming.lookup( url ); } @Override public void register() throws RemoteException { Registry registry = LocateRegistry.createRegistry( Cluster.PORT ); registry.rebind(SERVICE_NAME, this); } @Override synchronized public void reset() throws IOException, InterruptedException, ExecutionException { masterMachine.reset(); workerMachine.reset(); Future<ClientToMaster> deploy = masterMachine.deploy(args); workerMachine.deploy(masterMachine.getHostname()); this.master = deploy.get(); } /** * Run a job and return its execution performance data. * @param job the job to be run * @return Execution performance data * @throws RemoteException * @throws InterruptedException */ @Override synchronized public JobRunData run(Job job) throws RemoteException, InterruptedException { return master.run(job); } @Override public JobRunData run(Job job, String localJobDirectoryPathName) throws RemoteException, InterruptedException { System.out.println("ClusterImpl.run: S3 job directory name: " + job.getJobDirectoryName()); // new AmazonS3Client(PregelAuthenticator.get()).putObject( job.getJobDirectoryName(), "input", new File( localJobDirectoryPathName ) ); return run(job); } @Override public void terminate() throws IOException { masterMachine.terminate(); workerMachine.terminate(); } }