This is an automated email from the ASF dual-hosted git repository.
vinodkone pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
The following commit(s) were added to refs/heads/master by this push:
new 0ef073c Removed stale MPI framework.
0ef073c is described below
commit 0ef073c1719216415b63a2ead3f9e33d28aa0212
Author: Vinod Kone <[email protected]>
AuthorDate: Mon Mar 2 14:34:32 2020 -0600
Removed stale MPI framework.
The framework code hasn't been touched in years and likely
doesn't work anymore.
Review: https://reviews.apache.org/r/72196
---
Makefile.am | 4 -
configure.ac | 2 -
mpi/README | 63 --------------
mpi/mpiexec-mesos.in | 39 ---------
mpi/mpiexec-mesos.py | 234 ---------------------------------------------------
5 files changed, 342 deletions(-)
diff --git a/Makefile.am b/Makefile.am
index 11192ac..b227461 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -56,10 +56,6 @@ AM_DISTCHECK_CONFIGURE_FLAGS =
--disable-python-dependency-install
AM_DISTCHECK_CONFIGURE_FLAGS += --disable-dependency-tracking
-# MPI framework.
-EXTRA_DIST += mpi/README mpi/mpiexec-mesos.in mpi/mpiexec-mesos.py
-
-
if HAS_JAVA
maven-install:
@cd src && $(MAKE) $(AM_MAKEFLAGS) maven-install
diff --git a/configure.ac b/configure.ac
index 4aa4f76..46ca1c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -200,8 +200,6 @@ AC_CONFIG_FILES([include/mesos/version.hpp])
AC_CONFIG_FILES([src/java/generated/org/apache/mesos/MesosNativeLibrary.java])
-AC_CONFIG_FILES([mpi/mpiexec-mesos], [chmod +x mpi/mpiexec-mesos])
-
###############################################################################
# Optional features.
diff --git a/mpi/README b/mpi/README
deleted file mode 100644
index 691ae78..0000000
--- a/mpi/README
+++ /dev/null
@@ -1,63 +0,0 @@
-Mesos MPICH2 framework readme
---------------------------------------------
-
-Table of Contents:
-1) Installing MPICH2
-2) Running the Mesos MPICH2 framework
-
-=====================
-1) INSTALLING MPICH2:
-=====================
-- This framework was developed for MPICH2 1.2 (mpd was deprecated
- starting 1.3) on Linux(Ubuntu 11.10) and OS X Lion.
- WARNING: MPICH2 later than 1.2 may not run on Mesos.
- (You can configure newer version to include mpd,
- but then mpdtrace may still be missing and
- the executor script used for Mesos relies on it.)
-
-- You can install MPICH2 from scratch. You can get MPICH2 as well as
- installation directions here:
- http://www.mcs.anl.gov/research/projects/mpich2/. This tutorial
- follows the latter. Unpack the tar.gz and...
-
-- To use MPI with Mesos, make sure to have MPICH2 installed on every
- machine in your cluster.
-
-Setting up:
--> Install and configure:
-mac : ./configure --prefix=/Users/_your_username_/mpich2-install
-ubuntu : ./configure --prefix=/home/_your_username_/mpich2-install
- Then...
- sudo make
- sudo make install
-
-
--> Optional: add mpich binaries to PATH. You can specify the path to
- installed MPICH2 binaries using mpiexec-meso's '--path' option
-mac : sudo vim ~/.bash_profile
- export PATH=/Users/_your_username_/mpich2-install/bin:$PATH
-ubuntu : sudo vim ~/.bashrc
- export PATH=/home/_your_username_/mpich2-install/bin:$PATH
-
--> Create .mpd conf file in home directory:
- echo "secretword=nil" > ~/.mpd.conf
- chmod 600 .mpd.conf
-
--> Check installation - these should all return the PATH's set above
- which mpd
- which mpiexec
- which mpirun
-
-
-=====================================
-2) RUNNING THE MESOS MPICH2 FRAMEWORK
-=====================================
-
-Using/testing mpiexec-mesos:
--> Start a Mesos master and slaves
-
--> How to run a Hello, World! program (pass the -h flag to see help options):
- mpicc helloworld.c -helloworld
- ./mpiexec-mesos 127.0.0.1:5050 ./helloworld
- Paths to mesos, protobuf, and distribute eggs can be specified by setting
- respective environment variables in mpiexec-mesos.
diff --git a/mpi/mpiexec-mesos.in b/mpi/mpiexec-mesos.in
deleted file mode 100644
index dc06953..0000000
--- a/mpi/mpiexec-mesos.in
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/sh
-#
-# This is a wrapper script for the MPI launcher framework.
-#
-# This script uses MESOS_SOURCE_DIR and MESOS_BUILD_DIR which come
-# from configuration substitutions.
-MESOS_SOURCE_DIR=@abs_top_srcdir@
-MESOS_BUILD_DIR=@abs_top_builddir@
-
-# Use colors for errors.
-. ${MESOS_SOURCE_DIR}/support/colors.sh
-
-# Force the use of the Python interpreter configured during building.
-test ! -z "${PYTHON}" && \
- echo "${RED}Ignoring PYTHON environment variable (using @PYTHON@)${NORMAL}"
-
-PYTHON=@PYTHON@
-
-SETUPTOOLS=`echo ${MESOS_BUILD_DIR}/3rdparty/setuptools-*/`
-
-# Just warn in the case when build with --disable-bundled.
-test ! -e ${SETUPTOOLS} && \
- echo "${RED}Failed to find ${SETUPTOOLS}${NORMAL}"
-
-PROTOBUF=`echo ${MESOS_BUILD_DIR}/3rdparty/protobuf-*/python/`
-
-test ! -e ${PROTOBUF} && \
- echo "${RED}Failed to find ${PROTOBUF}${NORMAL}"
-
-MESOS_EGGS=$(find ${MESOS_BUILD_DIR}/src/python/dist -name "*.egg" | tr "\\n"
":")
-
-SCRIPT=${MESOS_SOURCE_DIR}/mpi/mpiexec-mesos.py
-
-test ! -e ${SCRIPT} && \
- echo "${RED}Failed to find ${SCRIPT}${NORMAL}" && \
- exit 1
-
-PYTHONPATH="${SETUPTOOLS}:${PROTOBUF}:${MESOS_EGGS}" \
- exec ${PYTHON} ${SCRIPT} "${@}"
diff --git a/mpi/mpiexec-mesos.py b/mpi/mpiexec-mesos.py
deleted file mode 100755
index 932e2f1..0000000
--- a/mpi/mpiexec-mesos.py
+++ /dev/null
@@ -1,234 +0,0 @@
-#!/usr/bin/env python
-
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-
-import mesos.interface
-import mesos.native
-from mesos.interface import mesos_pb2
-import os
-import sys
-import time
-import re
-import threading
-
-from optparse import OptionParser
-from subprocess import *
-
-
-def mpiexec():
- print "We've launched all our MPDs; waiting for them to come up"
-
- while countMPDs() <= TOTAL_MPDS:
- print "...waiting on MPD(s)..."
- time.sleep(1)
- print "Got %d mpd(s), running mpiexec" % TOTAL_MPDS
-
- try:
- print "Running mpiexec"
- call([MPICH2PATH + 'mpiexec', '-1', '-n', str(TOTAL_MPDS)] + MPI_PROGRAM)
-
- except OSError,e:
- print >> sys.stderr, "Error executing mpiexec"
- print >> sys.stderr, e
- exit(2)
-
- print "mpiexec completed, calling mpdallexit %s" % MPD_PID
-
- # Ring/slave mpd daemons will be killed on executor's shutdown() if
- # framework scheduler fails to call 'mpdallexit'.
- call([MPICH2PATH + 'mpdallexit', MPD_PID])
-
-
-class MPIScheduler(mesos.interface.Scheduler):
-
- def __init__(self, options, ip, port):
- self.mpdsLaunched = 0
- self.mpdsFinished = 0
- self.ip = ip
- self.port = port
- self.options = options
- self.startedExec = False
-
- def registered(self, driver, fid, masterInfo):
- print "Mesos MPI scheduler and mpd running at %s:%s" % (self.ip, self.port)
- print "Registered with framework ID %s" % fid.value
-
- def resourceOffers(self, driver, offers):
- print "Got %d resource offers" % len(offers)
-
- for offer in offers:
- print "Considering resource offer %s from %s" % (offer.id.value,
offer.hostname)
-
- if self.mpdsLaunched == TOTAL_MPDS:
- print "Declining permanently because we have already launched enough
tasks"
- driver.declineOffer(offer.id)
- continue
-
- cpus = 0
- mem = 0
- tasks = []
-
- for resource in offer.resources:
- if resource.name == "cpus":
- cpus = resource.scalar.value
- elif resource.name == "mem":
- mem = resource.scalar.value
-
- if cpus < CPUS or mem < MEM:
- print "Declining offer due to too few resources"
- driver.declineOffer(offer.id)
- else:
- tid = self.mpdsLaunched
- self.mpdsLaunched += 1
-
- print "Accepting offer on %s to start mpd %d" % (offer.hostname, tid)
-
- task = mesos_pb2.TaskInfo()
- task.task_id.value = str(tid)
- task.slave_id.value = offer.slave_id.value
- task.name = "task %d " % tid
-
- cpus = task.resources.add()
- cpus.name = "cpus"
- cpus.type = mesos_pb2.Value.SCALAR
- cpus.scalar.value = CPUS
-
- mem = task.resources.add()
- mem.name = "mem"
- mem.type = mesos_pb2.Value.SCALAR
- mem.scalar.value = MEM
-
- task.command.value = "%smpd --noconsole --ncpus=%d --host=%s
--port=%s" % (MPICH2PATH, CPUS, self.ip, self.port)
-
- tasks.append(task)
-
- print "Replying to offer: launching mpd %d on host %s" % (tid,
offer.hostname)
- driver.launchTasks(offer.id, tasks)
-
- if not self.startedExec and self.mpdsLaunched == TOTAL_MPDS:
- threading.Thread(target = mpiexec).start()
- self.startedExec = True
-
- def statusUpdate(self, driver, update):
- print "Task %s in state %s" % (update.task_id.value, update.state)
- if (update.state == mesos_pb2.TASK_FAILED or
- update.state == mesos_pb2.TASK_KILLED or
- update.state == mesos_pb2.TASK_LOST):
- print "A task finished unexpectedly, calling mpdexit on %s" % MPD_PID
- call([MPICH2PATH + "mpdexit", MPD_PID])
- driver.stop()
- if (update.state == mesos_pb2.TASK_FINISHED):
- self.mpdsFinished += 1
- if self.mpdsFinished == TOTAL_MPDS:
- print "All tasks done, all mpd's closed, exiting"
- driver.stop()
-
-
-def countMPDs():
- try:
- mpdtraceproc = Popen(MPICH2PATH + "mpdtrace -l", shell=True, stdout=PIPE)
- mpdtraceline = mpdtraceproc.communicate()[0]
- return mpdtraceline.count("\n")
- except OSError,e:
- print >>sys.stderr, "Error starting mpd or mpdtrace"
- print >>sys.stderr, e
- exit(2)
-
-
-def parseIpPort(s):
- ba = re.search("([^_]*)_([0-9]*)", s)
- ip = ba.group(1)
- port = ba.group(2)
- return (ip, port)
-
-
-if __name__ == "__main__":
- parser = OptionParser(usage="Usage: %prog [options] mesos_master
mpi_program")
- parser.disable_interspersed_args()
- parser.add_option("-n", "--num",
- help="number of mpd's to allocate (default 1)",
- dest="num", type="int", default=1)
- parser.add_option("-c", "--cpus",
- help="number of cpus per mpd (default 1)",
- dest="cpus", type="int", default=1)
- parser.add_option("-m","--mem",
- help="number of MB of memory per mpd (default 1GB)",
- dest="mem", type="int", default=1024)
- parser.add_option("--name",
- help="framework name", dest="name", type="string")
- parser.add_option("-p","--path",
- help="path to look for MPICH2 binaries (mpd, mpiexec,
etc.)",
- dest="path", type="string", default="")
- parser.add_option("--ifhn-master",
- help="alt. interface hostname for what mpd is running on
(for scheduler)",
- dest="ifhn_master", type="string")
-
- # Add options to configure cpus and mem.
- (options,args) = parser.parse_args()
- if len(args) < 2:
- print >> sys.stderr, "At least two parameters required."
- print >> sys.stderr, "Use --help to show usage."
- exit(2)
-
- TOTAL_MPDS = options.num
- CPUS = options.cpus
- MEM = options.mem
- MPI_PROGRAM = args[1:]
-
- # Give options.path a trailing '/', if it doesn't have one already.
- MPICH2PATH = os.path.join(options.path, "")
-
- print "Connecting to Mesos master %s" % args[0]
-
- try:
- mpd_cmd = MPICH2PATH + "mpd"
- mpdtrace_cmd = MPICH2PATH + "mpdtrace -l"
-
- if options.ifhn_master is not None:
- call([mpd_cmd, "--daemon", "--ifhn=" + options.ifhn_master])
- else:
- call([mpd_cmd, "--daemon"])
-
- mpdtraceproc = Popen(mpdtrace_cmd, shell=True, stdout=PIPE)
- mpdtraceout = mpdtraceproc.communicate()[0]
-
- except OSError,e:
- print >> sys.stderr, "Error starting mpd or mpdtrace"
- print >> sys.stderr, e
- exit(2)
-
- (ip,port) = parseIpPort(mpdtraceout)
-
- MPD_PID = mpdtraceout.split(" ")[0]
- print "MPD_PID is %s" % MPD_PID
-
- scheduler = MPIScheduler(options, ip, port)
-
- framework = mesos_pb2.FrameworkInfo()
- framework.user = ""
-
- if options.name is not None:
- framework.name = options.name
- else:
- framework.name = "MPI: %s" % MPI_PROGRAM[0]
-
- driver = mesos.native.MesosSchedulerDriver(
- scheduler,
- framework,
- args[0])
- sys.exit(0 if driver.run() == mesos_pb2.DRIVER_STOPPED else 1)