导读:业务系统或者日志系统产生了大量的原始数据,咱们根据业务场景需求将数据保存到不一样的存储中。然而,数据只有经过整合、加工、计算,才能提取出其潜在的信息,让数据变为资产,从而实现数据的价值。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系列的开篇,主要从设计理念、架构、功能特色等方面进行了介绍。接下来的文章将会从安装使用、实现细节、应用场景等方面来展开。
做者:王浩
来源:宜信技术学院