Doris实时数仓ods层构建

349 阅读3分钟

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 层;