Skip to content
marmbrus edited this page Oct 11, 2011 · 43 revisions

#Deploylib Deploylib is a scala tool for setting up and interacting with a cluster of compute nodes, either privately owned or on Amazon EC2. It is also integrates with Mesos, the cluster management platform, so it is capable of launching and managing Mesos masters, slaves, and Mesos applications. In particular, there is a framework for running and managing Java or Scala services (jars) and web services (wars via Jetty).

Setting up deploylib

Prerequisites

Install SCADS (see the "How to install and build SCADS" section of the wiki Home).

Environment Variables

In addition to the prerequisites, you must set the following environment variables:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_KEY_NAME
  • AWS_KEY_PATH
  • EC2_PRIVATE_KEY
  • EC2_CERT

Once these variables are set different regions can be accessed by using the following objects (USEast1, USWest1, EUWest1, APNortheast1, APSoutheast1).

Setting up EC2 Keypairs

Your ssh keypair can be imported into EC2 using <region>.importKeyPair.

Security Group Configuration

The following ports need to be open in the default security group: 22, 2181, 5050, 8080, 8081, 9000. This can be done automatically by calling <region>/openPorts.

Starting the deploylib console

The deploylib console can be started for any SCADS subproject by using running bin/sbt <subproject>/deploy-console. The deploy-console contains a pointer to all the jars needed to execute the current project on a remote machine.

Controlling remote machines

Deploylib is preconfigured to control both machines on EC2 and machines on the rcluster. Commands on sets of machines can be run in parallel by prepending function names with the letter p (ex: pmap, pforeach, pflatMap). For example:

scala> import deploylib.rcluster._
import deploylib.rcluster._

scala> (r2 !? "hostname").trim
res3: java.lang.String = r2

scala> val inst = EC2West.runInstance
scala> inst.publicDnsName

scala> USWest1.activeInstances.pmap(_ !? "date").map(_.trim)
res2: List[java.lang.String] = List(Sun Sep 25 03:57:27 UTC 2011, Sun Sep 25 03:57:27 UTC 2011, Sun Sep 25 03:57:27 UTC 2011, Sun Sep 25 03:57:28 UTC 2011, Sun Sep 25 03:57:28 UTC 2011)

More commands can be found in the scalaDoc for RClusterNode and EC2Instance

Using deploylib with Mesos

You can use deploy lib to start and manage a Mesos cluster running on EC2. To familiarize yourself with Mesos, check out the Mesos homepage.

Using Mesos on EC2

Create a cluster object by running new mesos.Cluster(<region>), where region is either EC2East or EC2West. Here are a some of the most important functions you'll be using on a mesos cluster:

  • cluster.setup() - start ec2 instances, if they aren't running, and setup services for the mesos-master, zookeeper, and at least one mesos slave. Optionally specify numSlaves to start more than one.
  • cluster.restart[Masters|Slaves|ZooKeepers]() - restart mesos services.
  • cluster.addSlaves(num) - Add slaves to a running mesos cluster.
  • cluster.stopAllInstances - stop all ec2 instances

More commands can be found in the scalaDoc for mesos.Cluster.

Run SCADS on Mesos

To start a scads storage node on EC2:

import org.apache.zookeeper.CreateMode
val engineTask = ScalaEngineTask(cluster.zooKeeperRoot.getOrCreate("/home/marmbrus/scads").createChild("testCluster", mode=CreateMode.PERSISTENT_SEQUENTIAL).canonicalAddress).toJvmTask
serviceScheduler !? RunExperimentRequest(engineTask :: Nil)