开发者学堂课程【实时数仓 Hologres 实战课程:开源 OLAP 迁移 HSAP 实战(一)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/904/detail/14392
开源 OLAP 迁移 HSAP 实战(一)
目录:
一、开源 OLAP 系统现状
二、大数据架构中 OLAP 系统
三、Presto 简介及场景应用
四、Presto 迁移 Hologres 实践
五、Druid 简介及应用场景
六 、Druid 迁移 Hologres 实践
七、ClickHouse 简介及应用场景
八、ClickHouse 迁移 Hologres 实践
九、ClickHouse 迁移 Hologres 实践-数据模型
十、ClickHouse 迁移 Hologres 实践- DDL
十一、ClickHouse 迁移 Hologres 实践-查询
十二、Hologres 升级–客户案例
十三 、新一代技术理念 HSAP:服务、分析一体化
一、开源 OLAP 系统现状
系统 |
Github Star |
开源时长 |
语言实现 |
系统分类 |
ClickHouse, |
12k |
4年 |
C++ |
存储+计算 |
Presto |
11k |
7年 |
Java |
计算引擎 |
Druid |
10k |
8年 |
Java |
存储+计算 |
Greenplum |
4k |
5年 |
C |
存储+计算 |
Impala |
3k |
7年 |
C++ |
计算引擎 |
二、大数据架构中 OLAP 系统
从业务的角度看大数据架构中 OLAP 系统的定位,功能,在业务系统中的作用
用户可能会有一些实时的数据分析,比如淘宝上一些交易的日志,一些浏览的日志,一些点击的日志在这个时候可能会使用 Flink 进行实时的处理,同时把这些数据处理做一些语句和写到类似于 HBase,Cassandra 里面去,然后进行实时的大屏显示。HBase,Cassandra 适合做点查询,但是缺点是不能做复杂的分析
系统对比
Druid/ClickHouse 与 Hologres 对比
|
|
Druid |
ClickHouse |
Hologres |
存储 |
写入可见性 |
秒级 |
秒级 |
毫秒级 |
明细存储 |
不建议 |
支持 |
支持 |
|
可更新 |
不支持 |
不完备 |
支持 |
|
索引 |
bitmap/dicnionary |
Primary key/clustering Key |
Bitmap/dictionacy/segmenu/ primary/clustea |
|
计算 |
优化器 |
RBO |
RBO |
CBO |
执行器 |
- |
向量化/SIMD |
向量化/SIMD |
|
联盟查询 |
不支持 |
支持 |
支持 |
|
预聚合 |
支持 |
支持 |
支持(Flink) |
|
高QPS点查 |
不支持 |
不支持 |
支持 |
|
SQL |
DDL |
复杂 |
语法复杂 |
语法简单 |
Update/Dete |
不支持 |
有限支持,语法复杂,非ANSI标准 |
支持 |
|
JOIN |
有限支持 |
支持,性能较差 |
支持 |
|
WINDOW |
不支持 |
不支持 |
支持 |
|
高级功能 |
向量检索 |
不支持 |
不支持 |
支持 |
空间数据 |
不支持 |
不支持 |
支持 |
|
安全管理 |
不支持 |
不支持 |
丰富的权限控制,RAM子账号,ip白名单 |
|
扩缩容 |
分钟级 |
小时级,复杂 |
分钟级 |
|
生态 |
数据接入 |
Kafka/HTTP |
Kafka/JDBC/DataX |
Klink/JDBC/DataX |
BI工具 |
部分 |
部分 |
10+主流BI工具 |
三、Presto 简介及场景应用
Presto:
Facebook 推出的分布式 SQL 查询引擎基于内存的并行计算提供交互式查询功能
应用场景:Presto
离线加速:Hive 加速
联邦查询:MySQL/MongoDB 等丰富的 connector 扩展
数据湖:s3/OSS
实时数仓(写入/更新/高 QPS):不支持
应用场景:Hologres
离线加速:MaxCompute/Hive 加速
联邦查询:MaxCompute/Postgres 等丰富的 Postgres FDW 扩展
数据湖:OSS
实时数仓(写入/更新/高 QPS):支持
四、Presto 迁移 Hologres 实践
功能 |
Presto |
Hologres |
数据模型 |
Catalog/Schema/Table |
Database/Schema/Table |
数据类型 |
基本类型/复杂类型 |
基本类型/复杂类型 |
sQL |
ANSI SQL(Presto) |
ANSI SQL(Postgres) |
数据接入 |
客户端/JDBC |
PSQL客户端/JDBC/HoloWeb |
BI生态 |
Tableau/帆软等主流BI |
Tableau/帆软主流BI+云QuickB1 |
两者均支持 ANSI SQL,迁移成本低,基本无缝
五、Druid 简介及应用场景
Druid :
自带存储引擎,支持实时数据,并提供亚秒级查询的 OLAP 引擎
Druid适用场景︰
1.时序组织数据(点击,曝光,监控)
2.数据质量要求不高(有可能重复/丢失)
3.海量 append only 数据(不支持更新)
4.单表聚合类查询
Druid 不适用场景
1.高 QPS 明细场景
2.有一致性要求的场景
3.需要更新的场景
4.需要 join 的场景
六 、Druid 迁移 Hologres 实践
数据模型迁移
Druid 所有数据都存储在 dataSource 中 , dataSource 类似于 hologres 的表,本章节介绍 druid 中的数据模型和 Hologres 的数据模型之间的关系以及如何迁移。
Data Schema
Druid 通过 json 的方式来描述一个 dataSource 的 schema , dataSource schema 与 Hologres 的概念映射如下:
Druid概念 |
Hologres概念 |
说明 |
dataSource |
Table |
|
timestampSpec |
Column |
Druid中的timestamp在hologres中就是一个普通列,切分segment的属性通过在表中添加segment_key的方式来指定 |
dimensionsSpec |
Column |
维度列在hologres中是一个普通列,在 druid中维度列一般用来做过滤和聚合,用户可以通过在hologres中添加bitmap或 |
metricsSpec |
Column |
指标列在holagres中是一个普通列 |
granularitySpec |
- |
无需配置 |
transformSpec |
- |
在数据Ingestion到Hologres中时,用户通过SQL where子句指定需要过滤的数据 |
Druid 迁移 Hologres 实践–DDL
Druid Datasource
"dataSchema": {
" dataSource": "wikipedia",
"timestampSpec":{
"column": "ts",
"format" : "auto"
},
" dimensionsSpec." : {
"dimensions".: [
{"type" : "string ". " page” },
{ "type" : "string", " language" },
{ "'type" : "long" , "name": "userld" }
]
},
" metricsSpec" : [
{"type": "doubleSum", " name" : "bytes_added_sum","fieldName": " bytes_added"}.
{ "type": "doubleSurm", "name": "bytes_deleted_sum","field Name": " bytes_deleted" }
]
}
Hologres Table
BEGIN;
CREATE TABLE wikipedia (
ts timestamptz,
page text,
language text,
user_id bigint,
bytes_added_sum double precision,
bytes_deleted double precision
);
CALL set_table_property('test", 'segment_key' , 'ts');
--分段列,设成为druid的timestampSpec中指定的列
CALL set_table_property(‘test' , ‘bitmap_columns’ , 'page,
language, user_id' );-- bitmap索引,设成druid的维度列
CALL set_table property('test,'dictionary_encoding columns’
page,language');
-- dictionary索引,设成druid维驻度列中的string列
COMMIT;
Druid 迁移 Hologres 实践
Query 迁移
Druid 当前版本支持两种询方式:SQL 查询和 Native 查询,SQI 查询和 Holongres 的 SQL 查询方式类似,在此主要介绍 Native query 到 Hologres 的迁移方式
Druid
Scan 查询
{
"queryType": "scan", "dataSource":
"dataSourceName",
"columns": ['column1", " column2"]. "intervals ":
["0000/3000"]
}
Hologres
SELECT
column1,
column2
FR OM
dataSourceName
Druid 迁移 Hologres 实践–查询
Druid
TOPN 查询:
{
"aggregations": [
{
"fieldName":
"L_QUANTITY_longSum",
"name": "L_QUANTITY_",
"type": "longSum'
}
],
"dataSource" : "tpch_year",
"dimension":"l_orderkey", "granularity" : "all".
"metric": "L_QUANTITY_". "queryType": "topN",
"threshold": 2
Halogres
SELECT
SUM(L_QUANTITY_longSum) AS L_QUANTITY_
FROM
tpch_year
GROUP BY
l_orderkey
ORDER BYL_
QUANTITY_
LIMIT 2
Druid
Timeseries 查询:
{
"queryType" : "timeseries”,
"dataSource": "sample_datasource”,
"granularity": "day",
"descending" : "true“ ,
"filter": [
"type" : "and” ,
"fields": [
{ "type: "selector","dimension": "sample_dimension1". "value":"sample_value1" ].
{ 'type" : "or" ,
"fields": [
{ "type": "selector". "dimension" : "sample_dimension2" , "value":"sample_value2" ],
{ "type" : "selector" , "dimension" : "sample_dimension3", "value":"'sample_value3" }
]
}
]
},
"aggregations": [
{"type" : "longSum", "name": "sample_name1", "fieldName":"sample_fieldName1"}.
i "type" : "doubleSum", "name": "sample_name2", "fieldNarme":"sample_fieldName2"}
] }
],
"intervals ": [ "2012-01-01T00:00:00.000/2012-01-03TO0:00:00.000"]
}
Hologres
SELECT
SUM(sample_fieldNamel) as sample_name1,
SUM(sample_fieldName2) as sample_fieldName2
FROM
sample_datasource
WHERE
sample_dimension1 = 'sample_valuel1'
AND
isample_dimension2 = 'sample_value2'
OR
sample_dimension3 = 'sample_value3'
)
Druid
GroupBy 直询︰
{
"type": "query" .
'query" : {
"queryType": " groupBy",
"dataSource" : "site_traffic",
"intervals": [" O000/3000"],
"granularity": "all",
"dimensicns: ["page"],
"aggregations": [
{“type" : " count", "name" : "hits"}
]
}
}
Hologres
SELECT
page,
COUNT(*) AS hits
FROM
site_traffic
GROUP BY
Page