Apache Paimon 在同程旅行的探索与实践
2023-09-30 11:42:29
Paimon:同程旅行实时数仓实践
挑战:数据处理需求激增
随着数字化浪潮的席卷,同程旅行作为业界领先的在线旅行服务商,其庞大的用户群和多元化的业务场景对实时数据处理提出了严峻挑战。日均数百 TB 的数据量和复杂的整合需求让传统数仓系统不堪重负,处理速度慢、整合难度大、需求难以满足成为制约同程旅行业务发展的瓶颈。
解决方案:Paimon,实时数仓新篇章
为了解决这些难题,同程旅行决定采用Apache Paimon构建新的实时数仓系统。Paimon基于Apache Flink和Apache Doris,集高性能、低成本、易扩展、易运维等优点于一身,完美契合同程旅行的业务诉求。
Paimon系统架构
Paimon采用三层架构设计:
-
数据采集层: 从各种数据源(如在线预订系统、移动端 App、线下门店)采集数据,并写入Apache Kafka。
-
数据处理层: 对Kafka中的数据进行清洗、转换、聚合等操作,并将处理后的数据写入Apache Doris。
-
数据服务层: 为用户提供数据查询服务。
Paimon优势
-
高性能: 得益于Flink和Doris的强劲实力,Paimon拥有超高的处理速度,满足同程旅行庞大数据量的实时处理需求。
-
低成本: Paimon作为开源软件免费使用,且运维成本低廉,为同程旅行节省了可观的开支。
-
易扩展: Paimon架构灵活性高,可根据业务需求轻松扩展,满足同程旅行未来数据处理需求的持续增长。
-
易运维: Paimon运维管理简单,部署和管理都十分便捷,为同程旅行团队减轻了运维负担。
实践应用:写入性能3.3倍,查询性能7.7倍
同程旅行在实践中将原有Hudi系统替换为Paimon,效果显著:
- 写入性能提升3.3倍
- 查询性能提升7.7倍
这极大提升了同程旅行的业务响应速度,为业务发展提供了强有力的支撑。
挑战与应对
在Paimon落地应用过程中,同程旅行也遇到了挑战:
- 数据迁移: 将原有Hudi数据迁移至Paimon需要耗费大量时间和精力。
- 人才培养: Paimon作为新系统,需要对技术团队进行全面培训。
- 系统监控: 建立完善的系统监控体系,确保Paimon稳定运行。
面对这些挑战,同程旅行采取了以下措施:
- 数据迁移: 采用分阶段迁移的方式,分批次迁移数据,减少对业务的影响。
- 人才培养: 为技术团队提供全面的培训,让他们熟练掌握Paimon使用。
- 系统监控: 建立了完善的监控体系,保障Paimon的稳定运行。
通过以上措施,同程旅行成功应对挑战,顺利落地Paimon系统,并取得了优异的应用效果。
Paimon,实时数仓的未来
Paimon作为一款优秀的实时数仓引擎,其高性能、低成本、易扩展、易运维的特性满足了企业对实时数据处理的迫切需求。同程旅行的实践案例为其他企业采用Paimon提供了宝贵的经验,相信Paimon将成为更多企业实时数仓建设的理想选择。
常见问题解答
1. Paimon与其他实时数仓引擎有何区别?
Paimon基于Flink和Doris,拥有高性能、低成本、易扩展、易运维等优势,在处理速度、成本控制、扩展性和运维便捷性等方面更胜一筹。
2. Paimon适合哪些场景?
Paimon适用于对实时数据处理有较高要求的场景,如在线零售、金融风控、物流管理等,可满足企业对实时数据分析、实时决策等需求。
3. Paimon的数据源支持有哪些?
Paimon支持多种数据源,包括关系型数据库、非关系型数据库、日志文件、物联网设备等,满足企业多样化的数据整合需求。
4. Paimon的部署方式有哪些?
Paimon提供多种部署方式,包括本地部署、云端部署、混合部署,可满足不同企业的部署需求。
5. Paimon的社区支持如何?
Paimon拥有活跃的社区支持,提供文档、论坛、交流群等多种渠道,为用户提供技术支持和交流平台。
代码示例
import org.apache.paimon.processor.PaimonProcessor;
import org.apache.paimon.record.PaimonRecord;
import org.apache.paimon.source.PaimonSource;
public class PaimonExample {
public static void main(String[] args) {
// 创建Paimon数据源
PaimonSource source = new PaimonSource();
// 创建Paimon处理器
PaimonProcessor processor = new PaimonProcessor();
// 处理数据
processor.process(source.getData());
// 输出结果
for (PaimonRecord record : processor.getResults()) {
System.out.println(record);
}
}
}