不一樣的分佈式運算框架(spark,hadoop,ES,MPI,Cassandra,etc.)中的不一樣任務每每須要的資源(內存,CPU,網絡IO等)不一樣,它們運行在同一個集羣中,會相互干擾,爲此,應該提供一種資源隔離機制避免任務之間由資源爭用致使效率降低,考慮到資源利用率,運維成本,數據共享等因素,公司通常但願將全部這些框架部署到一個公共的集羣中,讓它們共享集羣的資源,並對資源進行統一使用,這樣,便誕生了資源統一管理與調度平臺,典型的表明就是mesos.java
Apache Mesos採用了master/slave結構來簡化設計,將master儘量作的輕量級,僅保存了各類計算框架(Farmemork)和mesos slave的狀態信息,這些狀態容易在出現故障的時候被重構,除此以外,mesos還可使用zookeeper解決master單點故障問題。python
Mesos Master充當全局資源調度器角色,採用某種策略算法將某個slave上的空閒資源分配給某個Farmework,而各類Farmework則是經過本身的調度器向master註冊進行接入Mesos Slave則是收集任務狀態和啓動各個Farmework和Executor。原理圖以下:linux
在每一臺服務器上安裝Apache Mesos服務,因爲mesos安裝等待時間較長,本文在實驗環境下選擇使用一臺安裝好mesos的虛擬機進行克隆,而後進行後續操做。nginx
cat /etc/redhat-release //查看Linux版本
uname -r/a //查看內核版本算法
tar zxvf jdk-8u91-linux-x64.tar.gz -C /usr/local/
cd /usr/local
mv jdk1.8.0_91/ javadocker
vim /etc/profileapache
export JAVA_HOME=/usr/local/java //末尾追加 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
source /etc/profilejson
yum groupinstall -y "Development Tools"vim
wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repocentos
yum install -y apache-maven python-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel apr-util-devel subversion-devel
vim /etc/yum.repos.d/wandisco-svn.repo
[WANdiscoSVN] name=WANdisco SVN Repo 1.9 enabled=1 baseurl=http://opensource.wandisco.com/centos/7/svn-1.9/RPMS/$basearch/ gpgcheck=1 gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
vim /etc/profile
export MESOS_NATIVE_JAVA_LIBRARY=/usr/local/lib/libmesos.so export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so
wget http://www.apache.org/dist/mesos/0.25.0/mesos-0.25.0.tar.gz
tar zxvf mesos-0.25.0.tar.gz -C /opt/
mv mesos-0.25.0/ /root/
cd /root/mesos-0.25.0
mkdir build
cd /build 建立build爲編譯安裝目錄
../configure 執行安裝程序make 等待時間較長(須要服務器保持在線狀態)
make check
make install
Mesos-Master負責維護slave羣集的心跳,從slave提取資源信息。配置以前須要作好相應的解析工做。
hostnamectl set-hostname master
vim /etc/hosts
192.168.144.114 master //此時只作單臺master與slave,若遇多臺則解析內容須要增長 192.168.144.119 slave1
bash 刷新生效主機名,或者重啓服務器
ln -sf /root/mesos-0.25.0/build/bin/mesos-master.sh /usr/sbin/mesos-master
mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0
--work_dir 指定工做目錄 --log_dir 指定日誌生成位置 --no-hostname_lookup 不指定域名解析 --ip=0.0.0.0 任意網段都可訪問
hostnamectl set-hostname slave1
vim /etc/hosts
192.168.144.114 master //此時只作單臺master與slave,若遇多臺則解析內容須要增長 192.168.144.119 slave1
ln -sf /root/mesos-0.25.0/build/bin/mesos-slave.sh /usr/sbin/mesos-slave
yum install docker -y
systemctl start docker.service
systemctl enable docker.service
mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=192.168.175.132:5050 --no-hostname_lookup --ip=0.0.0.0
--containerizers="mesos,docker" 添加容器參數,使docker的容器能夠被配置去執行任務或者執行器。
vim /etc/hosts
192.168.144.114 master 192.168.144.117 master1 192.168.144.118 master2 192.168.144.119 slave1 192.168.144.120 slave2
vim /etc/hosts
192.168.144.114 master 192.168.144.117 master1 192.168.144.118 master2 192.168.144.119 slave1 192.168.144.120 slave2
tar zxvf zookeeper-3.4.13.tar.gz -C /home/q/
cd zookeeper-3.4.13/
mv conf/zoo_sample.cfg conf/zoo.cfg 注意sample.cfg與zoo.cfg只能存在一個,只能識別一個cfg
cd /home/q/zookeeper-3.4.13/conf
vim zoo.cfg
dataDir=/home/q/zookeeper-3.4.6/data //修改數據存放目錄 dataLogDir=/home/q/zookeeper-3.4.6/datalog //日誌文件位置 server.1=192.168.144.114:2888:3888 //server後面跟上區分每一臺master標識 server.2=192.168.144.117:2888:3888 server.3=192.168.144.118:2888:3888
scp zoo.cfg 192.168.144.117:/home/q/zookeeper-3.4.13/conf/
scp zoo.cfg 192.168.144.118:/home/q/zookeeper-3.4.13/conf/
//在master主機上操做(/home/q/zookeeper-3.4.13/中) mkdir data datalog echo 1 > data/myid cat data/myid //在master1主機上操做(/home/q/zookeeper-3.4.13/中) mkdir data datalog echo 2 > data/myid cat data/myid //在master2主機上操做(/home/q/zookeeper-3.4.13/中) mkdir data datalog echo 3 > data/myid cat data/myid
cd /home/q/zookeeper-3.4.13/ //在master主機上啓動服務 ./bin/zkServer.sh start conf/zoo.cfg //在master1主機上啓動服務 ./bin/zkServer.sh start conf/zoo.cfg //在master2主機上啓動服務 ./bin/zkServer.sh start conf/zoo.cfg //查看leader ./bin/zkServer.sh status
//master mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.144.114:2181/mesos --quorum=2 //想要在後臺運行後面加上&>/dev/null &便可 //master1 mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.144.117:2181/mesos --quorum=2 //master2 mesos-master --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --no-hostname_lookup --ip=0.0.0.0 --zk=zk://192.168.144.118:2181/mesos --quorum=2 ----------------------- //在slave1上 mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --no-hostname_lookup --ip=0.0.0.0 //在slave2上 mesos-slave --containerizers="mesos,docker" --work_dir=/home/q/mesos/data --log_dir=/home/q/mesos/logs --master=zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --no-hostname_lookup --ip=0.0.0.0
wget http://downloads.mesosphere.com/marathon/v0.15.2/marathon-0.15.2.tgz
tar zxvf marathon-0.15.2.tgz -C /home/q/
./bin/start --hostname 192.168.144.114 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0 ./bin/start --hostname 192.168.144.117 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0 ./bin/start --hostname 192.168.144.118 --master zk://192.168.144.114:2181,192.168.144.117:2181,192.168.144.118:2181/mesos --http_address 0.0.0.0
查看任務執行狀況。
vim nginx.json
{ "id":"/nginx", "container":{ "type":"DOCKER", "docker":{ "image":"nginx", "network":"HOST", "parameters":[], "privileged":false, "forcePullImage":false } }, "cpus":0.1, "mem":32.0, "instances":1 }
curl -X POST -H "Content-type:application/json" http://192.168.144.114:8080/v2/apps -d@nginx.json
root 3668 0.0 0.6 121912 12872 pts/0 Sl+ 10:20 0:00 /usr/bin/docker-current -H unix:///var/run/docker.sock pull nginx:latest
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest c82521676580 3 weeks ago 109 MB
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9940ac858a3b nginx "nginx -g 'daemon ..." 3 minutes ago Up 3 minutes mesos-0d21cffd-8a12-450d-b6ff-4d4befcdaad0-S1.89e29728-37cb-4ea3-9518-2d9741ba7618
測試其中一臺slave