导读:随着川航大规模数据导入需求增长,数据响应频繁出现卡顿,原 Hadoop + Apache Doris 的数据架构存在着涉及组件多、并发性不足、数据导入受限的痛点。经过综合选型对比,川航选择引入 SelectDB 建设湖仓一体大数据分析引擎,取得了数据导入效率提升 3-6 倍,查询分析性能提升 10-18 倍、实时性提升至 5 秒内等收益。
本文转录自吴乐(四川航空 信息技术部 大数据架构师)在 Doris Summit Asia 2024 上的演讲,经编辑整理。
四川航空股份有限公司(以下简称:川航),自开航至今持续安全飞行 36 年,现运营全空客机队超过 200 架飞机,年运送旅客量超过 3000 万,航线覆盖亚洲、欧洲、北美洲、大洋洲和非洲,品牌价值超过 900 亿。
航空公司的业务具有业务系统繁多、数据交互复杂、实时性要求高三大特点。
2010 年,川航使用 Oracle 建设简单数仓用于报表查询。随着数据量增长,2014 年,川航转用 Hadoop 大数据平台,建立离线数仓以提升报表刷新时效。为满足更高的实时性与查询性能需求,在 2018 年,川航采用 Hadoop + Apache Doris 构建数据中台。然而,随着大规模数据导入需求增长,该架构涉及组件繁多,数据响应频繁出现卡顿。2022 年,我们选择 Apache Doris 作为数据分析的主要入口,并最终选择 Apache Doris 企业版 SelectDB 建设湖仓一体大数据分析引擎,统一 OLAP 技术栈与数据服务。
川航早期数据架构分为数据源、数据集成、离线数仓、查询入口与数据应用五大部分:
该架构存在以下痛点:
为解决以上痛点,川航决定升级数据架构以满足航班、票务、旅客、机组、机务、财务等多个领域+多样化数据“采存管用”需求。经过综合评估,川航最终选择 Apache Doris 企业版 SelectDB 建设湖仓一体大数据分析引擎。SelectDB 湖仓一体特性通过多源数据目录(Multi-Catalog)功能,支持了包括 Apache Hive、Apache Iceberg、Apache Hudi、Apache Paimon、LakeSoul、MySQL、Oracle、SQL Server 等主流数据湖、数据库的连接访问,并可以通过 Apache Ranger 等实现统一权限管理。
SelectDB 凭借湖仓一体特性、丰富导入方式、卓越性能表现及广泛生态支持,有效解决了川航的多项痛点,全面满足其业务需求:

基于 SelectDB 的新架构在数据集成和分析引擎上完成升级:

在基于 SelectDB 的湖仓一体架构中,业务库中的航班调度、旅客服务数据直接通过 FlinkCDC 实时同步入仓。消息报文等数据则通过 Routine Load 从 Kafka 消费入仓。数据湖 Hive 存储 Acars 日志数据,通过 Hive Catalog 与 SelectDB 快速内表关联,加速查询。对于不常用的数据库,川航直接通过外表查询接入 SelectDB,实现高效分析查询。

SelectDB 统一了联邦数据湖分析场景的查询入口,使得川航能够借助 JDBC Catalog 直连 MySQL、Oracle 等数据源,实现跨数据源联邦分析,同时也可作为 JDBC 类数据集成的有效途径。此外,川航通过 Hive Catalog 可直接访问 Acars 飞机日志,并与内部表关联,加速分析进程。
## 川航通过 Hive Catalog 直接访问 Acars 飞机日志
CREATA CATALOG HIVE
PROPERTIES(
'type' = 'hms',
'hive.metastore.uris' = 'thrift://172.0.0.1:9083',
);
SELECT * FROM HIVE.DB.TABLE a JOIN INTERNAL.DB.TABLE b
ON a.id = b.id
部分数据导入也可直接使用 Hive 通过 Insert 方式插入至 SelectDB 内部表。
INSERT INTO INTERNAL.DB.TABLE SELECT * FROM HIVE.DB.TABLE WHERE DATE = "2024-11-21";
部分数据湖分析数据可以直接对业务数据库做数据写回,并进行数据分析。
INSERT INTO JDBC.DB.TABLE1 SELECT * FROM HIVE.DB.TABLE
WHERE DATE = "2024-11-21";
川航基于 SelectDB 湖仓一体架构,有效解决了复杂业务系统中数据源众多、交付复杂、导入受限等问题,显著提升了异构数据源间的联邦与关联分析效率,并实现了简单高效的数据交换与共享。
SelectDB 倒排索引特性能够加速字符串数据全文检索,并支持自定义分词,能够很好地支撑多维度快速检索分析,从海量数据中快速筛选符合条件的行。
川航充分利用 SelectDB 倒排索引特性,结合乘客乘机体验评价数据,实现了词云展示。通过分析乘客反馈中的关键词,川航能够直观地展示出乘客最关心的服务内容与体验,从而为后续的服务改进提供数据支持。

