本文将帮你理解跨越速运如何用Apache Flink和OceanBase数据库,实现物流运单的实时大数据分析,支持日调用超千万次,99%查询延迟低于1秒,满足亿级数据实时更新和复杂多表关联查询需求。
一、背景和需求:为什么要用实时计算和分布式数据库?
跨越速运是中国知名的物流企业,服务覆盖全国99%城市,年服务企业超百万。随着业务增长,数据量和查询需求激增:
- 日调用量超过1000万次,支持6万员工和100多位BI分析师的实时数据查询。
- 物流运单数据涉及几十个业务系统,数据量巨大,且需要实时整合和分析。
- 用户要求查询延迟低于1秒,且能实时更新超过1亿行数据,支持多表关联和任意维度聚合。
因此,系统需要:
- 极高的查询性能和稳定的计算引擎
- 支持实时写入、更新
- 易用,兼容MySQL协议,支持标准SQL
- 支持多种数据源,保证数据流畅进出
二、核心技术选型:为什么选Flink和OceanBase?
1. 实时计算引擎选型
- Storm 、Spark Streaming 和Flink是主流实时计算框架。
- 测试显示Storm和Flink延迟都在毫秒级。
- Flink支持流批一体(既能处理有界数据批处理,也能处理无界数据流)、状态管理强、生态丰富、易用性好。
- 因此选择了Apache Flink作为实时计算引擎。
2. 数据库选型
- 进行了基于运单业务场景的自建Benchmark测试,测试环境为3台32核CPU、128GB内存、SSD硬盘的服务器。
- 测试数据规模:最大表1亿行,约35GB数据。
- 对比了OceanBase、DB-U(某HTAP数据库)、DB-X(某AP实时分析数据库)、Doris、Trino等数据库。
- OceanBase在查询性能、写入性能、功能支持、运维便利性等方面表现优异。
- OceanBase支持HTAP(混合事务和分析处理) ,即同一套系统既支持OLTP(事务处理)又支持OLAP(分析查询),满足实时写入和实时分析的双重需求。
- OceanBase采用行列混合存储,压缩比高,节省存储成本。
- 兼容MySQL协议,方便迁移和使用。
三、系统架构与实现
1. 实时运单公共层架构
- 业务数据来自订单、跟单、配载、调度、质控、财务等多个系统。
- 使用Flink对业务数据进行复杂关联和分层计算,形成运单领域的"大宽表"(DWD层)。
- 数据实时写入OceanBase数据库。
- 大数据平台通过接口服务对外提供实时查询和分析。
- 通过轻度汇总形成近15天的运单时效产品分析表(DWS层),再高度汇总成大盘指标(ADS层),通过QuickBI实现可视化。
2. 实时宽表建设难点及解决方案
- 数据来源多样,数据时效性要求高。
- 需要实时打宽(多表关联合并成宽表),支持数据复用。
- 方案对比:
方案 | 优点 | 缺点 |
---|---|---|
Flink Join | 支持一对多关联 | 大状态影响性能,需要设计TTL |
HBase部分列更新 | 支持高并发写和随机读 | 需自研CDC服务,维护复杂 |
StarRocks部分列更新 | 支持数据合并和分析一体 | 只支持同主键合并,不支持CDC |
OceanBase部分列更新 | 支持CDC,简化链路,性能优异 | 目前不支持Hive集成 |
- 选择OceanBase部分列更新,结合Flink CDC实现数据实时同步。
3. 实时运单分析架构演进
- 架构1.0:MySQL通过Canal监听数据变更,写入Kafka;Flink读取Kafka数据写入HBase宽表;HBase CDC同步数据到Kafka;Flink再写入DB-X数据库;多组件链路复杂,维护成本高,时效性约20秒。
- 架构2.0:MySQL通过Canal监听写入Kafka;Flink读取Kafka数据,直接写入OceanBase宽表;利用OceanBase CDC和Flink状态管理做分层计算,写回OceanBase;链路简化,时效性提升5~15秒,成本节约约50%。
四、技术关键点及代码示例
1. Flink CDC连接OceanBase示例配置(简化版)
java
// Flink CDC连接OceanBase配置示例
Properties props = new Properties();
props.setProperty("hostname", "oceanbase-host");
props.setProperty("port", "2881");
props.setProperty("username", "root");
props.setProperty("password", "password");
props.setProperty("database-name", "logistics_db");
props.setProperty("table-name", "shipment_orders");
FlinkCDCSource<String> source = MySQLSource.<String>builder()
.hostname(props.getProperty("hostname"))
.port(Integer.parseInt(props.getProperty("port")))
.databaseList(props.getProperty("database-name"))
.tableList(props.getProperty("database-name") + "." + props.getProperty("table-name"))
.username(props.getProperty("username"))
.password(props.getProperty("password"))
.deserializer(new JsonDebeziumDeserializationSchema()) // 将变更数据转成JSON
.build();
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> stream = env.fromSource(source, WatermarkStrategy.noWatermarks(), "OceanBase CDC Source");
// 对数据进行简单清洗和转换
DataStream<ShipmentOrder> orders = stream.map(json -> parseJsonToShipmentOrder(json));
// 将处理后的数据写入OceanBase
orders.addSink(new OceanBaseSinkFunction(...));
env.execute("OceanBase CDC Flink Job");
2. 实时宽表构建示例SQL(Flink SQL)
sql
-- 从Kafka读取订单和配载数据,做关联,构建宽表
CREATE TABLE orders (
order_id STRING,
user_id STRING,
order_time TIMESTAMP(3),
...
) WITH (...);
CREATE TABLE shipments (
shipment_id STRING,
order_id STRING,
shipment_time TIMESTAMP(3),
...
) WITH (...);
CREATE TABLE wide_order_shipments (
order_id STRING,
user_id STRING,
order_time TIMESTAMP(3),
shipment_id STRING,
shipment_time TIMESTAMP(3),
...
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:oceanbase://oceanbase-host:2881/logistics_db',
'table-name' = 'wide_order_shipments',
'username' = 'root',
'password' = 'password'
);
INSERT INTO wide_order_shipments
SELECT o.order_id, o.user_id, o.order_time, s.shipment_id, s.shipment_time
FROM orders o
LEFT JOIN shipments s ON o.order_id = s.order_id;
五、OceanBase数据库核心优势
- 分布式事务引擎:支持ACID事务和强一致性,全球唯一通过TPC-C测试的分布式关系型数据库。
- 透明可扩展:支持在线扩容,单集群最大支持1500+节点,数据量超3PB,单表行数可达万亿级。
- 高可用性:无单点故障,支持多机房多活部署,灾难恢复RPO=0,RTO<30秒。
- HTAP能力:同一套系统同时支持事务处理(OLTP)和分析查询(OLAP)。
- 兼容MySQL协议:零成本迁移,支持MySQL 5.6全语法。
- 高性能:准内存架构,基于LSM-Tree存储引擎,读写性能远超传统关系型数据库。
- 安全性:支持权限控制、数据加密、审计等企业级安全功能。
六、总结与展望
跨越速运通过Flink + OceanBase构建的实时分析平台,实现了:
- 日调用超千万,99%查询延迟低于1秒
- 实时更新亿级数据,支持复杂多表关联和任意维度聚合
- 架构简洁,维护成本降低50%
- 数据时效性提升5~15秒,用户体验显著改善
未来计划:
- 用MySQL CDC替代Canal,降低延迟和复杂度
- OceanBase作为实时维表,提高查询效率
- 部分MySQL事务场景迁移至OceanBase,提升吞吐和并发
- 集成Flink SQL血缘管理,实现更好的数据治理和运维
通过以上内容,你可以清晰理解跨越速运如何利用Flink的流式计算能力和OceanBase的分布式HTAP数据库,实现物流行业高并发、低延迟的实时数据分析需求。希望这些基础知识和示例代码,能帮助你快速入门实时大数据架构设计。