基于 Docker 快速部署多需求 Spark 自动化测试环境

引言

在进行数据分析时,Spark 愈来愈普遍的被使用。在测试需求愈来愈多、测试用例数量愈来愈大的状况下,可以根据需求快速自动化部署 Spark 环境、快速完成全部测试愈来愈重要。java

本文基于 Docker、Jenkins、Apache Ant、Apache Tomcat、Git、Shell 等技术或工具,根据用户对 Spark 版本、Scala 版本、JDK 版本、测试范围、测试版本等需求的不一样,快速完成 Spark Cluster 环境以及相应的 Client 端测试环境的部署,进而实现快速自动化测试、结果呈报,从而提升开发测试效率。node

Docker 等相关技术和工具介绍

Docker 介绍

Docker 是世界领先的开源应用容器引擎,提供了一个可供开发者打包其应用的可移植容器。开发者可使用 Docker 来消除合做编码时所出现的"个人机器"问题,运营商可使用 Docker 来运行和管理不一样容器中的应用,企业可使用 Docker 更加快速安全的创建敏捷软件交付管道。Docker 主要包括四部分:Docker Client、Docker Image、Docker Daemon、Docker Container。算法

Dockerfile 是为了快速构建 Docker Image 设计的,是一个包含了可用来建立镜像命令的脚本。当执行 docker build 命令时,Docker 能够经过从 Dockerfile 中自动读取指令来建立镜像。docker

Docker Compose 是一个用来定义和运行多容器复杂应用的工具。你可使用一个 YAML 文件来配置你的应用和服务,而后仅使用一条命令就能够启动已配置的全部服务。shell

本系统中咱们使用 Docker 来快速部署不一样 Spark 版本、Scala 版本、JDK 版本的 Spark Cluster Server 和 Test 客户端,经过 Docker Compose 启动所须要的服务。apache

Spark 介绍

Spark 是一种与 Hadoop 类似的专门为大数据处理设计的开源集群计算环境,使用 Scala 语言实现,以通用、易用为目标。Spark 的中间输出结果能够保存在内存中,没必要从新读写 HDFS,从而使其具备 Hadoop MapReduce 所没有的优势,更适用于数据挖掘与机器学习等算法。bootstrap

本系统中咱们将不一样版本的 Spark 部署在 Docker 中,经过 Dockerfile 控制 Spark 的版本选择,从而快速部署不一样版本 Spark Cluster Server。windows

Jenkins 介绍

Jenkins 是一种开源的持续集成工具,提供一个开放易用的平台用于监控持续重复工做,使得咱们能够进行持续的软件版本发布和测试。tomcat

本系统中咱们使用 Jenkins 建立 job 来控制测试的启动与中止,也能够进行周期性任务。安全

Git 介绍

Git 是一个免费开源的分布式版本控制系统,能够高效地处理各类大小项目。Git 易于学习,性能高效,在廉价本地分支、方便的中转区、多工做流等方面都超越了传统的 SCM 工具,如 Subversion,Perforce,CVS,ClearCase 等。

本系统中使用 Git 进行代码的维护及实时更新。

Apache Ant 介绍

Apache Ant 是一种用于在 Java 环境下进行软件开发的自动化工具,能够进行编译、测试、部署等步骤,其构建文件默认名为 build.xml,Ant 具备很好的跨平台性且操做简单。

本系统中咱们使用 Ant 进行代码的编译、测试以及测试报告的生成。

Apache Tomcat 介绍

Apache Tomcat 是一个开源的轻量级    Web应用软件容器,能够用来响应 HTML 页面的访问请求,在中小型系统和并发用户访问场景中被普遍使用。

本系统中咱们使用 Tomcat 来展示测试报告(即测试结果),使得多用户能够并发访问测试报告。

Shell 介绍

Shell 脚本是在 Linux/Unix 系统中使用的一种相似于 Windows/Dos 批处理的脚本,功能与.bat 相似。Shell 是一种命令语言,能够互动式的执行用户命令,将各种命令依据逻辑关系放入文件中能够一次性执行,是Linux 系统下普遍使用的一种脚本。

本文中咱们使用的系统是支持 Docker 的 Linux Ubuntu 14.04,依靠 Shell 脚本将各个步骤联系起来组成一个完整的流程。

本文主要从自动化的系统总体构架以及环境部署流程方面进行介绍,扼其重点,以求给读者提供一个部署此类环境或系统的操做思路和流程,对于特别细节、特殊或者过于通用的部分不作详解,如一些软件的安装教程在网络上随处可见,本文再也不赘述。下面章节首先介绍整个系统构架,而后对系统构架中各个部分进行具体介绍,最后进行总结。

环境部署测试总体架构

