在進行數據分析時,Spark 愈來愈普遍的被使用。在測試需求愈來愈多、測試用例數量愈來愈大的狀況下,可以根據需求快速自動化部署 Spark 環境、快速完成全部測試愈來愈重要。java
本文基於 Docker、Jenkins、Apache Ant、Apache Tomcat、Git、Shell 等技術或工具,根據用戶對 Spark 版本、Scala 版本、JDK 版本、測試範圍、測試版本等需求的不一樣,快速完成 Spark Cluster 環境以及相應的 Client 端測試環境的部署,進而實現快速自動化測試、結果呈報,從而提升開發測試效率。node
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 是一種與 Hadoop 類似的專門爲大數據處理設計的開源集羣計算環境,使用 Scala 語言實現,以通用、易用爲目標。Spark 的中間輸出結果能夠保存在內存中,沒必要從新讀寫 HDFS,從而使其具備 Hadoop MapReduce 所沒有的優勢,更適用於數據挖掘與機器學習等算法。bootstrap
本系統中咱們將不一樣版本的 Spark 部署在 Docker 中,經過 Dockerfile 控制 Spark 的版本選擇,從而快速部署不一樣版本 Spark Cluster Server。windows
Jenkins 是一種開源的持續集成工具,提供一個開放易用的平臺用於監控持續重複工做,使得咱們能夠進行持續的軟件版本發佈和測試。tomcat
本系統中咱們使用 Jenkins 建立 job 來控制測試的啓動與中止,也能夠進行週期性任務。安全
Git 是一個免費開源的分佈式版本控制系統,能夠高效地處理各類大小項目。Git 易於學習,性能高效,在廉價本地分支、方便的中轉區、多工做流等方面都超越了傳統的 SCM 工具,如 Subversion,Perforce,CVS,ClearCase 等。
本系統中使用 Git 進行代碼的維護及實時更新。
Apache Ant 是一種用於在 Java 環境下進行軟件開發的自動化工具,能夠進行編譯、測試、部署等步驟,其構建文件默認名爲 build.xml,Ant 具備很好的跨平臺性且操做簡單。
本系統中咱們使用 Ant 進行代碼的編譯、測試以及測試報告的生成。
Apache Tomcat 是一個開源的輕量級 Web應用軟件容器,能夠用來響應 HTML 頁面的訪問請求,在中小型系統和併發用戶訪問場景中被普遍使用。
本系統中咱們使用 Tomcat 來展示測試報告(即測試結果),使得多用戶能夠併發訪問測試報告。
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 並新建 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 任務配置
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 鏡像和啓動腳本
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 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。羣內會有不按期的發放免費的資料連接,這些資料都是從各個技術網站蒐集、整理出來的,若是你有好的學習資料能夠私聊發我,我會註明出處以後分享給你們。