转载

《Mesos:大数据资源调度与大规模容器运行最佳实践》——第一章:运行Mesos

本章简要介绍 Apache Mesos 和集群计算框架,并会逐步讲解如何在单节点和多节点上搭建 Mesos。 还会讲述如何使用 Vagrant 在 Amazon EC2 上搭建 Mesos 集群。 本书通篇会交替使 用 Apache Mesos 和 Mesos 两个术语。 本章包括如下内容:

  • 现代数据中心
  • 集群计算框架
  • Mesos 简介
  • 为什么选择 Mesos
  • 单节点 Mesos 集群
  • 多节点 Mesos 集群
  • Amazon EC2 上的 Mesos 集群
  • 使用 Vagrant 运行 Mesos
  • Mesos 社区

现代数据中心

现代应用程序高度依赖于数据。 企业生成并处理的数据呈指数级增长,这逐渐改变了我们 存储及处理数据的方式。 当为存储和处理数据规划现代基础架构时,已经无法仅仅通过购 买硬件扩容来解决问题了。 批量处理、 流处理、 面向用户服务、 图像处理及实时分析,这 些不同的框架变得和支撑它们运行的硬件同样重要。 这些框架才是数据中心世界里的支柱应用程序。

大数据的规模和多样性导致,对于现代工作负载而言,传统的扩容策略已经落伍。 因此, 大型企业转向分布式处理,把大量计算机当成单个巨型机器来使用。 很多资源需求各异的 应用程序共享集群,多种架构之间高效共享资源的关键是力争达到资源的高利用率。 需要 将所有的小型机器整合成单个大型计算机。 Mesos 天生就是这些计算机集群的核心。

传统做法是,各种框架分别单独运行,在框架间静态划分资源,这样会导致资源的使用效 率很低。 将大量日常机器当作单个大型机器使用,能够在所有框架之间弹性地共享资源, 这些需求都要求集群计算框架。 Mesos 的灵感来源于集群内多个框架之间共享资源和提供 资源隔离性的想法。

集群计算框架

在现代集群里,不同的框架所要求的计算需求会非常不同,企业需要运行多种框架,并在其间共享数据和资源。 资源管理程序面临巨大的挑战和互为矛盾的目标:

  • 高效性:高效共享资源是集群管理软件的终极目标。
  • 隔离性:当多个任务共享资源时,最重要的考量之一是确保资源的隔离性。 隔离性和正确调度的整合是保证服务级别协议(SLA)的基础。
  • 可伸缩性:现代基础架构的持续增长要求集群管理程序可以线性伸缩。 一个重要的 可伸缩性指标是框架伸缩决策制定所需的延时。
  • 健壮性:集群管理是中央组件,持续的业务运营要求健壮的集群管理。 从良好测试的代码到容错设计,很多方面都有助于提高健壮性。
  • 可扩展性:在任何公司里,集群管理软件的开发量都非常大,而且这些软件可能已 经使用了数十年。 运营期间,企业政策和/或硬件的变化都不可避免地要求集群资源 管理方式的改变。 因此,对于大型企业来说,可维护性非常重要。 集群管理软件必 须是可配置的,同时考虑到很多约束条件(比如位置、硬件等),并且能够支持多种 框架。

Mesos 简介

Mesos 是集群管理器,力争通过在多种框架之间动态共享资源来优化资源使用率。 该项目 于 2009 年由位于 Berkeley 的加利福尼亚大学发起,已经在很多公司的生产环境上使用过, 包括 Twitter 和 Airbnb。 2013 年 7 月,在该项目孵化大概两年时,就成为 Apache 的最高级 别项目。

Mesos 在多种不同类型的工作之间共享机器(或者节点)的可用资源,如下图所示。 Mesos 可以看作是数据中心的内核,提供所有节点资源的统一视图,所起的作用类似于操作系统 内核在单台机器上的作用,可以无缝地访问多节点资源。 Mesos 提供了帮助构建数据中心 应用程序的核心程序,其核心组件是可伸缩的两阶段调度程序。 Mesos API 允许访问各种 不同的应用程序,而无须向 Mesos 核心程序提供特定领域的信息。因为关注于内核,Mesos 不会遇到中央式调度器天然存在的各种问题。

《Mesos:大数据资源调度与大规模容器运行最佳实践》——第一章:运行Mesos

Mesos 作为数据中心内核

下列组件对于理解 Mesos 的整体架构至关重要。 本节会做简要介绍,之后第 6 章会更加详

细地探讨整体架构的细节。

master