本章主要介绍自动化测试系统的总体框架和流程,如图 1 所示。咱们经过在 Jenkins Server 上建立 Job 做为整个系统的测试入口,Jenkins 发起测试请求以后,接下来会进行环境部署(即图中 Deploy 阶段)和测试(即图中 Test 阶段)。环境部署包括经过 Docker 部署 Spark Cluster 和 Test Client,即测试所须要的服务器端和客户端。环境部署完毕后即可进行测试,从指定地方获取测试所须要的 Build 和 Code,Code 能够经过 Git 在本机上维护更新,经过对代码进行测试所必须的一些配置,而后即可进行编译、测试,测试执行完毕后对所生成的 xml 文件进行生成报告(HTML 文件生成),此处编译、测试、report 生成均由 Ant 实现,所生成的 report 展现由 Tomcat 实现,最后经过 Linux 系统的邮件功能给指定邮箱发送邮件完成整个测试流程。

图 1. 自动化测试系统总体架构

Jenkins 任务

测试请求由 Jenkins 发起,安装 Jenkins 并新建 Remote SSH 任务后,在 Script 执行窗口指定配置信息,如图 2 所示,包括 build_num、scope、sparkVersion、javaVersion、model,分别表示要进行测试的 build 版本(以 jar 包的形式存在),测试的范围(Regression、Smoke、MiniSmoke 所定义 case 的范围依次减少),Spark 版本(如 1.6.0、1.6.二、2.0.一、2.1.1 等,scala 版本由 spark 决定),Java 版本(如 openjdk八、ibmjdk8 等),模块(代码中所包含的要测试的模块)。这些配置信息经过位于远程机器上的 Shell 脚本 getPropsFromJenkins.sh 下发到机器上的配置文件中以便进行后续部署和测试流程。机器上的 buildScope.props 和 model.props 文件用于存储从 Jenkins 上获取的信息,后续全部须要这些信息的操做均从这两个文件中读取。须要特别说明的是 model 的各模块间逗号表示串行执行,分号表示并行执行,串行只须要启动一个 Client 端便可,并行须要启动多个 Client 端并发执行,这部分将在后续章节具体介绍。

图 2. Jenkins 任务配置

Spark Cluster

Deploy 阶段将根据 Jenkins 下发的配置信息进行 Docker Spark Cluster 和 Client 的部署。

用于建立 Docker Spark Cluster 镜像及启动 Container 的脚本不少,代码内容也过于复杂,本节难以一一彻底介绍,依旧依据以前约定对重点部分进行介绍,觉得读者提供思路,具体细节可经过网络或者参考资料进一步深刻研究。

每一个版本的 Spark Docker 脚本咱们都放在一个独立文件夹中,按照"spark-$spark_version-$java_version"的方式命名。以 spark-2.1.1-openjdk-8 为例,该文件夹结构如图 3 所示,文件夹中所含 xml 格式文件与实际安装的 Spark 环境对应文件相似,只是在 Docker 中咱们使用 namenode 做为 container 的名字,core-site.xml 中要使用"hdfs://namenode:9000"替代实际环境中的"fs.default.name"。yarn-site.xml 中可使用"yarn.nodemanager.resource.memory-mb"对 YARN 可以使用的物理内存总量进行控制,默认 8192M,本系统咱们为了并行两个 Client 端同时测试设置为 65536M。

图 3. spark-2.1.1-openjdk-8 文件夹结构

yarn-cluster 文件夹下的 Dockerfile 文件是整个 cluster 的核心,用于建立 Spark Cluster 镜像,内容主要包括配置 SSH 无密码访问、安装 Java 并配置环境变量、下载安装 Hadoop、加载 xml 文件(core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml)、下载安装 Spark、开放 Spark 运行所需端口等。如图 4 所示为 Dockerfile 部份内容。

图 4. Dockerfile 片断

bootstrap.sh 文件主要用于在启动 container 时自动启动对应的 Spark 进程,如 start-dfs.sh、start-yarn.sh。其主要内容如图 5 所示。

图 5. bootstrap.sh 片断

咱们使用 docker-compose 启动 container 来保证整个 Spark Cluster 工做为一个总体,其主要使用文件为 docker-compose.yml,如图 6 所示。图中还能够添加其余节点,本处为了简化只使用 namenode 一个节点。

图 6. docker-compose.yml 片断

Shell 脚本建立 Spark Cluster 镜像以及启动 container 的命令如图 7 所示,$spark_version 和$java_version 来决定切换到对应的 Spark 文件夹进行某个版本的建立,使用"docker build –t spark-2.1.1 ."命令建立 spark-2.1.1 的镜像,执行"docker-compose up -d"用于在后台启动 spark-2.1.1 的 container。

图 7. Spark Cluster 镜像和启动脚本

Test Client