通过对比测试,川航发现使用倒排索引后,查询性能相比传统的 LIKE 或全文检索匹配,提升了约 4 倍。这一显著提升减少了数据检索时间成本,帮助川航更快地响应市场变化和客户需求。
未来,SelectDB 的倒排索引特性将应用于川航更多场景,例如结合川航情感分析模型,实现更深入的数据分析。
为满足川航多样化场景需求,确保数据处理灵活、高效、实时,选用恰当的表模型至关重要。SelectDB 支持包含聚合模型、主键模型以及明细模型在内的多种数据表模型。川航基于 SelectDB 的数据建模规则如下。
## 职级人数聚合示例
CREATE TABLE selectdb_agg_tab(
flight_id varchar(30),
date varchar(30),
ac_cnt BIGINT SUM DEFAULT '0'
) AGGREGATE KEY(flight_id, date)
DISTRIBUTED BY HASH(flight_id) BUCKETS 10

Unique Key 主键模型:应用于 ODS 层,进行唯一性数据更新,例如对航班状态、客票状态更新。
## 航班编号更新示例
CREATE TABLE selectdb_uni_tab(
flight_id varchar(30),
date varchar(30),
status varchar(30),
) UNIQUE KEY(flight_id)
DISTRIBUTED BY HASH(flight_id) BUCKETS 10

Duplicate Key 明细模型:应用于对明细数据与变更记录进行分析的场景。
CREATE TABLE selectdb_dup_tab(
tkt_id varchar(30),
date varchar(30),
status varchar(30),
) DUPLICATE KEY(tkt_id)
DISTRIBUTED BY HASH(tkt_id) BUCKETS 10

航空公司小批量实时数据导入更新需求频繁。为此,川航利用 SelectDB Merge-on-Write 更新能力实现小批量实时数据高频导入,并基于主键进行高频数据更新。SelecDB 主键模型专为数据更新设计。支持 Merge-on-Read(MoR)和 Merge-on-Write(MoW)两种存储方式,MoR 模式优化写入性能,MoW 则提供了更好的分析性能。目前,川航数仓 ODS 层数据通过 CDC 实时同步导入,全部采用 Merge on Write 表,基于主键进行 UPSERT 操作,提升性能。
CREATE TABLE ODS_SCALFOC.'ODS_FLIGHT_BASIC_INFO'(
'FLIGHT_ID' decimal(9,0) NULL COMMENT '航班主键',
'FLIGHT_DATE' date NULL COMMENT '航班日期',
'FLIGHT_TYPE' varchar(23) NULL COMMENT '航班类型',
.......
)ENGINE = OLAP
UNIQUE KEY('FLIGHT_ID','FLIGHT_DATE')
COMMENT 'OLAP'
DISTRIBUTED BY HASH('FLIGHT_ID') BUCKETS 10
PROPERTIES(
"replication_allocation" = "tag.location.default:3",
"enable_unique_key_merge on write" = "true"
);
测试发现,在测试数据 500 GB 的情况下,常规查询及复杂关联使用 Merge on Write 相较于 Merge on Read,性能提升近 4 倍。

SelectDB 部分列更新特性允许直接更新表中特定字段值,而非整行数据。在主键模型中,SelectDB 支持直接插入或更新部分列数据,无需读取整行数据,从而显著提升更新效率。以川航的航班报文更新为例,通常报文包含数十条基础信息,以往信息单项变更需要更新全部业务字段,效率比较低。在此场景下,SelectDB 部分列更新的能力至关重要。
## 航班状态变更报文样例片段
{
"Hdr":{
"Ver": "v1.0",
"Event": "StatusChange",
"Subevent": "CC",
"Newval": "CC",
"Oldval": "CI",
"Uptm": "20241104131901310",
"Stamp": "0b672c44-7c58-46d8-a565-e8516eec4568"
},
"Dat":{
"Flight":{
"AirlineCode": "3U",
"FilghtNumber": "9821",
"International": "I",
"Route": "CTU-ALA-BUD",
"FlightDate": "2024-11-04",
"FlightStatus": "CC",
"Suffix": "",
"DepAirport": "CTU",
"ArrAirport": "ALA"
}
}
}
该特性应用后,川航每日接收大量报文输入后,往往仅需对航班基本要素与航班状态字段进行更新,极大提升了效率。若无部分列更新能力,则需使用 Update 语句,更新较慢,严重影响性能。

报文传输后,川航通过内部 Stream Load,并使用 Flink 进行设置(代码如下所示),即可实时仅更新航班基本要素(主键)与状态。实现高效合并更新。
## Flink 设置部分列更新
'sink.properties.partial_columns' = 'true'
## 在 sink.properties.column 中指定要导入的列(必须包含所有 key 列,不然无法更新)
川航完成基于 SelectDB 的湖仓一体大数据分析引擎升级后,数据实时性、并发性、导入能力均取得显著提升,获得业务部门的广泛好评,并取得了以下关键收益:
四川航空应用 SelectDB 构建湖仓一体大数据分析引擎,解决了原架构涉及组件多、并发性不足、数据导入受限的问题,并取得了数据导入效率提升 3-6 倍,查询分析性能提升 10-18 倍、实时性提升至 5 秒内等收益。
未来,四川航空深度探索更多特性在场景应用中的可能性,以进一步降低成本并提升效率:
如果您对 SelectDB 湖仓一体相关特性感兴趣,欢迎扫描下方二维码加入 SelectDB 产品交流群交流沟通。
