發表于 2017-09-18 14:21
大數據平臺是一個整體的生態系統,內容涵蓋非常豐富,涉及到大數據處理過程的諸多技術。在這些技術中,除了一些最基礎的平臺框架之外,針對不同的需求場景,也有不同的技術選擇。這其中,顯然有共性與差異性的特征。若從整個開發生命周期的角度看,無論是需求、架構,還是開發、測試到最后的部署與運維,各種技術都會牽扯其中,不同的角色關注點自然也有不同。
大數據平臺的核心功能
從大數據平臺工程師的角度看,決定整個大數據平臺關鍵質量的不外三方面:
數據采集
數據存儲
數據處理
至于系統監控、資源協調、部署運維及其他管理功能都是大數據平臺整個生態環境中不可缺少的拼圖,但對于面向數據的架構,核心還是與數據打交道的一部分。如下圖所示:
根據我在大數據項目中的經驗,我發現,無論是數據采集、存儲還是分析,在技術選型與方案設計上,似乎又與數據源的特征息息相關,甚至在某種程度上,可以認為是數據源的特點決定了整個大數據平臺架構的設計。
數據源的特點
于是,我將關注點首要放在了數據源上。分析數據源的數據特征,我從四個不同的維度對數據源進行了分類:
來源
數據的來源不同,意味著我們對數據的掌控也就不同,更意味著我們對數據的訪問機制也有所不同。
企業的內部數據通常與具體業務緊密相關,且多數來自我們可以掌控(或者通過兄弟團隊)的軟件系統,如CRM、ERP或者HR系統。從企業架構的角度考慮,我們本身就應該避免企業系統出現所謂的“煙囪系統”,規避“信息孤島”。設計良好的系統應該提供相關的接口允許其他系統有限度地訪問該系統的內部數據,又或者主動地將內部數據寫入到一個完全解耦合的組件中。例如,一個常見的做法是將內部系統實時產生的輸入寫入到Kafka中。
通常,我們會盡量避免直接將內部系統的數據庫公開給大數據平臺。因為這種方式不僅會帶來潛在的安全威脅,還可能會因為資源占用的緣故影響到業務系統。
外部數據的獲取方式不外乎兩種:
·API調用
·通過網絡爬蟲抓取
與內部數據不同,外部數據不可能聽指揮地“召之即來揮之即去”,我們需要定期或不定期地去獲取數據,好處是我們可以根據業務場景和數據的特點自主地選擇數據存儲。
結構
只要了解過大數據項目,都知道數據結構直接影響了存儲與處理技術的選擇。RDB之于結構型數據,NoSQL之于非結構數據,這是司空見慣的配對了。相當而言,RDB的選擇比較簡單,NoSQL則有更復雜的分類。Pramod J·Sadalage與Martin Fowler在NoSQL Distilled一書中將NoSQL分為四類:
·鍵值數據庫
·文檔數據庫
·列族數據庫
·圖數據庫
針對不同結構類型的數據,我們可以借鑒這一分類作為選型的參考。
可變性
Datomic數據庫的設計哲學是將所有過去發生的事情(或事件)認為是一個“fact(事實)”,基于事實不能篡改的本質,則數據庫中存儲的數據也當是不變的。無論是添加、刪除還是修改,在數據庫層面都是增加一條記錄,而非直接更改。
然而,多數數據庫并未添加這種不變性的約束,雖然這種不變性帶來的好處是明顯的,不過也會給業務系統的設計與實現帶來不必要的復雜度。然而,作為大數據平臺的數據源而言,情況則相反,若數據允許更改,數據采集過程就會變得更復雜。
一種簡單的應對辦法是采用直連的形式。由于數據分析可能會基于不同的數據場景對數據存儲提出不同的要求,直連的數據源未必滿足這種要求。例如,假設我們的分析場景是要做基于關鍵字的全文本搜索,在大數據量高性能的要求下,選擇ElasticSearch或者Solr會表現更好,若直連的數據源是MySQL,事情就會變得較為棘手。
數據量
數據量小,則一切都可迎刃而解,這里不再贅述。
針對大數據量,實則是兩個不同的場景。一種是批處理方式,典型地算法是MapReduce,主要針對非實時需求場景,我們可以編寫定期以及批量執行的任務來完成數據的采集。需要費心的是對Job的監控、管理與調度。另一種則是流處理方式,(準)實時對產生的數據進行處理,這種場景對數據源的限制更多,最常見的方案就是將源源不斷產生的數據寫入到Kafka中。
在真實場景下,批處理與流處理方式可能共存。Lambda架構提出創新的三層架構方式,將此二者有機地融合起來,分別為:
·Batch Layer:針對批處理場景
·Speed Layer:針對流處理場景
·Serving Layer:由流處理場景提供實時數據模型,再對批處理的大數據進行預計算,從而提供批處理數據模型(聚合計算后),合并后提供給Serving Layer。
Lambda架構圖如下所示:
來源:張逸
Copyright ?2005-2021 勤智數碼科技股份有限公司 川公網安備 51019002003506號 蜀ICP備11012966號-7