Doris实时数仓ods层构建
实时数仓(Real-time Data Warehouse)的ODS层(Operational Data Store)通常位于整个数据仓库架构中的第一层或最底层,用于存储原始、实时或近实时的操作性数据。
ODS层的主要目标是捕获和存储来自不同数据源的数据,然后进行初步的数据清洗、整合和转换,以便供后续的数据仓库层次使用。
数据源
数据一般来自埋点日志数据,通过工具(如 Flume)实时监听日志数据采集到 Kafka 消息队列中,ods层的数据一般就来自于 Kafka
Kafka 数据格式如下
{
"time": 1696726188,
"distinct_id": "1234567891234567",
"ip": "1.1.1.1",
"properties": {
...
},
"time": 1696726188673,
"event": "search"
}
Doris ods层建表
Kafka 数据格式嵌套了两层 json , event 表示事件类型,properties 是事件属性,其他属性都是必有的
-- 创建事件表,按照日期字段dt进行分区
CREATE TABLE ods_event_log (
`distinct_id` varchar(256) NOT NULL COMMENT '用户id',
`time` BIGINT NOT NULL COMMENT '时间戳',
`event` varchar(256) COMMENT '事件类型',
`ip` varchar(64) COMMENT 'ip地址',
`properties` string COMMENT '事件属性',
`dt` DATE COMMENT '事件时间'
)ENGINE=OLAP
DUPLICATE KEY(`distinct_id`, `time`,`event`)
PARTITION BY RANGE (`dt`)
(
-- 自动分区
FROM ("2023-01-01") TO ("2023-10-18") INTERVAL 1 DAY
)
DISTRIBUTED BY HASH (`event`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"compression"="LZ4",
-- 开启动态分区
"dynamic_partition.enable" = "true",
-- 按天分区
"dynamic_partition.time_unit" = "DAY",
-- 预先创建三天内的分区
"dynamic_partition.end" = "3",
-- 预先创建三天内的分区
"dynamic_partition.prefix" = "p",
"dynamic_partition.buckets" = "1"
);
建表优化:根据字段的长度合适的选择其类型长度,可大大节省存储空间,如果类型长度太小则会插入报错
-- 为预防脏数据导致插入报错,可执行以下操作
-- 关闭动态分区
ALTER TABLE ods_event_log SET ("dynamic_partition.enable" = "false");
-- 将2023年的脏数据都存放到 p2022分区里
ALTER TABLE ods_event_log
ADD PARTITION p2022 VALUES LESS THAN ("2023-01-01");
-- 再次开启动态分区
ALTER TABLE ods_event_log SET ("dynamic_partition.enable" = "true");
创建routine load
例行导入(Routine Load)功能,支持用户提交一个常驻的导入任务,通过不断的从指定的数据源读取数据,将数据导入到 Doris 中。
详细介绍见: doris官网
CREATE ROUTINE LOAD dev_ods.KafkaToOdsEvent ON
ods_event_log
COLUMNS(distinct_id,
time,
event,
ip,
properties,
dt = from_unixtime(`time` / 1000, '%Y%m%d'))
PROPERTIES
(
"desired_concurrent_number" = "3",
"max_batch_interval" = "20",
"max_batch_rows" = "300000",
"max_batch_size" = "209715200",
"strict_mode" = "false",
"format" = "json"
)
FROM KAFKA
(
"kafka_broker_list" = "1.1.1.1:9092",
"kafka_topic" = "dev_event",
"property.group.id" = "event_test",
-- 最新偏移量
"property.kafka_default_offsets" = "OFFSET_END",
"property.enable.auto.commit" = "false"
);
-- 创建成功后执行以下命令查看job状态
SHOW ROUTINE LOAD ;
-- job异常停止运行后执行以下命令修改job
ALTER ROUTINE LOAD FOR KafkaToOdsEvent ... ;
-- 修改job后执行以下命令重新运行恢复job
RESUME ROUTINE LOAD FOR KafkaToOdsEvent ;
alter 详细介绍:ALTER-ROUTINE-LOAD
routine load 成功运行后即可看到数据实时进入ods层,后续根据需求即可进一步 etl 至 dwd 层;