public
Last active

A simple Mesos "Hello World": downloads and starts a Python web server on every node in the cluster.

  • Download Gist
Main.scala
Scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import mesosphere.mesos.util.FrameworkInfo
import org.apache.mesos.MesosSchedulerDriver
 
 
/**
* @author Tobi Knaup
*/
 
object Main extends App {
 
val framework = FrameworkInfo("ScalaMesos")
 
val scheduler = new ScalaScheduler
 
val driver = new MesosSchedulerDriver(scheduler, framework.toProto, "zk://localhost:2181/mesos")
driver.run()
}
ScalaScheduler.scala
Scala
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
import java.util
import mesosphere.mesos.util.ScalarResource
import org.apache.mesos.Protos._
import org.apache.mesos.{SchedulerDriver, Scheduler}
import scala.collection.JavaConverters._
 
/**
* @author Tobi Knaup
*/
 
class ScalaScheduler extends Scheduler {
def error(driver: SchedulerDriver, message: String) {}
 
def executorLost(driver: SchedulerDriver, executorId: ExecutorID, slaveId: SlaveID, status: Int) {}
 
def slaveLost(driver: SchedulerDriver, slaveId: SlaveID) {}
 
def disconnected(driver: SchedulerDriver) {}
 
def frameworkMessage(driver: SchedulerDriver, executorId: ExecutorID, slaveId: SlaveID, data: Array[Byte]) {}
 
def statusUpdate(driver: SchedulerDriver, status: TaskStatus) {
println(s"received status update $status")
}
 
def offerRescinded(driver: SchedulerDriver, offerId: OfferID) {}
 
def resourceOffers(driver: SchedulerDriver, offers: util.List[Offer]) {
for (offer <- offers.asScala) {
println(s"offer $offer")
 
val cmd = CommandInfo.newBuilder
.addUris(CommandInfo.URI.newBuilder.setValue("https://gist.github.com/guenter/7470373/raw/42ed566dba6a22f1b160e9774d750e46e83b61ad/http.py"))
.setValue("python http.py")
val cpus = ScalarResource("cpus", 1.0)
val id = "task" + System.currentTimeMillis()
 
val task = TaskInfo.newBuilder
.setCommand(cmd)
.setName(id)
.setTaskId(TaskID.newBuilder.setValue(id))
.addResources(cpus.toProto)
.setSlaveId(offer.getSlaveId)
.build
 
driver.launchTasks(offer.getId, List(task).asJava)
}
}
 
def reregistered(driver: SchedulerDriver, masterInfo: MasterInfo) {}
 
def registered(driver: SchedulerDriver, frameworkId: FrameworkID, masterInfo: MasterInfo) {}
}
build.sbt
Scala
1 2 3 4 5 6 7 8 9 10 11 12
name := "ScalaMesos"
 
version := "1.0"
 
scalaVersion := "2.10.3"
 
resolvers += "Mesosphere Repo" at "http://downloads.mesosphere.io/maven"
 
libraryDependencies ++= Seq(
"org.apache.mesos" % "mesos" % "0.14.2",
"mesosphere" % "mesos-utils" % "0.0.6"
)

This is the code from my live coding session at the SF Scala meetup. Just drop these files into a dir and sbt run, assuming you have local Mesos cluster and Zookeeper. Otherwise change the zk://localhost:2181/mesos to point to Mesos.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.