Mesos部署
1.下载安装
从官网下载Mesos的rpm安装包(下载链接)并在所有集群节点中安装mesos
1 | rpm -ivh mesos-1.1.0*.rpm |
注:可能会报libevent-devel依赖未安装,使用命令yum install libevent libevent-devel -y
安装
2.集群部署
-
在
/usr/etc/mesos
目录下增加名为masters和slaves的文件,分别配上master节点和agent(worker)节点的ip列表,以换行分隔,以1个master节点2个agent节点为例: -
在master节点所在机器的
/usr/etc/mesos
目录下,增加mesos-master-env.sh脚本(在相同目录下已存在模板),配置mesos工作目录环境变量export MESOS_work_dir=/xxx/xxx
-
在agent节点所在机器(在本例中,包括9.96.101.32和9.96.101.251两个节点)的
/usr/etc/mesos
目录下,增加mesos-agent-env.sh脚本(在相同目录下已存在模板),配置mesos master地址export MESOS_master=xx.xx.xx.xx:5050
,和mesos工作目录环境变量export MESOS_work_dir=/xxx/xxx
-
运行
/usr/sbin/mesos-start-cluster.sh
启动集群 -
访问mesos web页面
http://masterIP:5050
可以查看mesos集群状态和agent列表等信息
3.部署Flink到Mesos
-
修改
FLINK_HOME/conf/flink-conf.yaml
,增加三个配置项:mesos.resourcemanager.tasks.container.type
、mesos.master
、mesos.initial-tasks
,如下图所示,其中mesos.initial-tasks配置项表示taskmanager个数。 -
运行
FLINK_HOME/bin/mesos-appmaster.sh
向mesos注册schduler并启动jobmanager -
查看mesos web页面,可以看到刚才启动的Flink集群在mesos中体现为1个Framework和2个Task(executor),每个java进程(mesos中的executor,flink中的taskmanager)对应一个sandbox
4.查看沙箱目录
沙箱是每个mesos executor工作时的临时目录。存在于agent节点的工作目录下,工作目录的配置见上文。沙箱的目录结构在官方文档中描述如下:
1 | root ('--work_dir') |
登陆到本例中task所在节点9.96.101.251查看两个task各自的sandbox目录,包含了进程的标准输出、错误、日志,以及flink上传的jar包、配置文件和shell脚本等,与yarn的container目录很类似。
沙箱中的文件包含如下三部分:
- mesos在启动executor的task前获取的文件(flink文件夹)
- executor的输出(stderr,stdout)
- executor创建的文件(flink-taskmanager.log等)
Marathon部署
1.简介
1 | Marathon is a production-proven Apache Mesos framework for container orchestration. Marathon provides a REST API for starting, stopping, and scaling applications. |
翻译一下,Marathon是一个在工业界广泛使用的Mesos框架,用于容器编排。Marathon提供了一套REST API用于任务的启动、停止和扩容。
Marathon框架通常用于管理长时间运行的任务。
2.下载安装
从官网下载Marathon的rpm安装包(下载链接)并安装(推荐的安装方式)
1 | rpm -ivh marathon-1.4.0*.rpm |
也可以从Marathon官网下载二进制的包(下载地址),使用$MARATHON_HOME/bin/start --master ip:port --zk zk://ip:port/marathon
启动Marathon。
3.启动
命令样例如下,需要首先启动mesos集群和zk服务,不在此赘述。
1 | /usr/bin/marathon run_jar --master 10.120.177.85:5050 --zk zk://10.120.177.85:2181/marathon |
注:不同版本marathon在zk上的leader信息不兼容,需确保zk中/marathon目录未被不同版本的marathon服务使用过
可以使用/usr/bin/marathon run_jar --help
查看其它配置项说明。
4.提交任务
可以用两种方式提交应用,WebUI和curl。
打开Marathon WebUI(默认端口8080),点击Create Application,可以选在使用JSON模式描述任务信息,或者使用UI界面,本例中使用JSON方式,在cmd中写入运行的命令,点击右下角的Create Application提交。
使用curl方式提交命令格式如下:
1 | curl -X POST http://10.120.177.85:8080/v2/apps -d @basic-0.json -H "Content-type: application/json" |
5.部署Flink
只需要将cmd的内容修改为$FLINK_HOME/bin/mesos-appmaster.sh -Dmesos.master=$MESOS_MASTER_IP:5050
即可在Mesos中部署Flink集群。
涉及Flink的配置项列表参见Flink官网,资源相关的配置项包括mesos.initial-tasks
、mesos.resourcemanager.tasks.mem
和mesos.resourcemanager.tasks.cpus
,分别代表启用多少个TaskManager以及每个TaskManager分配多少内存和CPU资源。
Mesos的资源分配使用DRF算法,参考论文:Dominant Resource Fairness: Fair Allocation of Multiple Resource Types,解决多种资源类型(主要考虑CPU和内存)的系统的公平资源分配问题。
使用如下json文件启动flink应用:
1 | { |
使用Marathon的应用扩容功能,将实例数改为3:
在Mesos页面中查看部署结果:
Scale Application的过程中,因JobManager RPC端口冲突,会重试数次,最终三个JobManager部署到三个不同的节点上。
再增加一个Flink应用,因集群资源有限,只有三个节点,因此在运行参数中增加-Djobmanager.web.port=8082 -Djobmanager.rpc.port=6124
,避免端口冲突。
1 | { |
部署结果如下:
6.遇到的问题
-
在Marathon中部署跨节点Flink集群时,部署失败
查看TaskManager日志,报
Association failed with [akka.tcp://flink@szv1000265118:6123] Connection refused: szv1000265118/10.120.181.94:6123
而JobManager所在节点hostname为SZV1000265118,怀疑与hostname大小写有关。相关github PR,修改hostname后问题解决。
1
hostnamectl set-hostname <hostname>
-
在Marathon中Destroy Application后JobManager退出,但是TaskManager要等数分钟后才退出
查看日志发现TaskManager向JobManager注册多次后超时关闭,查看代码发现
MesosApplicationMasterRunner.java
中有如下代码,TaskManager向JobManager注册的最大超时时间为5分钟,在代码中写死,无配置项。1
private static final FiniteDuration TASKMANAGER_REGISTRATION_TIMEOUT = new FiniteDuration(5, TimeUnit.MINUTES);
-
systemd Mesos守护进程问题
在Mesos集群重启时,经常发现agent进程起不来,
ps -ef | grep mesos
查看系统进程时发现运行/usr/sbin/mesos-stop-cluster.sh
一段时间后,会出现mesos-master和mesos-slave进程。rpm方式安装mesos时,会向systemd注册mesos相关服务,导致mesos相关进程在被杀掉后周期重启,见下图:
使用
systemctl
命令停止mesos相关服务后再启动Mesos集群,问题解决。1
2
3
4systemctl stop mesos-master
systemctl stop mesos-slave
pkill mesos
/usr/sbin/mesos-start-cluster.sh -
CentOS防火墙问题导致Mesos、Marathon网页无法访问
1
systemctl stop firewalld