master 负责在 slave 资源和框架之间进行调度。 任何时候,Mesos 只有一个活动的 master, 由 ZooKeeper 使用分布式一致性算法选举产生。 如果 Mesos 配置运行在容错模式下,会 通过分布式主选举协议选出一个 master,其他 slave 则处在待命模式。 从设计角度来讲, Mesos master 本身不会用来做任何重负载计算,这样简化了 master 的设计。 它以资源 offer 的形式将 slave 的资源提供给框架,并且根据已接受的 offer 在 slave 上启动任务。 它同时也 负责任务和框架之间的所有通信。

slave

slave 是 Mesos 集群里真正工作的节点。 它们管理单个节点上的资源,遵守资源政策来适应业务优先级。 slave 管理各种资源,比如 CPU、内存、端口等,同时执行框架递交的任务。

框架

框架是运行在 Mesos 上的应用程序,解决特定的问题。 每一种框架都包括调度程序和执行 程序。 调度程序负责决定接受还是拒绝资源 offer。 执行程序是资源消费者,运行在 slave 上,负责运行任务。

为什么使用 Mesos

Mesos 给开发人员和运维人员都带来了巨大的好处。 它将不同的框架整合到统一的基础框 架上,不仅能够节约基础架构的花费,而且给运维团队带来了便利,也帮助开发人员简化 了基础架构的接口,最终有助于业务上的成功。 下面是企业应该使用 Mesos 的几点原因:

  • Mesos 支持多种工作负载,支持批量处理(Hadoop)、交互式分析(Spark)、实时处 理(Storm、 Samza)、 图像处理(Hama)、 高性能计算(MPI)、 数据存储(HDFS、 Tachyon 和 Cassandra)、Web 应用程序(play)、持续集成(Jenkins、GitLab)等一系 列框架。 而且元调度框架,比如 Marathon 和 Aurora 的大多数已有应用程序无须任 何修改就可以运行在 Mesos 上。 Mesos 还是大规模运行容器的理想选择。 这样的灵 活性使得 Mesos 非常易于部署。
  • Mesos 通过在框架间弹性共享资源来改进资源使用率。 如果没有统一的数据中心操 作系统,不同框架就只能运行在隔离的硬件上。 这样的资源静态划分会导致资源碎 片化,限制资源使用率和吞吐量。 通过 Mesos 实现资源的动态共享,能够帮助达到 更高的资源使用率和吞吐量。
  • Mesos 是一个拥有活跃社区的开源项目。 Mesos 的可插拔式架构使其可以针对企业 需求灵活定制。 Mesos 可以在很多不同的操作系统和硬件上运行,给使用者提供了 非常丰富的选择,避免依赖于某个特定的供应商。 因此,基于Mesos API 开发的程 序可以在多种基础架构上运行。 也就是说,Mesos 应用程序可以同时运行在物理机、 虚拟基础架构和云提供商上。
  • Mesos 最重要的优势应该是帮助开发人员构建高效的现代应用程序。 开发人员从为 单台机器开发应用程序转变成为数据中心开发程序,他们需要 API 帮助其关注于自 己的应用逻辑,而不用花时间理解分布式基础框架的细节。 使用 Mesos,开发人员无须关心分布式细节,只需关注自己应用程序特定领域的逻辑。 同时,Mesos 提供 了丰富的 API,帮助开发出可伸缩的,自动容错的分布式应用程序,更多细节见第 7 章。
  • 大型基础架构的运维通常都十分困难。 Mesos 通过提供资源的一致视图来简化基础 架构的管理。 这增加了运维的敏捷性,同时因为不需要分配单独的集群,用 Mesos 部署新服务速度会更快。 Mesos 非常适合运维人员,它将基础架构资源当作整体管 理,而不是一台台单独的机器。 这意味着 Mesos 可以自适应故障,自动保证高可用 性,而无须任何人工干预。 Mesos 支持隔离良好的多租户部署,这对于大规模运营 来说至关重要。Mesos 还提供了功能全面的 REST、Web 和命令行接口,与现有工具 集成良好,更多细节见第 8 章。
  • Mesos 已经在 Twitter、 Airbnb、 HubSpot、 eBay、 Netflix、 Conviva、 Groupon,以及 很多其他公司里经受了生产环境的考验。 Mesos 能够支撑不同类型公司的多样化需 求,这是 Mesos 能够担任数据中心内核这一角色的最佳证明。

