前言
隨着公司規模的增加,對大數據的離線應用開發的需求愈來愈多,這些需求包括但不限於離線數據同步(MySQL/Hive/Hbase/Elastic Search 等之間的離線同步)、離線計算(Hive/MapReduce/Spark 等)、定時調度、運行結果的查詢以及失敗場景的報警等等。架構
在統一的大數據開發平臺產生以前,面臨一系列的問題: 併發
多個開發和調度入口,不一樣的業務部門之間的項目或組件很難複用,同時帶來繁重的運維成本
Hadoop 的環境對業務團隊的同事來說不友好(除了要熟悉業務之外還須要對底層框架有比較深刻的瞭解)
重複的開發工做(例如導表、調度等原本能夠複用的模塊,卻須要在多個項目中重複實現)
頻繁的跨部門需求溝通和討論
爲了解決上述遇到的各種問題,同時參考了業界其餘公司的大數據解決方案,咱們設計並實現了大數據開發平臺(Data Platform,簡稱 DP) ,經過可視化的交互界面,解決離線大數據計算相關的各類環境和工具。負載均衡
本文將介紹 DP 的系統設計以及在有讚的落地狀況,內容包括:框架
DP 的系統設計,包括架構設計,以及重點介紹了調度模塊的設計
目前在有讚的落地現狀
總結和展望
大數據開發平臺的設計
架構設計
圖1 DP系統架構圖
大數據開發平臺包括調度模塊(基於開源airflow二次開發)、基礎組件(包括公共的數據同步模塊/權限管理等)、服務層(做業生命週期管理/資源管理/測試任務分發/Slave管理等)和監控(機器資源/日誌/基於預測的監控)。這些模塊具體功能和職責爲:運維
**任務調度模塊:**支持基於任務優先級的多隊列、分佈式調度。在開源的 airflow 基礎上進行了二次開發,主要新增功能包括: * 增長多種任務類型(datax/datay/導出郵件/導出es/Spark等) * 根據任務的上下游關係以及重要程度,計算任務的全局優先級,根據全局優先級調度(優先級高的優先執行,低的則進入隊列等待) * 跨 Dag 的任務依賴關係展現(基於全局 Dag,經過任務的讀寫Hive表信息創建跨 Dag 的依賴關係) * 一鍵 Clear 當前節點的全部依賴下游節點(支持跨Dag)
**基礎模塊:**包括離線的全量/增量數據同步、基於Binlog的增量同步、Hive 導出 ES /郵件、MySQL 同步到 Hbase (開發中)等,參考圖2。
圖2 DP支持的離線數據同步方式(箭頭表示數據流向)
**服務模塊:**負責做業的生命週期管理,包括做業的建立(修改)、測試、發佈、運維等,服務部署採用 Master / Slave 模式,參考圖3所示。其中 * Master 節點支持 HA 以及熱重啓(重啓期間另一臺提供服務,所以對用戶是無感知的)。Master 節點的主要職責是做業的生命週期管理、測試任務分發、資源管理、經過心跳的方式監控 Slaves 等。 * Slave 節點分佈在調度集羣中,與 Airflow 的 worker 節點公用機器。Slave 節點的主要職責是執行 Master 分發的命令(包括測試、機器監控腳本等)、更新資源(經過 Gitlab )等。
圖3 DP 部署圖
**監控模塊:**對調度集羣的機器、資源、調度任務進行全方位的監控和預警。按照監控的粒度和維度分紅三類: * _基礎監控:_結合運維監控(進程、IO等)和自定義監控(包括任務環比波動監控、關鍵任務的產出時間監控等)對DP的Master節點和Worker節點進行基礎的監控和報警。 * _日誌監控:_經過將任務運行時產出的日誌採集到 Kafka,而後通過 Spark Steaming 解析和分析,能夠計算每一個任務運行的起止時間、Owner、使用到的資源量( MySQL 讀寫量、 Yarn 的 CPU / Memory 使用量、調度 Slot 的佔用狀況等),更進一步能夠分析Yarn任務的實時運行日誌,發現諸如數據傾斜、報錯堆棧信息等數據。最後將這些數據存儲在 NoSQL(好比 Redis )以進一步的加工和展現。 * _任務預測監控:_經過提早一段時間模擬任務的調度(不真正的跑任務),來預測任務的開始/結束時間,同時能夠提前知道可能失敗、超時的任務列表,進而在問題發生以前進行規避。分佈式
* 現階段已經實現的功能:分析可能失敗的任務列表(失敗的緣由多是DB的配置發生更改、上游的節點失敗等)併發送告警信息;基於過去一段時間的運行時間數據,模擬整個任務調度,能夠計算出任務的開始/結束時間以及超時告警。
* 將來規劃:任務的運行時長不是基於過去的數據,而是經過讀取的數據量、集羣資源使用率、任務計算複雜程度等多個特徵維度來預測運行時長。
複製代碼
任務調度設計
大數據開發平臺的任務調度是指在做業發佈以後,按照做業配置中指定的調度週期(經過 crontab 指定)在一段時間範圍內(經過開始/結束時間指定)週期性的執行用戶代碼。任務調度須要解決的問題包括:高併發
如何支持不一樣類型任務?
如何提供任務調度的高併發(高峯時期每秒須要處理上百個任務執行)?
如何保證相對重要的任務(數據倉庫任務)優先獲取資源並執行?
如何在多臺調度機器上實現負載均衡(主要指CPU/內存資源)?
如何保證調度的高可用?
任務調度的狀態、日誌等信息怎麼比較友好的展現?
爲了解決上述問題,咱們調研了多種開源框架(Azkaban/Oozie/Airflow等),最終決定採用 Airflow + Celery + Redis + MySQL 做爲 DP 的任務調度模塊,並結合公司的業務場景和需求,作了一些深度定製,給出了以下的解決方案(參考圖4):工具
圖4 基於Airflow + Celery + Redis + MySQL的任務調度
針對問題1 ,在 Airflow 原始的任務類型基礎上,DP 定製了多種任務(實現 Operator ),包括基於 Datax 的導入導出任務、基於 Binlog 的 Datay 任務、Hive 導出 Email 任務、 Hive 導出 ElasticSearch 任務等等。
針對問題2 ,一方面經過 Airflow 提供的 Pool + Queue + Slot 的方式實現任務併發個數的管理,以及把未能立刻執行的任務放在隊列中排隊。另外一方面經過 Celery 能夠實現了任意多臺Worker的分佈式部署(水平擴展),理論上調度沒有併發上限。
針對問題3 ,在 Airflow 自己支持的優先級隊列調度基礎之上,咱們根據任務的上下游關係以及標記重要的任務節點,經過全局DAG計算出每一個節點的全局優先級,經過將該優先級做爲任務調度的優先級。這樣能夠保證重要的任務會優先調度,確保重要任務產出時間的穩定性。
針對問題4 ,首先不一樣類型的任務須要耗費不一樣類型的資源,好比 Spark 任務是內存密集型、Datax 任務是 CPU 密集型等,若是將同一類任務集中在一臺機器上執行,容易致使部分系統資源耗盡而另一部分資源空閒,同時若是一臺機器的併發任務數過多,容易引發內存 OOM 以及 CPU 不斷地切換進程上下文等問題。所以咱們的解決方式是:
將任務按照須要的資源量分紅不一樣類型的任務,每種類型的任務放到一個單獨的調度隊列中管理。
每一個隊列設置不一樣的 Slot ,即容許的最大併發數
每臺 Worker 機器同時配置多個隊列
基於這些配置,咱們能夠保證每臺 Worker 機器的 CPU /內存使用率保持在相對合理的使用率範圍內,如圖5所示
圖5 調度Worker機器的內存使用狀況
針對問題5 ,任務調度模塊涉及到的角色包括 Scheduler (生產者)和 Worker (消費者),由於 Worker 原本就是分佈式部署,所以部分機器不可用不會致使整個調度的不可用(其餘節點能夠繼續服務)。而 Scheduler 存在單點問題,咱們的解決方案是除了 Active Scheduler 節點以外,新增一個 Standby Scheduler(參考圖3),Standby節點會週期性地監聽 Active 節點的健康狀況,一旦發現 Active Scheduler 不可用的狀況,則 Standby 切換爲 Active 。這樣能夠保證 Scheduler 的高可用。
針對問題6 ,Airflow 自帶的 Web 展現功能已經比較友好了。
現狀
DP項目從2017年1月開始立項開發,6月份正式投入生產,以後通過了N輪功能迭代,在易用性和穩定性方面有了顯著提高,目前調度集羣包括2臺Master和13臺 Slave(調度)節點(其中2臺用於 Scheduler ,另外11臺用於 Worker ),天天支持7k+的任務調度,知足數據倉庫、數據中心、BI、商品、支付等多個產品線的應用。oop
圖6 DP調度任務數趨勢圖
目前DP支持的任務類型包括:測試
離線數據同步:
從 MySQL 到 Hive 的全量/增量數據同步(基於 Datax 二次開發)
從 Hive 到 MySQL 的全量/增量數據同步(基於 Datax 二次開發)
從 MySQL 經過 Binlog ,通過 Nsq/Hdfs/MapReduce 增量同步到 Hive( Datay ,自研)
從 MySQL 同步到 Hbase (基於 Datax 二次開發)
從 Hive 同步到 ElasticSearch (基於 Datax 二次開發)
Hadoop 任務:
Hive/MapReduce/Spark/Spark SQL
其餘任務:
將 Hive 表數據以郵件形式導出(支持 PDF/Excel/Txt 格式的附件)
Python/Shell/Jar 形式的腳本任務
總結和展望
DP 在通過一年半的不斷功能迭代和完善以後,目前日均支持7k+的任務調度,同時在穩定性和易用性方面也有了較大的提高,能夠知足用戶平常對大數據離線開發的大部分使用場景。同時咱們也意識到大數據開發這塊還有不少能夠挖掘和提高的點,將來咱們可能會從這些方面進一步完善平臺的功能和提高用戶體驗:
更加豐富的任務類型
進一步整合其餘平臺或工具,作到大數據開發的一站式體驗
提供用戶首頁(空間),提供平常運維工具和管理頁面,更加方便任務的集中管理
任務日誌管理優化(包括快速定位出錯信息/拉取和分析 Yarn 日誌等)