導讀:業務系統或者日誌系統產生了大量的原始數據,咱們根據業務場景需求將數據保存到不一樣的存儲中。然而,數據只有經過整合、加工、計算,才能提取出其潛在的信息,讓數據變爲資產,從而實現數據的價值。Moonbox就是這樣一款計算服務平臺,在敏捷大數據(Agile BigData)理論的指導下,圍繞「計算服務化」和「數據虛擬化」兩個核心概念進行設計,支持多種數據源混合計算。Moonbox的設計理念是怎樣的?又有什麼功能特色呢?本文帶您初步走進Moonbox~mysql
開源地址:https://github.com/edp963/moo...git
大數據技術在企業中的應用日益普遍,爲解決各類不一樣的場景問題,愈來愈多的數據系統出現,而如何基於全景數據去進行快速查詢計算成爲了迫切的需求和挑戰。github
目前的主流方式是創建以Hadoop爲核心的數據倉庫/數據湖,這在某種程度上解決了異構數據系統及數據分散的問題,但依然存在數據歸集帶來的維護成本和時效損失。另外,數據開發人員也面臨着業務頻繁變動和結果快速交付的問題。sql
面對這一系列挑戰,計算服務化和數據虛擬化提供了很好的解決思路。Moonbox正是在大數據場景下,對計算服務化和數據虛擬化的一種實踐,其設計思想主要體如今如下幾個方面:數據庫
Moonbox提供多種查詢接口以及定時任務,將計算資源變成一種服務,終端用戶能夠自助註冊數據源編寫SQL實現需求,只須要關心業務邏輯,而不用關心做業是如何提交運行的。api
Moonbox提供虛擬表到物理表之間的映射,終端用戶無需關心數據的物理存放位置和底層數據源的特性,可直接操做數據,體驗相似操做一個虛擬數據庫。安全
✔ 統一查詢語言restful
Moonbox對用戶提供統一的SQL語法標準,屏蔽異構數據系統查詢語言的差別,用戶只需編寫SQL便可查詢各類數據系統,也可以使用SQL進行跨異構數據系統混算,下降多數據系統的學習成本。架構
✔ 統一元數據服務app
Moonbox可以對接多種數據系統,能夠拿到各個數據系統數據表的schema信息,Moonbox並不存儲schema信息,每次都是實時從數據源獲取,因此不存在元數據變動不及時,須要同步更新等問題。Moonbox對外提供統一的元數據服務接口,用戶無需爲了獲取各類數據源的元數據而調用多種接口。
✔ 統一權限控制
每種數據源都有各自特有的安全機制,用戶在使用這些數據系統的時候就須要多付出必定的學習成本。Moonbox在邏輯層提供了統一的安全訪問機制,在接入時,提供認證登陸功能;在查詢時,經過攔截分析查詢SQL,實現列級別的數據權限控制。若是查詢統一從Moonbox接口進入,那麼Moonbox就爲各類數據源加上了一把安全鎖,用戶無需再學習各類數據源特有的安全機制。
Moonbox體系架構圖以下:
Moonbox整體上由四部分組成,分別是Moonbox客戶端、Moonbox接入層、Moonbox核心功能層以及存儲計算層。
Moonbox客戶端主要包括如下幾種:
✔ restful api
以restful api的方式提供計算服務,支持batch、adhoc模式,支持同步和異步方式。
✔ jdbc
對jdbc接口的實現,使用戶擁有數據庫般的使用體驗。
✔ cli
命令行工具,基於jline實現。經過cli能夠完成DDL(Data Definition Language)、DML(Data Manipulation Language)、DCL(Data Control Language)以及Query操做。
✔ zeppelin
提供zeppelin moonbox interpreter,可使用zeppelin快速進行原型驗證和SQL開發。
✔ davinci
經過jdbc支持ABD Stack(敏捷大數據技術棧)中數據可視化平臺davinci的接入,進行數據查詢並展現。
接入層包括http server和tcp server,實現客戶端接入,並進行用戶登陸認證,支持內置用戶名密碼認證方式和ldap集成認證方式。
Moonbox將其核心功能層命名爲Grid。Grid使用master-slave集羣工做模式,支持master主備切換。
Grid有Master、Worker、Runner三種角色:
✔ Master
Master負責接收全部的用戶請求,根據請求模式(adhoc/batch)將請求調度到合適的Worker上。
✔ Worker
Worker負責Runner的生成和銷燬,將請求分配給合適Runner。
✔ Runner
Runner處理用戶發過來的請求,包括用戶體系管理操做、權限管理操做、SQL解析、下推優化、執行引擎選擇等,並向存儲/計算層提交真正的計算任務。
存儲/計算層是計算真正發生的地方。Moonbox使用Spark做爲混算引擎,支持standalone和yarn運行模式。當計算邏輯能夠徹底下推到數據源計算時,Moonbox將計算任務直接mapping成數據源的查詢語言進行下推計算,以減少啓動分佈式做業的開銷。數據源除了能夠是hdfs這種純存儲系統,或者mysql、elasticsearch這種帶計算能力的存儲系統,還能夠是presto等計算引擎,Moonbox將他們統一視爲數據源。
Moonbox創建了一套完整的用戶體系,引入了Organization的概念,用於劃分用戶空間。系統管理員ROOT帳號能夠建立多個Organization,並在Organization中指定該Organization的管理者(SA)。SA能夠是一個或者多個,負責建立管理普通用戶。
Moonbox將普通用戶的能力抽象出五大屬性,分別爲:
✔ 是否能夠建立新用戶
✔ 是否能夠執行DDL語句
✔ 是否擁有能夠受權其餘用戶建立用戶的能力
✔ 是否擁有能夠受權其餘用戶執行DDL語句的能力
✔ 是否擁有對數據表或者數據列進行受權給其餘用戶的能力
經過屬性的自由組合,能夠構建出知足多種角色、多種需求的用戶體系模型,並可藉此實現多租戶。
Moonbox將查詢語言統一爲Spark SQL,使用Spark SQL語法進行查詢操做,同時擴展了一套DDL、DCL語句。包括對用戶的建立刪除和受權,數據表或者數據列的訪問受權,掛載、卸載物理數據源或者數據表,建立刪除邏輯數據庫,建立刪除udf/udaf,建立刪除定時任務等。
Moonbox基於Spark進行混算,Spark SQL是支持多數據源的,可是Spark SQL從數據源中進行數據拉取的時候只進行了project和filter算子的下推,並無考慮數據源的算力特性,好比elasticsearch對於聚合操做是很友好的,若是聚合操做能下推到elasticsearch中進行計算,會比將數據所有拉回Spark計算快的多。好比limit算子若是下推到數據源計算,能大大減小返回的數據量,節省拉取數據和計算的時間。
Moonbox對Spark Optimizer優化後的LogicalPlan做進一步的優化,根據規則拆分出能夠進行下推的子樹,將子樹mapping成數據源查詢語言,將下推結果拉回Spark參與進一步的計算。若是LogicalPlan能夠總體下推計算,那麼Moonbox將不採用Spark進行計算,直接使用數據源客戶端運行LogicalPlan mapping出來的查詢語句,以減小啓動分佈式做業的開銷,並節省分佈式計算資源。
數據安全愈來愈受到企業的重視,咱們但願在方便快捷提供計算服務和數據服務的同時,還可以實現數據安全。Moonbox定義了DCL語句來實現數據列級別權限控制。Moonbox管理員經過DCL語句將數據表或者數據列受權給用戶,Moonbox會將用戶和表以及列的權限關係保存到catalog中。當用戶使用SQL查詢時會被攔截,分析出SQL被解析後的LogicalPlan中是否引用了未被受權的表或者列,若是有就報錯返回給用戶。
Moonbox除了支持以jar包的形式建立UDF/UDAF外,還支持以源代碼的形式建立,包括Java語言和Scala語言,這給UDF開發驗證帶來了便捷性。同時Moonbox還在SQL中對複合數據類型,好比Array類型提供了高階函數支持(array.map,array.filter,array.exist)。
Moonbox提供了定時做業的功能,用戶使用DDL語句定義定時任務,以crontab表達式的形式定義調度策略,後臺內嵌quartz進行任務定時調度。
在進行數據項目時,須要瞭解數據的內容、質量和結構。用戶可使用Moonbox快速進行數據探查和idea驗證。
DBus和Wormhole將源庫數據實時更新到目的庫。用戶使用Davinci鏈接Moonbox對目的庫進行實時計算展現。
當企業數據被存儲在多個系統中時,想要與之交互須要多個接口或多種機制。藉助Moonbox能夠統一對外提供數據服務和元數據服務。
基於傳統數據倉庫面臨的問題,Gartner的分析師在幾年前提出了邏輯數據倉庫的概念。他們認爲邏輯數據倉庫不只須要存儲結構化數據,還能存儲非結構化數據,可以使用數據虛擬化手段直接訪問不一樣的數據源進行分佈式快速計算。用戶能夠基於Moonbox提供的功能進行邏輯數倉建設。
本篇做爲Moonbox系列的開篇,主要從設計理念、架構、功能特色等方面進行了介紹。接下來的文章將會從安裝使用、實現細節、應用場景等方面來展開。
做者:王浩
來源:宜信技術學院