2023/09 作者:ihunter 0 次 0
1. OLAP 应用场景
最近调研 Doris,设想了针对行为分析、用户分析的应用场景,看看 Doris 匹配程度。
2. Doris 介绍
2.1 关键词
MPP 架构:Massively Parallel Processing 大规模并行处理,节点并行计算。
海量数据
实时分析
列式存储
2022 年 6 月 Apache 顶级项目
2.2 使用场景
报表分析:毫秒以内
即席查询:分钟以内
数据仓库
联邦查询:外表关联 Hive、IceBerg、Hudi
2.3 技术架构
2.3.1 Frontend(FE)
用户请求处理
SQL 解析校验
SQL 执行计划创建
元数据管理:库、表、任务定义
运维:节点管理、任务监控
2.3.2 Backend(BE)
数据存储
数据聚合
执行查询计划
2.4 高性能
2.4.1 丰富索引
Sorted Compound Key Index:最多 3 列复合排序键高并发场景分析
Z-order Index:字段任意组合的范围查询
Min/Max :数值范围查询
Bloom Filter :高基数列去重
Invert Index :倒排索引字段快速检索
2.4.2 物化视图
自动更新保持保持数据的一致性,减少维护成本。
2.4.3 查询引擎
复杂的大表分布式的 Shuffle Join
利用 CPU SIMD 支持向量化计算
Adaptive Query Execution : Runtime Statistics 动态调整执行计划过滤大幅数据
3. 安装部署
3.1 约束和建议
# 约束
Centos >= 7.1
Java >= 1.8
GCC >= 4.8.2
# 文件句柄
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
# 其他
时钟同步
关闭交换分区(swap)
Linux(ext4)
3.2 生产环境推荐
3.3 主机资源
3.4 安装 FE
# 1. 下载FEwget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/doris/1.1/1.1.4-rc01/apache-doris-fe-1.1.4-bin.tar.gz
# 2. 解压tar -xvf apache-doris-fe-1.1.4-bin.tar.gz
# 3. 启动cd apache-doris-fe-1.1.4-bin && bin/start_fe.sh --daemon
# 4. 安装MySql Client
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
yum install mysql-community-client
# 5. 连接FE
mysql -h 172.30.144.1 -P 9030 -uroot
# 6. 查看FE节点状态
SHOW PROC '/frontends'\G;
3.5 安装 BE
# 1. 下载wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/doris/1.1/1.1.4-rc01/apache-doris-be-1.1.4-bin-x86_64.tar.gz
# 2. 解压tar -xvf apache-doris-be-1.1.4-bin-x86_64.tar.gz
# 3. 启动:同样启动其他节点cd apache-doris-be-1.1.4-bin-x86_64 && bin/start_be.sh --daemon
# 4. 连接FE
mysql -h 172.30.144.1 -P 9030 -uroot
# 5. 添加BE
ALTER SYSTEM ADD BACKEND "172.30.144.2:9050";
ALTER SYSTEM ADD BACKEND "172.30.144.3:9050";
ALTER SYSTEM ADD BACKEND "172.30.144.4:9050";
# 6. 查看BE状态
SHOW PROC '/backends'\G
3.6 安装 Broker
# 1. 启动
cd /root/apache-doris-fe-1.1.4-bin/apache_hdfs_broker
bin/start_broker.sh --daemon
# 2. 连接FE
mysql -h 172.30.144.1 -P 9030 -uroot
# 3. 添加Broker
ALTER SYSTEM ADD BROKER broker_name "172.30.144.5:8000";
# 4. 查看Broker节点
SHOW PROC "/brokers"\G
3.7 主要端口
4. 数据模型
4.1 聚合模型
数据写入时,按照维度列对其他指标列进行聚合操作,操作结果:多条数据如果所有维度列相同,那么会对所有指标列进行聚合。
-- 1. 创建表
CREATE TABLE IF NOT EXISTS zgg.user
(
`city` VARCHAR(20) COMMENT "城市",
`age` SMALLINT COMMENT "年龄",
`sex` TINYINT COMMENT "性别",
`pv` BIGINT SUM DEFAULT "0" COMMENT "pv",
`min_time` INT MIN DEFAULT "0" COMMENT "最小停留时间",
`max_time` INT MAX DEFAULT "0" COMMENT "最大停留时间"
)
AGGREGATE KEY(`city`, `age`, `sex`)
DISTRIBUTED BY HASH(`city`) BUCKETS 3;
-- 2. 写入数据
INSERT INTO zgg.user VALUES('北京', 25, 1, 1, 50, 100);
INSERT INTO zgg.user VALUES('北京', 20, 0, 1, 150, 300);
-- 3. 写入相同数据
INSERT INTO zgg.user VALUES('北京', 25, 1, 1, 15, 3100);
4.2 Unique 模型
通过定义主键保证数据的唯一性,Unique 模型简化了数据导入流程,能够更好地支撑实时和频繁更新的场景。
-- 1. 创建表CREATE TABLE IF NOT EXISTS zgg.user_unique
(
`user_id` LARGEINT NOT NULL COMMENT "用户id",
`city` VARCHAR(20) COMMENT "城市",
`age` SMALLINT COMMENT "年龄", `sex` TINYINT COMMENT "性别")
UNIQUE KEY(`user_id`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 3;
-- 2. 写入数据
INSERT INTO zgg.user_unique VALUES(1, '北京', 25, 1);
INSERT INTO zgg.user_unique VALUES(2, '上海', 35, 0);
-- 3. 写入主键相同数据
INSERT INTO zgg.user_unique VALUES(1, '沈阳', 15, 1);
4.3 Duplicate 模型
用于存储原始数据,允许重复数据
-- 1. 创建表CREATE TABLE IF NOT EXISTS zgg.user_duplicate
(
`user_id` LARGEINT NOT NULL COMMENT "用户id",
`city` VARCHAR(20) COMMENT "城市",
`age` SMALLINT COMMENT "年龄",
`sex` TINYINT COMMENT "性别")
DUPLICATE KEY(`user_id`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 3;
-- 2. 写入数据
INSERT INTO zgg.user_duplicate VALUES(1, '北京', 25, 1);
INSERT INTO zgg.user_duplicate VALUES(2, '上海', 35, 0);
-- 3. 写入主键相同数据
INSERT INTO zgg.user_duplicate VALUES(1, '沈阳', 15, 1);
5. 事件分析适配:分页面 PV、分页面 UV
步骤 1:使用 Duplicate 模型存储原始数据
CREATE TABLE IF NOT EXISTS zgg.user_all
(
`date` DATE NOT NULL COMMENT "时间",
`page` VARCHAR(20) NOT NULL COMMENT '页面',
`user_id` LARGEINT NOT NULL COMMENT "用户id")
DUPLICATE KEY(`date`, `page`, `user_id`)
DISTRIBUTED BY HASH(`date`) BUCKETS 3;
-- 插入测试数据
INSERT INTO zgg.user_all VALUES('2022-11-18', 'login', 1);
INSERT INTO zgg.user_all VALUES('2022-11-18','login', 2);
INSERT INTO zgg.user_all VALUES('2022-11-18','order', 1);
INSERT INTO zgg.user_all VALUES('2022-11-18','order', 1);
INSERT INTO zgg.user_all VALUES('2022-11-18','order', 2);
INSERT INTO zgg.user_all VALUES('2022-11-18','pay', 1);
INSERT INTO zgg.user_all VALUES('2022-11-18','pay', 1);
步骤 2:使用聚合模型计算分页面 PV
上篇:
Hologre 产品介绍与技术揭秘 - 实时数仓技术入门一本通
下篇:
ClickHouse存算分离改造:小红书自研云原生数据仓库实践