和传统的虚拟化基础架构相比,Mesos 有明显的优势:

  • 很多应用程序不需要虚拟机级别的隔离性,在 Mesos 中可以选择容器级别的隔离来 运行程序。 与 VM 相比容器的额外消耗要小得多,所以这么做不仅可以增大资源使 用率,而且还带来了很多额外的好处,比如更快的启动等。
  • 和 VM 相比,Mesos 大幅降低了基础架构的复杂性。
  • 使用 VM 来达到容错和高可用的目的是非常昂贵并且困难的。 使用 Mesos,硬件故
    障对于应用程序天然透明,Mesos API 能够帮助开发人员轻松处理故障。

既然我们已经了解了使用 Mesos 的优势,那么就来创建一个单节点的 Mesos 集群,开始Mesos 的探索之旅吧。

单节点 Mesos 集群

Mesos 可以在 Linux 和 Mac OS X 上运行。尝试使用 Mesos 的最简方式是搭建一台单机器的 Mesos,我们就从这里开始。 目前,Mesos 并没有为不同的操作系统提供二进制包,需要使 用者下载源代码进行编译。 社区里有编译好的可用二进制包。

Mac OS

Homebrew 是 Mac 上 Linux 风格的软件包管理器。Homebrew 支持 Mesos 的安装,在本地进

行编译。 Mac 上安装 Mesos 需要如下步骤:

1)安装 Homebrew,从 http://brew.sh/ 下载。

2) Homebrew 要求安装 Java。 Mac 自带 Java,因此只需确保 JAVA HOME 设置正确。

3) 使用 Homebrew 安装 Mesos,键入如下命令:

mac@master:˜ $ brew install mesos

虽然 Homebrew 提供了在 Mac 上搭建 Mesos 的方式,不过生产环境还是推荐在 Linux 上运行。

Fedora

从 Fedora 21 开始,Fedora 仓库里包含 Mesos 软件包。其中,mesos-master 和 mesos-slave 软件包分别安装在 master 和 slave 上。 mesos 软件包包含 master 和 slave 的软件程序。 在版本

¿=21 的 Fedora 上安装 mesos 软件包,使用如下命令:

fedora@master:˜ $ sudo yum install -y mesos

现在就可以按照之后“启动 Mesos”小节的步骤来运行 Mesos。 对于版本小于 21 的 Fedora, 需要安装依赖软件包,然后编译源代码后进行安装,这种方式类似于 CentOS,会在后文中 详细介绍。

安装依赖软件包

Mesos 要求安装如下依赖软件包:

  • g++(>=4.1)
  • Python 2.6 开发包
  • Java 开发工具集(>=1.6)和 Maven
  • cURL 库
  • SVN 开发库
  • Apache 便携运行时库(APRL)
  • 简单身份验证和安全层(SASL)库

另外,如果想从 git 库构建 Mesos 的话,还需要 autoconf(版本 1.12)和 libtool。 Mesos 的 安装在不同操作系统上有些区别,我们会详细介绍在 Ubuntu 14.10 和 CentOS 6.5 上安装 Mesos 的具体步骤。 在其他操作系统上的步骤与之类似。

CentOS

按照下述步骤在 CentOS 上安装所需依赖软件包:

1)目前,CentOS 默认仓库不提供 >=1.8 的 SVN 库,需要手动添加所需仓库。 在/etc/yum.repos.d/ 下创建文件 wandisco-svn.repo,并添加如下行:

centos@master:˜ $ sudo vim /etc/yum.repos.d/wandisco-svn.repo
[WandiscoSVN] name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/6/svn-1.8/RPMS/$base arch/
enabled=1 gpgcheck=0

然后使用如下命令安装 libsvn:

centos@master:˜ $ sudo yum groupinstall -y "Development Tools"

2) Maven 的安装需要先下载,然后解压缩,并且放到 PATH 里。 如下命令会在下载完

成后将文件解压缩到 /opt 目录,并将 mvn 链接到 /usr/bin:

centos@master:˜ $ wget http://mirror.nexcess.net/apache/maven/maven
-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz
centos@master:˜ $ sudo tar -zxf apache-maven-3.0.5-bin.tar.gz -C
/opt/
centos@master:˜ $ sudo ln -s /opt/apache-maven-3.0.5/bin/mvn
/usr/bin/mvn

3)使用如下命令安装其他依赖软件包:

centos@master:˜ $ sudo yum install -y python-devel
java-1.7.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel

Ubuntu

使用如下命令在 Ubuntu 上安装所需依赖软件包:

ubuntu@master:˜ $ sudo apt-get -y install build-essential openjdk-6-jdk python-dev python-boto libcurl4-nss-dev libsasl2-dev libapr1-dev libsvn-dev maven

构建 Mesos

一旦所需软件都安装完成,就可以按照如下步骤构建 Mesos:

