一.Dremio架构
Dremio是基于Apache calcite、Apache arrow和Apache parquet3个开源框架构建,结构其核心引擎Sabot,形成这款DaaS(Data-as-a-Service)数据即服务平台;整体体验风格与其公司开源的Apache Drill非常接近。
Ⅰ).架构图
Ⅱ).参考API
Ⅲ).参考SQL
二.Apache Arrow
Apache Arrow是基于Apache Drill中的Value Vector来实现的,而使用Value Vector可以减少运算时重复访问数据带来的成本,其特点:
- 零拷贝共享内存和基于RPC的数据移动
- 读写文件格式(如CSV,Apache ORC和Apache Parquet)
- 内存分析和查询处理
Ⅰ).公共数据层
Apache Arrow的功能设计思路有点类似于适配器模式,将不同系统的数据源进行统一适配。
a).不使用Arrow
- 每个系统都有自己的内部存储器格式
- 在序列化和反序列化上浪费了70-80%的计算量
- 在多个项目中实现的类似功能
b).使用Arrow
- 所有系统都使用相同的内存格式
- 没有跨系统通信的开销
- 项目可以共享功能
Ⅱ).列式存储
传统的内存数据格式是以每一行作为各个字段的分布,相同字段没有被集中在一起,造成了计算时的不必要浪费;Apache Arrow通过列式存储格式约束,将相同字段集中排列在一起,提高了过滤查询的响应
如下例子:
a).数据
people=[
{
"name": "mary",
"age": 30,
"placed_lived": [
{
"city": "Akron",
"state": "OH"
},
{
"city": "Bath",
"state": "OH"
}
]
},
{
"name": "mary",
"age": 31,
"placed_lived": [
{
"city": "Lodi",
"state": "OH"
},
{
"city": "Ada",
"state": "OH"
},
{
"city": "Akron",
"state": "OH"
}
]
}
]
b).存储结构
placed_lived offsets: 存储的起始位置是0,其中第一个人有2个city,所以为0~2;第二个人有3个city,所以为3~5
city offsets: 存储的起始位置是0,其中第一个人的第一个city是Akron,所以为0~5,以此类推,即可知offsets位置
city Data: 即为实际数据存储位置
三.Apache Parquet
Apache Parquet是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。
Ⅰ).Parquet主要模块
- parquet-format:定义了所有格式规范,以及由 Thrift 序列化的元数据信息
- parquet-mr:实现读写 Parquet 文件的功能模块,与其他组件的适配工具,如Hadoop Input/Output Formats、Pig loaders 、Hive Serde 等
- parquet-cpp:用于读写Parquet文件的C ++库
- parquet-rs:用于读写Parquet文件的Rust 库
- parquet-compatibility:验证不同语言之间读写 Parquet 文件的兼容性测试
Ⅱ).数据存储格式
Parquet文件结构
- File:一个 Parquet 文件,包括数据和元数据
- Row group:数据在水平方向上按行拆分为的单元
- Column:一个行组中的每一列对应的保存在一个列块中
- Page:每一个列块划分为多个数据页,同一个列块的不同页可能使用不同的编码格式
Ⅲ).元数据
元数据包括如下3部分
- file metadata
- column (chunk) metadata
- page header metadata
四.Apache Calcite
Apache Calcite 是一款开源SQL解析工具, 可以将各种SQL语句解析成抽象语法术AST(Abstract Syntax Tree), 之后通过操作AST就可以把SQL中所要表达的算法与关系体现在具体代码之中
Ⅰ).Calcite 主要组件
- Catelog: *定义SQL语义相关的元数据与命名空间
- SQL parser: 主要是把SQL转化成AST
- SQL validator: 通过Catalog来校证AST
- Query optimizer: 将AST转化成物理执行计划、优化物理执行计划
- SQL generator: 反向将物理执行计划转化成SQL语句
Ⅱ).Calcite 主要功能
- SQL 解析
- SQL 校验
- 查询优化
- SQL 生成器
- 数据连接
五.Apache Drill
Apache Drill是用于大规模数据集的低延迟分布式SQL查询引擎,包括结构化和半结构化/嵌套数据
Ⅰ).Drill核心模块
- RPC端点: Drill公开了一个低开销的基于protobuf的RPC协议,以与客户端进行通信
- SQL解析器: Drill使用开源SQL解析器框架Calcite来解析传入的查询
- 存储插件界面: Drill充当多个数据源之上的查询层,存储插件为Drill提供以下信息
- a).数据源的的元数据
- b).Drill用于读取和写入数据源的接口
- c).数据的位置和一组优化规则,以帮助在特定数据源上高效,快速地执行Drill查询
Ⅱ).Drill查询
- 客户端或应用程序会以SQL语句的形式将查询发送到Drill集群中的Drillbit,Drill无主从概念
- 接受查询的Drill节点成为Foreman,Foreman驱动整个查询
- Foreman解析器解析SQL,并根据SQL运算符形成逻辑计划
- Foreman优化器使用各种类型的规则把操作符和函数重新排列为最佳计划后,将逻辑计划转换为执行查询的物理计划
- Foreman中的并行化程序将物理计划转换为多个片段,片段创建了一个多级执行树
- 查询根据执行树在数据源并行执行,并将结果发送回客户端或应用程序
Ⅲ).Drill特点
- 低延迟SQL查询
- 动态查询文件(如JSON,Parquet,AVRO和NoSQL)和HBase表中的自描述数据,无需Hive Metastore中的元数据定义
- 嵌套数据支持
- 与Apache Hive集成(对Hive表和视图的查询,对所有Hive文件格式和Hive UDF的支持)
- 使用标准JDBC / ODBC驱动程序进行BI / SQL工具集成