近期的一项任务是对比Hadoop和Spark两种分布式计算框架的迭代性能,为了更加充分合理地管理集群中的资源,用到了mesos这种资源管理平台。mesos最初是UC Berkeley AMP实验室的一个研究项目,后来开源,并加入Apache,成为一个孵化器项目。
从其主页可以了解到mesos是一种集群管理器,它为不同的分布式应用或框架提供高效的资源隔离与共享服务。在mesos上面可以运行Hadoop, MPI, Hypertable, Spark和其他应用。
mesos的用途有四点:1. 在一个动态共享的结点池中运行Hadoop, MPI, Spark和其他框架 2. 在同一个集群上运行多个Hadoop实例,以隔离生产和实验作业,甚至是多个版本的Hadoop作业 3. 在相同的结点集合上以批应用的形式运行长期服务(比如Hypertable, Hbase) 4. 无需重新设计低级基础设施就可以构建新的集群计算框架,并使其与现存框架共存。
mesos的特征有:1. 使用Zookeeper,使主结点具有容错性 2. 使用快速、事件驱动的C++实现,能够扩展到1万个结点 3. 使用Linux Containers实现了任务之间的隔离 4.多种资源调度(内存和CPU) 5. 高效的应用控制调度机制,让不同框架获得它们自身的安置目标(比如数据局部性)6.支持使用Java, Python, C++来开发新的并行应用 7. Web界面查看集群状态。
首先说明一下集群环境。整个集群由四台主机组成,其中一台为master,另外三台为slave。这四台主机运行的系统为Ubuntu 11.10。主结点的hostname为master,三个从结点的hostname分别为slave1, slave2, slave3。这四台主机的/etc/hosts文件中均包含如下四行映射关系:
#ip-host映射关系 192.168.2.100 master 192.168.2.101 slave1 192.168.2.102 slave2 192.168.2.103 slave3
注:以上映射关系非常重要,在接下来的配置过程中会一直用到。
还有一点极其关键,在/etc/hosts文件中的第二行是127.0.1.1 hostname,要将所有主机上的这一行都注释调,否则在启动集群时,主结点总是无法启动。更改之后最好重启系统,以使配置生效。
有关master和slave之间的ssh配置就不多说了,网上有很多教程,最后一定要确保从master上能够无密码登录到三个slave上。
安装mesos之前的系统要求:
(1)g++ 4.1或更高版本
(2)Python 2.6 (用于mesos的web界面)
(3) Python 2.6 developer packages
(4)cppunit (用于构建zookeeper)
(5)Java JDK 1.6 或更高版本
(1) - (4)的安装如下:
sudo apt-get install g++ python-dev libcppunit-dev libcppunit-doc
以下是具体安装的过程:
(1)从镜像网站下载Mesos 0.9.0-incubating,得到压缩文件mesos-0.9.0-incubating.tar.gz。
(2) 将压缩文件拷贝到master结点的某个目录中,使用如下命令解压文件, 得到文件夹mesos-0.9.0,进入该文件。
tar zxvf mesos-0.9.0-incubating.tar.gz
(3)进入文件夹mesos-0.9.0后,使用configure脚本配置mesos。有两个比较重要的参数需要传递,一个是JDK安装的根目录,另一个是安装mesos的目标位置。(请将上述两个参数换成你自己系统中的具体位置。如果不指定安装的目标位置,默认位置是/usr/local。)具体命令如下:
./configure --with-java-home=/home/dummy/.java/jdk1.6.0_33 --prefix=/home/dummy/mesos
(4)还是在文件夹mesos-0.9.0下使用如下两个命令来build和安装mesos。 mesos被安装在第(3)步中--prefix参数指定的位置,即/home/dummy/mesos目录下,下面都使用<prefix>来代表mesos的安装目录。
make make install
(5)使用如下命令将mesos拷贝到所有的slave结点。注意,主结点和所有从结点上mesos的位置要保持一致。
scp -r ~/mesos slave1:~/ scp -r ~/mesos slave2:~/ scp -r ~/mesos slave3:~/
(6)在master结点上做如下两个配置。
编辑文件<prefix>/var/mesos/deploy/masters(如果没有可以创建),在文件中列出主结点的主机名或者IP地址。
编辑文件 <prefix>/var/mesos/deploy/slaves(如果没有可以创建),在文件中列出从结点的主机名或者IP地址。
我的配置如下所示:
#masters文件的内容 master #slaves文件的内容 slave1 slave2 slave3
编辑文件<prefix>/var/mesos/conf/mesos.conf(如果没有可以创建),配置主结点的日志文件目录。我的配置如下:
log_dir=/home/dummy/mesos/log/
(7)在所有从结点上做如下配置。
编辑文件<prefix>/var/mesos/conf/mesos.conf(如果没有可以创建),配置从结点的日志文件目录、主结点URI和从结点资源。从结点的资源可以根据每个结点的CPU和内存的空闲情况进行配置,以供mesos调度使用。其中cpus后面的数字代表CPU有几个核,而mem后面的数字代表分配多少空闲内存给mesos使用,单位是MB。
master=master:5050 log_dir=/home/dummy/mesos/log resources=cpus:4;mem:2300
(8)启动与停止mesos集群管理器。
如果配置正确无误,就可以进入目录 <prefix>/sbin/,使用如下命令启动集群管理器。
bash mesos-start-cluster.sh
如果使用的是 Ubuntu 12.04.2 LTS系统,那么在使用上面的命令启动集群管理器的时候,会出现如下错误:
ulimit: error setting limit (operation not permitted)
该错误是由于启动脚本在调用另一个脚本mesos-daemon.sh时,mesos-daemon.sh中试图使用ulimit -n 8192命令来修改可以打开最大文件描述符的数量。在Ubuntu 12.04.2 LTS系统中,针对所有用户,该参数默认设置为1024。而且该参数一旦设置,不能增加。例如当该参数设置为1024后,某一用户的shell进程及其子进程可以使用命令ulimit -n 1024, ulimit -n 1000; ulimit -n 900; 而且当前命令再设置新值时,新值必须小于等于上一次设置的值,超出就会报出上面的错误。因此当mesos-daemon.sh脚本试图使用ulimit -n 8192命令修改新值时,由于8192 > 1024,因而报错。我用的Ubuntu系统是桌面系统,如果使用的操作系统是服务器版本的话,我推断应该不会出现上面的错误,用作服务器的操作系统肯定会把默认值设置的很大。
知道了错误的原因,改错就容易了。我们只需要把系统的默认值调大,大于等于8192即可,我将默认值设为了9000。具体做法如下:
在集群的每一台机器上重复下面三个步骤:
1)切换到root用户,修改/etc/security/limits.conf文件,在文件的最后添加如下两行并保存。其中的通配符*指代所有用户,如果只想为特定用户修改,可以将星号换成特定用户的用户名。
* soft nofile 4096 * hard nofile 4096
2)还是在root用户下,修改/etc/pam.d/common-session文件,在文件的最后添加如下一行并保存。
session required pam_limits.so
3)重启系统,以使修改将生效。
停止mesos集群管理器的命令如下
bash mesos-stop-cluster.sh
(9) mesos启动后,可以通过Web界面来查看集群中的资源,以及集群中正在运行的框架和任务。具体的访问方式是通过浏览器访问master结点的8080接口,即http://master:8080/。如果mesos启动正常,可以在该web界面上看到整个集群的资源总和和每一个slave结点的资源。如果有框架正在运行,还可以看到框架的信息,以及正在执行的任务信息。
重要提示信息:
1)如果提交作业给mesos后,发现作业执行异常,或无法执行,可以查看每个slave结点的/tmp/mesos/slaves/..../stderr文件,以确定问题原因。
2)mesos安装目录下的<prefix>/lib/libmesos-0.9.0.so文件很重要,在以后配置Spark时会需要。