deploy flink on mesos marathon

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.typemesos.mastermesos.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
2
3
4
5
6
7
8
9
10
11
root ('--work_dir')
|-- slaves
| |-- latest (symlink)
| |-- <agent ID>
| |-- frameworks
| |-- <framework ID>
| |-- executors
| |-- <executor ID>
| |-- runs
| |-- latest (symlink)
| |-- <container ID> (Sandbox!)

登陆到本例中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"

只需要将cmd的内容修改为$FLINK_HOME/bin/mesos-appmaster.sh -Dmesos.master=$MESOS_MASTER_IP:5050即可在Mesos中部署Flink集群。

涉及Flink的配置项列表参见Flink官网,资源相关的配置项包括mesos.initial-tasksmesos.resourcemanager.tasks.memmesos.resourcemanager.tasks.cpus,分别代表启用多少个TaskManager以及每个TaskManager分配多少内存和CPU资源。

Mesos的资源分配使用DRF算法,参考论文:Dominant Resource Fairness: Fair Allocation of Multiple Resource Types,解决多种资源类型(主要考虑CPU和内存)的系统的公平资源分配问题。

使用如下json文件启动flink应用:

1
2
3
4
5
6
7
8
{
"id": "/flink/flink1",
"cmd": "/home/flink-1.2.0/bin/mesos-appmaster.sh -Dmesos.master=10.120.177.85:5050 -Dmesos.initial-tasks=3 -Dmesos.resourcemanager.tasks.cpus=1.0 -Dmesos.resourcemanager.tasks.mem=1024 -Djobmanager.web.port=-1",
"cpus": 1,
"mem": 1024,
"disk": 2048,
"instances": 1
}

使用Marathon的应用扩容功能,将实例数改为3:

在Mesos页面中查看部署结果:

Scale Application的过程中,因JobManager RPC端口冲突,会重试数次,最终三个JobManager部署到三个不同的节点上。

再增加一个Flink应用,因集群资源有限,只有三个节点,因此在运行参数中增加-Djobmanager.web.port=8082 -Djobmanager.rpc.port=6124,避免端口冲突。

1
2
3
4
5
6
7
8
{
"id": "/flink/flink2",
"cmd": "/home/flink-1.2.0/bin/mesos-appmaster.sh -Dmesos.master=10.120.177.85:5050 -Dmesos.initial-tasks=3 -Dmesos.resourcemanager.tasks.cpus=1.0 -Dmesos.resourcemanager.tasks.mem=1024 -Djobmanager.web.port=-1 -Djobmanager.rpc.port=6124",
"cpus": 1,
"mem": 1024,
"disk": 2048,
"instances": 1
}

部署结果如下:

6.遇到的问题

  1. 在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>
  2. 在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);
  3. 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
    4
    systemctl stop mesos-master
    systemctl stop mesos-slave
    pkill mesos
    /usr/sbin/mesos-start-cluster.sh
  4. CentOS防火墙问题导致Mesos、Marathon网页无法访问

    1
    systemctl stop firewalld