DCOS应用案例(三):文章分类与热词推荐——混合部署、大数据典型实践

这是DCOS上的大数据项目。项目来源自一个互联网媒体客户,需求是将积累的媒体文章进行分类,并找出能代表一篇文章的关键词作为文章标签,用于进行文章的分类或热词统计等数据分析,文章数量近5万余篇,且在不断增加。

项目选用 Apache Spark 作为计算框架,并通过 Spark MLlib 提供的 LDA 算法对文章进行聚类,得到“文章-主题”和“主题-关键词”矩阵,并以主题词作为文章标签,对文章进行归类。

Apache Spark 作为一个分布式大数据计算框架,与 Apache Mesos 完美结合。Mesos 作为 Spark 集群的资源调度器,可以将 Mesos 集群的资源以粗、细两种粒度分配给 Spark;在 Spark 完成计算任务后,Mesos 可以将资源回收,供其他服务使用。

从上图看出,项目一共包括数据预处理、模型训练、预测训练集三个离线计算任务,和一个提供预测、添加文章、热词查询等功能的服务模块。

系统痛点:

Spark 计算任务需要大量计算资源,主要工作时间在凌晨时间,这些资源在白天是闲置的。该系统还需要 Nginx、MySQL 等服务组件,如果能将它们混补在同一组服务器上,则可以降低成本,提高资源利用率。

本案通过数人云管理 Mesos 集群,通过 Marathon 管理长运行的服务型应用,通过 Chronos 管理离线计算任务,同时在集群中部署了 HDFS 分布式文件系统以及私有 Docker Registry。

其中,MySQL 用于存放每天的新文章数据,以及预测后的结果数据集;Nginx 用于对外提供服务。每天晚上2点运行 Spark 计算任务,更新模型并对训练集数据重新预测。

第零步:搭建 Spark 计算环境

Spark 采用 Mesos 作为资源调度器时,由 Mesos 统一调度计算资源,因此,Spark 集群无需部署,Mesos 集群即为 Spark 集群。

制作 Spark base 镜像,这部分不再累述,请参见使用数人云运行 Spark,或者也可以使用数人云开放的 Spark base 镜像:index.shurenyun.com/spark:1.5.0-hadoop2.6.0

本案存储层选用了 HDFS。Spark 连接 HDFS 时拥有数据位置识别能力,并会从集群内距离最近的节点处读取数据,从而最大程度降低数据在网络中的传输需求。为了充分发挥 Spark 的数据位置识别能力,大家应当让 Spark 计算任务与 HDFS 节点共同部署在一个集群中。

数人云提供为主机打标签的服务。如果 HDFS 只部署在集群的部分主机上,可以为这部分主机打上标签,在部署 Spark 计算任务的时候,可以限定在该标签范围内执行。具体请参见数人云用户手册

第一步:部署 Chronos 任务

将 Spark 计算任务通过 Chronos 发布到集群中,Chronos 是一个具备容错特性的作业调度器,支持使用 Mesos 作为作业执行器,用来在分布式环境下替代 cron。

  1. 制作任务镜像

因为代码和配置文件变动相对频繁,因此基于 Spark base 镜像制作一个包含二进制包和配置文件的任务镜像。

Spark 项目的目录如下:

├── README.md
├── build.sbt
├── conf
├── project
├── src
└── target

其中,conf 中包含了 Spark 的配置文件:spark-env.sh,spark-defaults.conf。

任务镜像的 Dockerfile 如下:

FROM index.shurenyun.com/spark:1.5.0-hadoop2.6.0

ADD target/scala-2.10/spark_lda.jar .
ADD conf .

CMD ./run.sh

Spark 程序通过 SBT 编译,二进制包生成在 target/scala-2.10/spark_lda.jar

根据调试或部署的需要,将 Spark 的配置目录导入并替换原文件,便于配置更新。

运行脚本run.sh是具体的 spark-submit 指令:

bin/spark-submit --class com.dataman.omega.service.Boot /opt/dist/spark/spark_lda.jar

将三个离线计算任务分别制作成镜像,然后将制作好的镜像上传到到镜像仓库。

  1. 发布任务

Chronos 是一个具备容错特性的作业调度器,支持使用 Mesos 作为作业执行器,用来在分布式环境下替代 cron。数人云已经集成 Chronos,并对外开放了发布定时任务的 REST API。为三个离线计算任务分别创建 Chronos 任务,名为preprocessJob,trainJob,predictJob。一个具体的定时任务发布指令如下:

curl -X POST https://api.shurenyun.com/api/v3/clusters/88/jobs \
      -H Content-Type: application/json \
      -H Accept: application/json \
      -H Authorization: 6d8c5051f09242408f966f762cc9b674 -d '{
        "name": "preprocessJob",
        "imageURI": "index.shurenyun.com/Spark_preprocess",
        "imageversion": "v1",
        "cpu": 4,
        "mem": 8192,
        "owner": "yma@dataman-inc.com",
        "ownerName": "yma",
        "schedule": "R/2016-03-15T02:00:00.000Z/P1D",
        "command": "",
        "parents": [
          ""
        ],
        "volumes": [
        ],
        "constraints":[["Tags", "LIKE", "HDFS"]]
      }'

有几个注意的地方:

  • schedule:R/2016-03-15T02:00:00.000Z表示任务定为晚上2点开始执行,P1D表示每隔一天执行一次;
  • parents:该任务执行的先决条件,不能和 schedule 字段同时使用;由于 preprocessJob 是第一个执行任务,因此设置 了 schedule,后面的任务比如 trainJob,则要设置 parents 为preprocessJob
  • command:原生 Chronos API 不允许该字段为空,数人云已经修补了该 bug。

具体的 API 说明请参见数人云 API 文档

第二步:部署长运行服务

Nginx,MySQL 这类长运行服务,通过 Marathon 发布。数人云已集成 Marathon,并提供了简洁的 UI,具体方法请参见数人云手册

小结

由于服务访问大部分发生在白天,而 Spark 计算只在晚上进行,因此完全可以把以上任务和服务都混合部署在同一集群内,提高了整体资源利用率。

Mesos 具有处理各种异构任务负载的特性,因而使得在同一个平台上管理大数据应用和 Web 应用成为可能。数人云集成了平台监控工具,可以方便地监控集群、主机、应用三个层面的资源使用情况以及各种应用状态,简化了运维工作。

注:HDFS 也可以通过 Mesos 部署,如果有的小伙伴觉得部署原生 HDFS 很麻烦的话,可以参考将 HDFS 搬上数人云:轻松实现集群的扩展收缩

4.总结

本文针对不用的应用场景,提供了基于数人云 DCOS 的应用上云方案,并分别说明了 DCOS 的特性;其实,只要处理得当,每一个场景都是可以受用 DCOS 的多种特性的。

由于应用的多样性和复杂性,应用上云并不止以上内容,更多内容请咨询数人云。