1)从 http://mesos.apache.org/downloads/ 下载最新的稳定版本。撰写本书时, 最新版本是 0.21.0。 将文件 mesos-0.21.0.tar.gz 保存到某个目录下。 打开终 端,进入之前保存文件的目录,或者直接在终端运行如下命令下载 Mesos:

ubuntu@master:˜$ wget http://www.apache.org/dist/mesos/0.21.0/mesos
-0.21.0.tar.gz

2)使用如下命令解压缩 Mesos,并进入解压缩后的目录。 注意第二个命令会删除下载的 .tar 文件,并将解压缩的目录重命名,去掉版本号。

ubuntu@master:˜ $ tar -xzf mesos-*.tar.gz 
ubuntu@master:˜ $ rm mesos-*.tar.gz ; mv mesos-* mesos
ubuntu@master:˜ $ cd mesos

3)创建 build 目录。该目录会包含编译后的 Mesos 二进制文件。该步骤是可选的,但 是推荐执行。这样可以将 build 出的文件发布到各个 slave,而无须在每个 slave 上都 编译一次:

ubuntu@master:˜/mesos $ mkdir build 
ubuntu@master:˜/mesos $ cd build

4)运行 configure 脚本配置安装:

ubuntu@master:˜/mesos/build $ ../configure

configure 脚本支持构建环境的调优,可以运行 configure --help 查看详细参 数列表。 缺失了任何依赖的软件包,configure 脚本都会报告出来,用户可以回头重 新安装缺失的软件包。 一旦配置成功,就可以进入下一步。

5)使用 make 完成编译。 这一步可能会花一些时间。 第二个命令是 make check:

ubuntu@master:˜/mesos/build $ make ubuntu@master:˜/mesos/build $ make check

make check 会构建出示例框架。 现在就已经可以在 build 目录下直接运行 Mesos而无须进行安装了。

6)使用如下命令安装 Mesos:

ubuntu@master:˜/mesos/build $ make install

下表是 Mesos 提供的一系列命令:

《Mesos:大数据资源调度与大规模容器运行最佳实践》——第一章:运行Mesos

安装完成后,就可以使用 mesos-local 命令启动本地 Mesos 集群,该命令会在单个进程里同

时启动 master 和 slave 程序,可以帮助快速检查 Mesos 是否正确安装。

启动 Mesos

启动 Mesos 进程。 首先,需要为 Mesos replicated log 创建目录,并赋予目录读写权限:

ubuntu@master:˜ $ sudo mkdir -p /var/lib/mesos 
ubuntu@master:˜ $ sudo chown ‘whoami‘ /var/lib/mesos

如下命令会使用上面创建的目录,启动 master:

ubuntu@master:˜ $ mesos-master --work_dir=/var/lib/mesos
I1228 07:29:16.367847 2900 main.cpp:167] Build: 2014-12-26 06:31:26 by
ubuntu
I1228 07:29:16.368180 2900 main.cpp:169] Version: 0.21.0
I1228 07:29:16.387505 2900 leveldb.cpp:176] Opened db in 19.050311ms I1228 07:29:16.390425 2900 leveldb.cpp:183] Compacted db in 2.731972ms
...
I1228 07:29:16.474812 2900 main.cpp:292] Starting Mesos master
...
I1228 07:29:16.488203 2904 master.cpp:318] Master 20141228-072916-2517893
22-5050-2900 (ubuntu-master) started on master:5050
...
I1228 07:29:16.510967 2903 master.cpp:1263] The newly elected leader is master@master:5050 with id 20141228-072916-251789322-5050-2900
I1228 07:29:16.511157 2903 master.cpp:1276] Elected as the leading master!
...

上面的输出里显示了 build 版本、 master 使用的各种配置及集群里的 master ID。 slave 程序 应该能连上 master。slave 程序可以通过 --master 参数指定 master 的 IP 地址或者主机名。本 书假定运行 master 的机器主机名为 master,读者实际操作时需要根据机器情况使用正确的 主机名或者 IP 地址。

ubuntu@master:˜ $ mesos-slave --master=master:5050

I1228 07:33:32.415714 4654 main.cpp:142] Build: 2014-12-26 06:31:26 by
vagrant
I1228 07:33:32.415992 4654 main.cpp:144] Version: 0.21.0
I1228 07:33:32.416199 4654 containerizer.cpp:100] Using isolation: posix/
cpu,posix/mem
I1228 07:33:32.443282 4654 main.cpp:165] Starting Mesos slave

