在進行數據分析時,Spark 越來越廣泛的被使用。在測試需求越來越多、測試用例數量越來越大的情況下,能夠根據需求快速自動化部署 Spark 環境、快速完成所有測試越來越重要。
本文基于 Docker、Jenkins、Apache Ant、Apache Tomcat、Git、Shell 等技術或工具,根據用戶對 Spark 版本、Scala 版本、JDK 版本、測試范圍、測試版本等需求的不同,快速完成 Spark Cluster 環境以及相應的 Client 端測試環境的部署,進而實現快速自動化測試、結果呈報,從而提高開發測試效率。
Docker 是世界領先的開源應用容器引擎,提供了一個可供開發者打包其應用的可移植容器。開發者可以使用 Docker 來消除合作編碼時所出現的"我的機器"問題,運營商可以使用 Docker 來運行和管理不同容器中的應用,企業可以使用 Docker 更加快速安全的建立敏捷軟件交付管道。Docker 主要包括四部分:Docker Client、Docker Image、Docker Daemon、Docker Container。
Dockerfile 是為了快速構建 Docker Image 設計的,是一個包含了可用來創建鏡像命令的腳本。當執行 docker build 命令時,Docker 可以通過從 Dockerfile 中自動讀取指令來創建鏡像。
Docker Compose 是一個用來定義和運行多容器復雜應用的工具。你可以使用一個 YAML 文件來配置你的應用和服務,然后僅使用一條命令就可以啟動已配置的所有服務。
本系統中我們使用 Docker 來快速部署不同 Spark 版本、Scala 版本、JDK 版本的 Spark Cluster Server 和 Test 客戶端,通過 Docker Compose 啟動所需要的服務。
Spark 是一種與 Hadoop 相似的專門為大數據處理設計的開源集群計算環境,使用 Scala 語言實現,以通用、易用為目標。Spark 的中間輸出結果可以保存在內存中,不必重新讀寫 HDFS,從而使其具有 Hadoop MapReduce 所沒有的優點,更適用于數據挖掘與機器學習等算法。
本系統中我們將不同版本的 Spark 部署在 Docker 中,通過 Dockerfile 控制 Spark 的版本選擇,從而快速部署不同版本 Spark Cluster Server。
Jenkins 是一種開源的持續集成工具,提供一個開放易用的平臺用于監控持續重復工作,使得我們可以進行持續的軟件版本發布和測試。
本系統中我們使用 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 系統的郵件功能給指定郵箱發送郵件完成整個測試流程。
本章將根據上一章節中的自動化系統整體架構對流程中所涉及的各部分進行具體介紹,重點介紹自動化系統中基于 Docker 所部署的 Spark Cluster Server 端和 Client 端。
測試請求由 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、2.0.1、2.1.1 等,scala 版本由 spark 決定),Java 版本(如 openjdk8、ibmjdk8 等),模塊(代碼中所包含的要測試的模塊)。這些配置信息通過位于遠程機器上的 Shell 腳本 getPropsFromJenkins.sh 下發到機器上的配置文件中以便進行后續部署和測試流程。機器上的 buildScope.props 和 model.props 文件用于存儲從 Jenkins 上獲取的信息,后續所有需要這些信息的操作均從這兩個文件中讀取。需要特別說明的是 model 的各模塊間逗號表示串行執行,分號表示并行執行,串行只需要啟動一個 Client 端即可,并行需要啟動多個 Client 端并發執行,這部分將在后續章節具體介紹。
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。
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 部分內容。
bootstrap.sh 文件主要用于在啟動 container 時自動啟動對應的 Spark 進程,如 start-dfs.sh、start-yarn.sh。其主要內容如圖 5 所示。
我們使用 docker-compose 啟動 container 來保證整個 Spark Cluster 工作為一個整體,其主要使用文件為 docker-compose.yml,如圖 6 所示。圖中還可以添加其他節點,本處為了簡化只使用 namenode 一個節點。
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。
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.8、spark-2.1.1-bin-hadoop2.7 以及 Ant,并且配置了部分所需要的環境變量。
Client 端鏡像的創建命令為"docker build -t client:v1 .",為了使得 Client 端和 Server 端的通信更加通暢可以通過在上節 docker-compose.yml 中加入 Client 。如圖 9 所示,client1 表示我們只啟動一個 Client 端,沒有并行。如果需要啟動兩個 Client 端并行,在腳本后繼續添加 client2 對應代碼即可,與 client1 類似,client 數目的控制由 shell 腳本通過 model 信息確定。
在 Spark Cluster 和 Client 鏡像創建完成后,通過"docker-compose up -d"啟動對應的 Container,Container 運行情況如圖 10 所示。
環境部署完畢后接下來就是要利用代碼進行實際的測試,即 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。
編譯、測試、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 以便于后續查看。
基于 Docker 的環境部署及測試涉及大量細節,如各個軟件的安裝配置、整個系統各個部分是如何通過 shell 腳本一一串聯起來以完成整個流程、report 頁面上各種信息的顯示、代碼編譯出錯后停止后續流程自動發送郵件將錯誤信息通知維護人員等等,由于內容過于繁瑣且文章篇幅有限在此不能一一介紹,在實際環境部署測試過程中大家可以具體體會。文中所涉及的軟件技術均為當今業界比較流行的技術,參考資料也相對較多,網絡或官網上均可以查找到相關幫助,有興趣的可以做進一步深入研究。
原文轉自:https://www.ibm.com/developerworks/cn/linux/l-lo-docker-quickly-deploy-multiple-demands-spark/