/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.mesos; import alluxio.Configuration; import alluxio.PropertyKey; import com.beust.jcommander.JCommander; import com.beust.jcommander.Parameter; import com.google.protobuf.ByteString; import org.apache.mesos.MesosSchedulerDriver; import org.apache.mesos.Protos; import org.apache.mesos.Scheduler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; import javax.annotation.concurrent.NotThreadSafe; /** * {@link AlluxioFramework} is an implementation of a Mesos framework that is responsible for * starting Alluxio processes. The current implementation starts a single Alluxio master and n * Alluxio workers (one per Mesos slave). * * The current resource allocation policy uses a configurable Alluxio master allocation, while the * workers use the maximum available allocation. */ @NotThreadSafe public class AlluxioFramework { private static final Logger LOG = LoggerFactory.getLogger(AlluxioFramework.class); @Parameter(names = {"-m", "--mesos"}, description = "Mesos master location, e.g. localhost:5050") private String mMesosMaster; @Parameter(names = {"-a", "--alluxio-master"}, description = "Host to launch the Alluxio Master on") private String mAlluxioMasterHostname; /** * Creates a new {@link AlluxioFramework}. */ public AlluxioFramework() {} /** * Runs the mesos framework. */ public void run() { Protos.FrameworkInfo.Builder frameworkInfo = Protos.FrameworkInfo.newBuilder() .setName("alluxio").setCheckpoint(true); if (Configuration.containsKey(PropertyKey.INTEGRATION_MESOS_ROLE)) { frameworkInfo.setRole(Configuration.get(PropertyKey.INTEGRATION_MESOS_ROLE)); } // Setting the user to an empty string will prompt Mesos to set it to the current user. if (Configuration.containsKey(PropertyKey.INTEGRATION_MESOS_USER)) { frameworkInfo.setUser(Configuration.get(PropertyKey.INTEGRATION_MESOS_USER)); } if (Configuration.containsKey(PropertyKey.INTEGRATION_MESOS_PRINCIPAL)) { frameworkInfo.setPrincipal(Configuration.get(PropertyKey.INTEGRATION_MESOS_PRINCIPAL)); } Scheduler scheduler = new AlluxioScheduler(mAlluxioMasterHostname); Protos.Credential cred = createCredential(); MesosSchedulerDriver driver; if (cred == null) { driver = new MesosSchedulerDriver(scheduler, frameworkInfo.build(), mMesosMaster); } else { driver = new MesosSchedulerDriver(scheduler, frameworkInfo.build(), mMesosMaster, cred); } int status = driver.run() == Protos.Status.DRIVER_STOPPED ? 0 : 1; System.exit(status); } private static Protos.Credential createCredential() { if (!(Configuration.containsKey(PropertyKey.INTEGRATION_MESOS_PRINCIPAL) && Configuration.containsKey(PropertyKey.INTEGRATION_MESOS_SECRET))) { return null; } try { Protos.Credential.Builder credentialBuilder = Protos.Credential.newBuilder() .setPrincipal(Configuration.get(PropertyKey.INTEGRATION_MESOS_PRINCIPAL)).setSecret( ByteString.copyFrom( Configuration.get(PropertyKey.INTEGRATION_MESOS_SECRET).getBytes("UTF-8"))); return credentialBuilder.build(); } catch (UnsupportedEncodingException ex) { LOG.error("Failed to encode secret when creating Credential.", ex); } return null; } /** * Starts the Alluxio framework. * * @param args command-line arguments */ public static void main(String[] args) throws Exception { AlluxioFramework framework = new AlluxioFramework(); JCommander jc = new JCommander(framework); try { jc.parse(args); } catch (Exception e) { System.out.println(e.getMessage()); jc.usage(); System.exit(1); } framework.run(); } }