I1228 07:33:32.447244 4654 slave.cpp:169] Slave started on 1)@ master:5051 I1228 07:33:32.448254 4654 slave.cpp:289] Slave resources: cpus(*):2; mem(*):1961; disk(*):35164; ports(*):[31000-32000]
I1228 07:33:32.448619 4654 slave.cpp:318] Slave hostname: master
I1228 07:33:32.462025 4655 slave.cpp:602] New master detected at master@ master5050
...

如上输出证明 slave 已经连接上了 master,并且列出了 slave 资源。 至此,集群启动成功,已经有一个运行着的 slave 以供随时运行框架。

运行测试框架

Mesos 包含了多种使用 C++、 Java 和 Python 编写的示例测试框架。 这些框架可以用来验证集群是否配置正确。 如下测试框架使用 C++ 运行五个示例应用。 使用如下命令运行:

ubuntu@master:˜/mesos/build/src $ ./test-framework --master=master:5050 I1228 08:53:13.303910 6044 sched.cpp:137] Version: 0.21.0
I1228 08:53:13.312556 6065 sched.cpp:234] New master detected at master@
master:5050
I1228 08:53:13.313287 6065 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:53:13.316956 6061 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0001
Registered!
Received offer 20141228-085231-251789322-5050-5407-O3 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O3 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O3 Task 0 is in state TASK_RUNNING
Task 0 is in state TASK_FINISHED Task 1 is in state TASK_RUNNING Task 1 is in state TASK_FINISHED
Received offer 20141228-085231-251789322-5050-5407-O4 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O4

Launching task 3 using offer 20141228-085231-251789322-5050-5407-O4 Task 2 is in state TASK_RUNNING
Task 2 is in state TASK_FINISHED Task 3 is in state TASK_RUNNING Task 3 is in state TASK_FINISHED
Received offer 20141228-085231-251789322-5050-5407-O5 with mem(*):1961;
disk(*):35164; ports(*):[31000-32000]; cpus(*):2
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O5 Task 4 is in state TASK_RUNNING
Task 4 is in state TASK_FINISHED
I1228 08:53:15.337805 6059 sched.cpp:1286] Asked to stop the driver I1228 08:53:15.338147 6059 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0001’
I1228 08:53:15.338543 6044 sched.cpp:1286] Asked to stop the driver

如上输出显示框架连接到 master,并从 slave 接收了资源 offer。同时也显示了所启动任务的各种状态。 Java 示例框架在目录 src/example/java 下。

ubuntu@master:˜/mesos/build/src/examples/java $ ./test-framework master:5050
I1228 08:54:39.290570 7224 sched.cpp:137] Version: 0.21.0
I1228 08:54:39.302083 7250 sched.cpp:234] New master detected at master@ master:5050
I1228 08:54:39.302613 7250 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:54:39.307786 7250 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0002
Registered! ID = 20141228-085231-251789322-5050-5407-0002
Received offer 20141228-085231-251789322-5050-5407-O6 with cpus: 2.0 and mem: 1961.0
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O6 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O6 Status update: task 1 is in state TASK_RUNNING
Status update: task 0 is in state TASK_RUNNING Status update: task 1 is in state TASK_FINISHED Finished tasks: 1

Status update: task 0 is in state TASK_FINISHED Finished tasks: 2
Received offer 20141228-085231-251789322-5050-5407-O7 with cpus: 2.0 and mem: 1961.0
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O7 Launching task 3 using offer 20141228-085231-251789322-5050-5407-O7 Status update: task 2 is in state TASK_RUNNING
Status update: task 2 is in state TASK_FINISHED Finished tasks: 3
Status update: task 3 is in state TASK_RUNNING Status update: task 3 is in state TASK_FINISHED Finished tasks: 4
Received offer 20141228-085231-251789322-5050-5407-O8 with cpus: 2.0 and mem: 1961.0
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O8 Status update: task 4 is in state TASK_RUNNING
Status update: task 4 is in state TASK_FINISHED Finished tasks: 5
I1228 08:54:41.788455 7248 sched.cpp:1286] Asked to stop the driver I1228 08:54:41.788652 7248 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0002’
I1228 08:54:41.789008 7224 sched.cpp:1286] Asked to stop the driver

类似地,Python 示例框架在目录 src/example/python 下,输出还会显示 frameworkId和各种任务状态:

ubuntu@master:˜/mesos/build/src/examples/python $./test-framework master: 5050
I1228 08:55:52.389428 8516 sched.cpp:137] Version: 0.21.0
I1228 08:55:52.422859 8562 sched.cpp:234] New master detected at master@ master:5050
I1228 08:55:52.424178 8562 sched.cpp:242] No credentials provided. Attempting to register without authentication
I1228 08:55:52.428395 8562 sched.cpp:408] Framework registered with 20141228-085231-251789322-5050-5407-0003
Registered with framework ID 20141228-085231-251789322-5050-5407-0003

