新项目中引进Dremio作为计算引擎,做了一些研究和开发。记录下。
首先简单介绍下
一.Dremio架构
Dremio是基于Apache calcite、Apache arrow和Apache parquet3个开源框架构建,结构其核心引擎Sabot,形成这款DaaS(Data-as-a-Service)数据即服务平台;整体体验风格与其公司开源的Apache Drill非常接近。
Ⅰ).架构图
这里涉及技术比较多,我们今天先介绍下 Apache parquet文件。
二.Apache Parquet
Apache Parquet是一种面向分析的、通用的列式存储格式,兼容各种数据处理框架比如 Spark、Hive、Impala 等,同时支持 Avro、Thrift、Protocol Buffers 等数据模型。
Parquet文件结构
- File:一个 Parquet 文件,包括数据和元数据
- Row group:数据在水平方向上按行拆分为的单元
- Column:一个行组中的每一列对应的保存在一个列块中
- Page:每一个列块划分为多个数据页,同一个列块的不同页可能使用不同的编码格式
元数据
元数据包括如下3部分
- file metadata
- column (chunk) metadata
- page header metadata
在引入Dremio前,我们使用MaxCompute作为计算引擎,使用Datax做数据采集。还是决定使用Datax做为采集工具,但是Datax本身并没有支持parquet读和写的插件,需要自己开发。
如何生成parquet文件?
1.指定schema
2.写入记录
大致代码如下
void write(RecordReceiver recordReceiver) throws IOException {
Record lineRecord;
while ((lineRecord = recordReceiver.getFromReader()) != null) {
if (lineRecord.getColumnNumber() != this.columnNumber) {
// 源头读取字段列数与目的表字段写入列数不相等,直接报错
throw DataXException
.asDataXException(
S3ParquetWriterErrorCode.CONFIG_INVALID_EXCEPTION,
String.format(
"列配置信息有错误. 因为您配置的任务中,源头读取字段数:%s 与 目的表要写入的字段数:%s 不相等. 请检查您的配置并作出修改.",
lineRecord.getColumnNumber(),
this.columnNumber));
}
GenericData.Record recordNew = new GenericData.Record(avroSchema);
setKeyValue(recordNew, this.schema, lineRecord);
writer.write(recordNew);
}
this.s3ParquetOutputFile.s3out.setCommit();
this.writer.close();
}
Parquet 文件为了能够更有效的储存数据,对数据类型尽可能做了最小化的处理。目前 Parquet 包含如下几个类型:
- BOOLEAN: 1 bit boolean
- INT32: 32 bit signed ints
- INT64: 64 bit signed ints
- INT96: 96 bit signed ints
- FLOAT: IEEE 32-bit floating point values
- DOUBLE: IEEE 64-bit floating point values
- BYTE_ARRAY: 任意长度 byte 数组
其中schema的类型支持。https://avro.apache.org/docs/current/spec.html#Date
参考:
https://developer.aliyun.com/article/715004