Client 端只须要启动一个系统为 Linux、带有所需软件的 Container,因此与 Server 端相比 Client 端的 Docker 脚本要简单的多,只须要一个 Dockerfile 文件用于建立 Client 镜像便可,针对各类 Spark 版本的 Dockerfile 文件按照"dockerfile-$spark_version-$java_version"的方式命名存放,执行时根据 Spark 版本信息将对应的文件拷贝成 dockerfile 的文件来建立镜像,文件内容包括安装 JDK、Scala、Spark、Ant 等。此处仍然以 Spark-2.1.1 为例,如图 8 所示,在此脚本中咱们下载安装了 scala-2.11.八、spark-2.1.1-bin-hadoop2.7 以及 Ant,而且配置了部分所须要的环境变量。

图 8. Client Dockerfile 脚本

Client 端镜像的建立命令为"docker build -t client:v1 .",为了使得 Client 端和 Server 端的通讯更加通畅能够经过在上节 docker-compose.yml 中加入 Client 。如图 9 所示,client1 表示咱们只启动一个 Client 端,没有并行。若是须要启动两个 Client 端并行,在脚本后继续添加 client2 对应代码便可,与 client1 相似,client 数目的控制由 shell 脚本经过 model 信息肯定。

图 9. 添加 client 的 docker-compose.yml

在 Spark Cluster 和 Client 镜像建立完成后,经过"docker-compose up -d"启动对应的 Container,Container 运行状况如图 10 所示。

图 10. namenode 和 client container

Test

环境部署完毕后接下来就是要利用代码进行实际的测试,即 Test 阶段。

Test Configuration 主要是利用 Jenkins 上指定的配置信息对代码进行特定的配置,好比经过 wget 命令从远端下载 Jenkins 上所指定的 build 版本,在此 build 上对代码进行编译等。本机上经过 Git 维护一套代码,而且进行实时更新以获取最新代码。如上节图 10 所示 Client 启动时已经过 volumes 命令将本机的 dockerShare 文件夹共享进 Client 的 docker container 内部,以便于在 docker 内部进行编译测试。

Test 和 Report 为测试的主题阶段,依据代码进行编译测试和报告生成,这一阶段是经过 Apache Ant 实现的,咱们先来看一下 Ant 的构建文件 build.xml。build.xml 的内容主要包括如下几部分:代码编译所依赖的 jar 包、编译命令、测试命令、建立 report 命令。

如图 11 所示,"build"指定了编译依赖于"clean,prebuild",以及要编译文件的目录和文件后缀(.scala 文件)。"run"指定了要执行的文件即实际测试的文件(.class 文件),"showoutput"指定是否输出全部的 log 日志,"printsummary"指定是否输出每一个文件执行完毕后的总结(即总共多少个 case,成功失败数目各为多少),"haltonfailure"指定是否遇到错误就中止,"include name="用于控制要测试的 scope 和模块(分别从 buildScope.prop 和 model.props 中获取),如此处 scope 为"MiniSmoke",模块为 aa,新增一个模块则新加一行"include name=",可经过 Shell 控制。"report"指定利用测试完毕后所生成的全部名称为"TEST-*.xml"的文件生成 report。

图 11. build.xml 片断

编译、测试、Report 阶段依次执行命令为"ant build"、"ant run"和"ant report",测试并生成 report 以后将生成的 report 文件所有放入 Apache Tomcat 特定目录中而且启动 Tomcat,便可经过 Tomcat 的端口访问 report 内容。为了彻底实现自动化,咱们将此访问连接经过邮件系统发送到指定的邮箱中,能够经过 Linux 系统下的 sendmail 功能发送,也能够经过 Jenkins 的 mail 功能发送,即流程中的 Mail Notification 阶段。

如图 12 所示,邮件所收到的 report 连接是以"ip:端口/目录/build 号_scope/index.xml"的样式存在,Tomcat 默认端口是 8080,能够自行修改(apache-tomcat-7.0.77/conf/server.xml 中),本系统中咱们改为了 8888,build 号_scope 保证了多个 report 并存互不影响从而使得咱们能够同时管理不少历史 report 以便于后续查看。

图 12. report 页面

总结

基于 Docker 的环境部署及测试涉及大量细节,如各个软件的安装配置、整个系统各个部分是如何经过 shell 脚本一一串联起来以完成整个流程、report 页面上各类信息的显示、代码编译出错后中止后续流程自动发送邮件将错误信息通知维护人员等等,因为内容过于繁琐且文章篇幅有限在此不能一一介绍,在实际环境部署测试过程当中你们能够具体体会。文中所涉及的软件技术均为当今业界比较流行的技术,参考资料也相对较多,网络或官网上都可以查找到相关帮助,有兴趣的能够作进一步深刻研究。

须要软件测试资料的朋友,能够来加群:747981058。群内会有不按期的发放免费的资料连接,这些资料都是从各个技术网站搜集、整理出来的,若是你有好的学习资料能够私聊发我,我会注明出处以后分享给你们。

相关文章
相关标签/搜索