Received offer 20141228-085231-251789322-5050-5407-O9 with cpus: 2.0 and mem: 1961.0
Launching task 0 using offer 20141228-085231-251789322-5050-5407-O9 Launching task 1 using offer 20141228-085231-251789322-5050-5407-O9 Task 0 is in state TASK_RUNNING
Task 1 is in state TASK_RUNNING Task 0 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’ Task 1 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’
Received offer 20141228-085231-251789322-5050-5407-O10 with cpus: 2.0 and mem: 1961.0
Launching task 2 using offer 20141228-085231-251789322-5050-5407-O10 Launching task 3 using offer 20141228-085231-251789322-5050-5407-O10 Task 2 is in state TASK_RUNNING
Task 2 is in state TASK_FINISHED Task 3 is in state TASK_RUNNING Task 3 is in state TASK_FINISHED
Received message: ’data with a /x00 byte’ Received message: ’data with a /x00 byte’
Received offer 20141228-085231-251789322-5050-5407-O11 with cpus: 2.0 and mem: 1961.0
Launching task 4 using offer 20141228-085231-251789322-5050-5407-O11 Task 4 is in state TASK_RUNNING
Task 4 is in state TASK_FINISHED
All tasks done, waiting for final framework message Received message: ’data with a /x00 byte’
All tasks done, and all messages received, exiting
I1228 08:55:54.136085 8561 sched.cpp:1286] Asked to stop the driver I1228 08:55:54.136147 8561 sched.cpp:752] Stopping framework
’20141228-085231-251789322-5050-5407-0003’
I1228 08:55:54.136261 8516 sched.cpp:1286] Asked to stop the driver

Mesos Web UI

Mesos 提供 Web UI 来展示 Mesos 集群信息。 可以从 <master-host>:<port> 处访问。 示例中是 http://master:5050 。报告里包括 slave、聚合资源、框架等信息。如下是 Web 接口的截图:

《Mesos:大数据资源调度与大规模容器运行最佳实践》——第一章:运行Mesos

Mesos Web 接口

多节点 Mesos 集群

手动重复之前介绍的步骤,在每个 slave 节点上启动 mesos-slave,从而启动整个集群, 但是在大规模集群上,这样的手动操作既费时又容易出错。 Mesos 的 deploy 目录包含一系 列脚本,可以用来在集群上部署 Mesos。 这些脚本依赖于 SSH 完成部署。 需要搭建免密码 登录的 SSH。 下面开始搭建集群,包括两个 slave 节点(slave1、slave2)和一个 master 节点(master)。

在所有节点上都安装好所需依赖软件包之后,完成集群配置,确保节点机器之间可以互相

访问。 如下命令会生成 SSH 密钥,并将其复制到 slave 上:

ubuntu@master:˜ $ ssh-keygen -f ˜/.ssh/id_rsa -P "" ubuntu@master:˜ $ ssh-copy-id -i ˜/.ssh/id_rsa.pub ubuntu@slave1 ubuntu@master:˜ $ ssh-copy-id -i ˜/.ssh/id_rsa.pub ubuntu@slave2

将编译后的 Mesos 复制到两个 slave 上,放到和 master 相同的目录下:

ubuntu@master:˜ $ scp -R build slave1:[install-prefix] 
ubuntu@master:˜ $ scp -R build slave2:[install-prefix]

在 [install-prefix]/var/mesos/deploy/masters 目录创建 masters 文件,可以使用任意编辑器,每一行表示一个 master,在本节示例中,只有一行,如下:

ubuntu@master:˜ $ cat [install-prefix]/var/mesos/deploy/masters master

类似地,slaves 文件列出所有想用作 Mesos slave 的节点:

ubuntu@master:˜ $ cat [install-prefix]/var/mesos/deploy/slaves slave1
slave2

现在,可以使用 mesos-start-cluster 脚本启动整个集群,使用 mesos-stop-cluster停止集群:

ubuntu@master:˜ $ mesos-start-cluster.sh

也可以顺序调用 mesos-start-masters 和 mesos-start-slaves, 这样也能正确地 在 master 节点和 slave 节点上启动相应程序。 该脚本会读取 [install-prefix]/var/ mesos/deploy/mesos-deploy-env.sh 里的环境配置。 另外,为了更好地进行配置管 理,master 和 slave 的配置参数可以分别定义到独立的 [install-prefix]/var/mesos/ deploy/mesos-master-env.sh 和 [install-prefix]/var/mesos/deploy/mesos- slave-env.sh 文件中。

Amazon EC2 上的 Mesos 集群

Amazon 的 Elastic Compute Cloud(EC2)借助于虚拟机技术,提供了按使用情况付费的 资源访问计算能力,是试验 Mesos 的绝佳方式。 Mesos 提供脚本辅助实现在 EC2 上创建各 种不同配置的 Mesos 集群。mesos-ec2 脚本位于 ec2 目录下,允许启动、运行作业,卸载 整个 Mesos 集群。 注意,即使没有构建 Mesos,我们也可以使用该脚本,但是需要安装版 本 >=2.6 的 Python。 可以使用不同名称管理多个集群。

要使用 ec2 脚本, 需要 AWS 密钥对、 access key 和 access secret。 通过环境变量定义 access key 和 access secret。 使用 AWS 管理控制台( https://console.aws.amazon. com/console/home)创建并下载密钥对,并赋予 600 权限:

ubuntu@local:˜ $ chmod 600 my-aws-key.pem
ubuntu@local:˜ $ export AWS_ACCESS_KEY_ID=<your-access-key>
ubuntu@local:˜ $ export AWS_SECRET_ACCESS_KEY=<your-secret-key>

现在就可以使用 Mesos 提供的 EC2 脚本来启动新集群了,使用如下命令:

ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 -k <your-key-pair> -i
<your-identity-file> -s 3 launch ec2-test

这会启动一个名为 ec2-test,有三个 slave 的集群。 脚本执行完毕后,会打印出 Mesos 的 Web UI 链接,格式类似于 <master-hostname>:8080。访问这个 Web 接口可以验证集群 是否已经启动。 该脚本还提供了一些列参数,下表列举了其中一些。 可以运行 mesos-ec2--help 来查看所有可用参数:

《Mesos:大数据资源调度与大规模容器运行最佳实践》——第一章:运行Mesos

可以使用 login 操作,通过集群名称登录到已启动的集群上,命令如下:

ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 -k <your-key-pair> -i
<your-identity-file> login ec2-test

该脚本还会在 /root/ephemeral-hdfs/ 目录下搭建 HDFS 实例,可以通过命令使用该实例。

最后,如下命令可以终止集群。 在终止某个集群前一定要备份好重要数据: ubuntu@local:˜/mesos/ec2 $ ./mesos-ec2 destroy ec2-test

该脚本还支持高级功能,比如用 EBS 后台实例来暂停和重启集群。 任何不清楚的地方请参 照 Mesos 文档。 另外要注意,Mesosphere( http://mesosphere.com )提供了在 Amazon EC2、 Google Cloud 及其他平台上创建弹性 Mesos 集群的便捷方式,和对 Mesos 的商业支 持。

使用 Vagrant 运行 Mesos

Vagrant 提供了很好的方式来创建便携的虚拟环境,使用它可以很容易地在虚拟机里运行Mesos。 本节讲解如何使用 Vagrant 在虚拟机上创建单节点和多节点 Mesos 集群:

1)从 https://www.vagrantup.com/download.html 上下载并安装 Vagrant。Vagrant可以运行在所有主流操作系统上。

2)使用 Vagrant 插件搭建 Vagrant。 执行如下命令完成安装:

ubuntu@local:˜ $ vagrant plugin install vagrant-omnibus vagrant-berkshelf vagrant-hosts vagrant-cachier vagrant-aws

3)从 https://github.com/everpeace/vagrant-mesos/ 下载 Vagrant 配置文件,或者使用 git 克隆文件,并 cd 到目录下:

ubuntu@local:˜ $ git clone https://github.com/everpeace/vagrant- mesos.git ; cd vagrant-mesos

4)对于单节点集群搭建,cd 到 standalone 目录,运行 vagrant up 命令。 这样会 创建一台运行 Mesos master、 slave 和 ZooKeeper 实例的虚拟机。 从 http://192. 168.33.10:5050: 可以访问到 Mesos UI:

ubuntu@local:˜ $ cd standalone ; vagrant up

5)对于多节点集群搭建,cd 到 multinode 目录。 在 cluster.yml 文件里配置创建 多少台虚拟机用于 Mesos master、slave 和 ZooKeeper 实例。默认会创建五个虚拟机, 一台运行 ZooKeeper,两台运行 Mesos master 实例,两台运行 Mesos slave 实例。 从 http://172.31.1.11:5050 可以访问多节点环境的 Mesos Web UI:

ubuntu@local:˜ $ cd multinode ; vagrant up

6)Mesos 集群已经启动并运行。 可以通过 vagrant ssh 命令登录到这些机器上。 单 节点集群里使用 master 和 slave 作为主机名,而在多节点集群里,主机名是 master1、slave1 等:

ubuntu@local:˜ $ vagrant ssh master # to login to master
ubuntu@local:˜ $ vagrant ssh slave # to login to slave

7)可以使用 halt 命令停止虚拟机。 之后使用 up 命令再次启动虚拟机及整个 Mesos 集群。 最后,destroy 命令会删除所有 Vagrant 创建的虚拟机。 注意,必须相应地 在 standalone 或者 multinode 目录下执行 vagrant destroy 命令:

ubuntu@local:˜ $ vagrant halt
ubuntu@local:˜ $ vagrant destroy

Vagrant 搭建方式也允许很多不同的配置,同时支持启动 Amazon EC2 上的 Mesos 集群。 仓库里包含的 vagrant 文件和 README 文件里有更多详细内容。

Mesos 社区

虽然还是个较新的项目,Mesos 已经拥有了表现出色的社区( http://mesos.apache. org/community/)。 小型和大型企业都有很多使用 Mesos 的成功案例( http://mesos.apache.org/docume ... esos/ )。 企业可以使用 Mesos 干 很多事情,从网络服务的数据分析到数据存储框架。

案例研究

很多企业将 Mesos 用于生产环境来简化基础架构管理。 本节列举了一些案例,介绍这些公司是如何使用 Mesos 的。

Twitter

Twitter 是 Mesos 的第一位使用者,其在 Apache 还处于孵化阶段时就向促进 Mesos 项目发 展伸出援手。 Twitter 是一个实时社交平台,在可靠的基础架构的帮助下,解决了著名的“失 败鲸”难题。 Twitter 将 Mesos 作为其整个基础架构的基础,在 Mesos 平台上运行各种各样 的作业,包括分析、 广告平台、 预输入服务和消息基础架构。 所有 Twitter 构建的新服务 都是 Mesos 支撑的,更为重要的是,Mesos 帮助改变了开发人员对分布式环境资源的理 解。 现在开发人员会考虑使用资源的共享池,而不是像以前那样只考虑单台机器的资源。 Twitter 还构建了 Aurora 调度框架来管理在 Mesos 上长期运行的服务。

HubSpot

HubSpot 制造集客营销的产品。 HubSpot 在 Amazon EC2 上运行 Mesos,支持 150 多种不同 类型的服务。 Mesos 改进了资源使用率,在无须运行服务的多个拷贝的前提下确保了高可 用性,降低了基础架构的花费。 HubSpot 意识到使用 Mesos 开发人员能够更快地启动新服 务,服务能够更可靠更容易扩展。 HubSpot 在 Mesos 上创建了 Singularity 框架,并且构建 了平台即服务(Platform-as-a-Servie,PaaS)来促进服务的标准化部署。

Airbnb

Airbnb 是社区驱动的租赁公司,也是 Mesos 的最早使用者之一。 Airbnb 在 Mesos 上使 用 Hadoop、 Spark、 Kafka 及 Cassandra 和 Rails 这样的服务来完成数据分析。 Airbnb 也为 Mesos 创建了 Chronos 调度框架,本书会在第 5 章里详细讨论 Aurora 和 Chronos。

Twitter 的代码构建在 Ruby on Rails 和 JBoss-esque 框架上, 天生就是基于服务的, 而 Airbnb,从另一方面,更多地使用 Mesos 进行数据处理,天然是 ETL。 Twitter 在私有基 础架构上,使用 Solaris Zone 将 Mesos 运行在物理硬件上。 而 Airbnb 使用 AWS 上基于 VMware 和 Xen hypervisor 的虚拟机。这些案例都有力地证明了 Mesos 提供了通用且易于使 用的 API,能够胜任现代分布式基础框架的内核这一角色,可以在多种不同的硬件上运行, 并在其上为多种框架提供服务。

邮件列表

在 http://mesos.apache.org/documentation/latest/ 上有很多与 Mesos 相关的在 线文档,详细讲解了 Mesos 的绝大部分内容。 当文档信息不够时,Mesos 的用户邮件列表 是很好的平台,它使用户可以和其他成员交互,也是 Mesos 社区的关键组成部分。 用户邮 件列表( user@mesos.apache.org )和开发者邮件列表( dev@mesos.apache.org )都 非常活跃,可以讨论 Mesos 的开发和使用问题。

小结

本章首先讲解了现代集群管理框架的概述,随后又演示了如何搭建 Mesos 集群。 至此,已 经可以在 Mesos 上运行多种框架了,接下来的几章会对它们进行深入介绍。 下一章将介绍 Mesos 上的 Hadoop 框架。

正文到此结束
Loading...