通过Apache Hudi和Alluxio建设高性能数据湖
T3出行的杨华和张永旭描述了他们数据湖架构的发展。该架构使用了众多开源技术,包括Apache Hudi和Alluxio。在本文中,您将看到我们如何使用Hudi和Alluxio将数据摄取时间缩短一半。此外,数据分析人员如何使用Presto、Hudi和Alluxio让查询速度提高了10倍。我们基于数据编排为数据管道的多个阶段(包括提取和分析)构建了数据湖。
1.T3出行数据湖总览
T3出行当前还处于业务扩张期,在构建数据湖之前不同的业务线,会选择不同的存储系统、传输工具以及处理框架,从而出现了严重的数据孤岛使得挖掘数据价值的复杂度变得非常高。由于业务的迅速发展,这种低效率成为了我们的工程瓶颈。
我们转向了基于阿里巴巴OSS(类似于AWS S3的对象存储)的统一数据湖解决方案,以遵循多集群、共享数据架构(Multi-cluster,Shared-data Architecture)的设计原则提供集中位置来存储结构化和非结构化数据。与不同的数据孤岛相反,所有应用程序都将OSS存储作为事实的来源来访问。这种体系结构使我们能够按原样存储数据,
而不必先对数据进行结构化,并运行不同类型的分析以指导更好的决策,通过大数据处理,实时分析和机器学习来构建仪表板和可视化。
2.使用Hudi进行高效的近实时分析
T3出行的智能出行业务推动了对近实时处理和分析数据的需求。使用传统的数据仓库,我们面临以下挑战:
- 长尾更新引发冷数据频繁与级联更新
- 超长的业务窗口导致订单分析回溯成本高
- 随机更新及迟到数据无法预判
- 数据摄取Pipeline无法保证可靠性
- 分布式数据Pipeline中丢数据无法对账
- 数仓数据摄取的延迟性很高
因此,我们在OSS之上采用了Apache Hudi来解决这些问题。下图展示了Hudi的体系结构:

2.1启用近实时数据摄取和分析
T3出行数据湖支持Kafka 消息、Mysql binlog、GIS、业务日志等多种数据源近实时入湖,全公司60%以上的数据已经存入数据湖,并且这个比例还在不断扩大。
T3出行通过在数据管道中引入Hudi将数据的摄取时间缩短至几分钟,再结合大数据交互式查询与分析框架(如Presto和SparkSQL),可以实现更实时地对数据进行洞察、分析。
2.2启用增量处理管道
T3出行借助于Hudi提供的增量查询的能力,对于频繁变更场景中的多层数据加工的场景,可以只将增量的变更反馈给下游的派生表,下游的派生表只需要应用这些变更数据,就可以快速完成多层链路的局部数据更新,从而极大地降低了频繁变更场景下的数据更新的效率。有效地避免了传统Hive数仓中的全分区、冷数据更新。
2.3使用Hudi作为统一数据格式
传统的数据仓库通常部署Hadoop来存储数据并提供批处理分析,Kafka单独用于将数据分发到其他数据处理框架,从而导致数据重复。Hudi有效解决了这个问题,我们始终使用Spark-kafka管道将最新更新的数据插入到Hudi表中,然后以增量方式读取Hudi表的更新。换句话说,Hudi统一了存储。
3.使用Alluxio进行高效的数据缓存
在早期版本的数据湖中并没有使用Alluxio,Spark实时处理从Kafka接收的数据,然后使用Hudi DeltaStreamer任务将其写入OSS。执行这个流程时,Spark在直接写入OSS时网络延迟通常非常高。因为所有数据都存储在OSS中,导致数据缺失本地性,所以对Hudi数据的OLAP查询也非常慢。
为了解决延迟问题,我们将Alluxio部署为数据编排层,与Spark和Presto等计算引擎共置一处,并使用Alluxio加速了对数据湖的读写,如下图所示:

Hudi,Parquet,ORC和JSON等格式的数据大部分存储在OSS上,占95%的数据。 Flink,Spark,Kylin和Presto等计算引擎分别部署在隔离的群集中。当每个引擎访问OSS时,Alluxio充当虚拟分布式存储系统来加速数据,并与每个计算群集共存。
下面介绍一下T3出行数据湖中使用Alluxio的案例:
3.1数据入湖
我们将Alluxio与计算集群共置部署。在数据入湖前,将对应的OSS路径挂载至alluxio文件系统中,然后设置Hudi的"--target-base-path"参数 从oss://... 改为 alluxio://... 。在数据入湖时,我们使用Spark引擎拉起Hudi程序不断摄入数据,数据此时在alluxio中流转。Hudi程序拉起后,设置每分钟将数据从Allxuio缓存中异步同步至远程OSS。这样Spark从之前的写远程OSS转变为写本地的Alluxio,缩短了数据入湖的时长。
3.2湖上数据分析
我们使用Presto作为自助查询引擎,分析湖上的Hudi表。在每一个Presto worker节点共置Alluxio。当Presto与Alluxio服务共置运行时,Alluxio可能会将输入数据缓存到Presto worker的本地,并以内存速度提供下次检索。在这种情况下,Presto可以利用Alluxio从本地的Alluxio worker存储读取数据(称之为短路读取),无需任何额外的网络传输。
3.3跨多个存储系统的并发访问
为了确保训练样本的准确性,我们的机器学习团队经常将生产中的脱敏数据同步到离线机器学习环境。在同步期间,数据跨多个文件系统流动,从生产OSS到线下数据湖集群HDFS,最后同步到机器学习集群的HDFS。
对于数据建模人员来说,数据迁移过程不仅效率低下,而且会因错误配置而导致出错,因为其中涉及多个不同配置的文件系统。于是我们引入Alluxio,将多个文件系统都挂载到同一个Alluxio下,统一了命名空间。端到端对接时,使用各自的Alluxio路径,这保证了具有不同API的应用程序无缝访问和传输数据。这种数据访问布局还可以提高性能。
3.4基准测试
总体而言,我们观察到了Alluxio的以下优势:
- Alluxio 支持层次化且透明的缓存机制;
- Alluxio 支持读取时缓存 promote 模式;
- Alluxio 支持异步写模式;
- Alluxio 支持 LRU 回收策略;
- Alluxio 拥有 pin 以及 TTL 特性;
经过比较和验证后,我们选择使用Spark SQL作为查询引擎,查询了Hudi表,存储层分别是Alluxio + OSS、OSS、HDFS这三组不同文件系统。
压测时发现,数据量大于一定量级(2400W)后,使用alluxio+oss的查询速度超越了混合部署的HDFS查询速度,数据量大于1E后,查询速度开始成倍提升。到达6E数据后,相对于查询原生oss达到12倍提升,相对于查询原生HDFS达到8倍提升。数据规模越大,性能提升越显著,提升的倍数取决于机器配置。

4.展望
随着T3出行的数据湖生态系统的扩展,我们将继续面对计算和存储隔离的关键场景随着T对数据处理需求的增长,我们的团队计划大规模部署Alluxio,以加强数据湖查询能力。
所以除了数据湖计算引擎(主要是Spark SQL)上会部署Alluxio外,后续在OLAP集群(Apache Kylin)和ad_hoc集群(Presto)上架一层Alluxio。Alluxio将覆盖全场景,每个场景间Alluxio互联,提升数据湖以及围湖生态的读写效率。
5.结论
正如前面所讲,Alluxio覆盖了Hudi近实时摄取,近实时分析,增量处理,DFS上数据分发等所有场景,在数据入湖和湖上数据分析链路上都扮演了强力加速器的角色,两者可谓强强联手。落地到具体场景上,研发工程师将数据入湖时间缩短了1-2倍。数据分析人员使用Presto+Hudi+Alluxio查询湖上数据的速度提高了10倍以上。Alluxio是T3出行成为中国领先的企业级数据湖计划中重要组成部分,我们期待在T3出行的数据湖生态系统中与Alluxio进一步集成。
通过Apache Hudi和Alluxio建设高性能数据湖的更多相关文章
- 使用Apache Hudi构建大规模、事务性数据湖
一个近期由Hudi PMC & Uber Senior Engineering Manager Nishith Agarwal分享的Talk 关于Nishith Agarwal更详细的介绍,主 ...
- 基于Apache Hudi在Google云构建数据湖平台
自从计算机出现以来,我们一直在尝试寻找计算机存储一些信息的方法,存储在计算机上的信息(也称为数据)有多种形式,数据变得如此重要,以至于信息现在已成为触手可及的商品.多年来数据以多种方式存储在计算机中, ...
- 生态 | Apache Hudi集成Alluxio实践
原文链接:https://mp.weixin.qq.com/s/sT2-KK23tvPY2oziEH11Kw 1. 什么是Alluxio Alluxio为数据驱动型应用和存储系统构建了桥梁, 将数据从 ...
- 基于Apache Hudi和Debezium构建CDC入湖管道
从 Hudi v0.10.0 开始,我们很高兴地宣布推出适用于 Deltastreamer 的 Debezium 源,它提供从 Postgres 和 MySQL 数据库到数据湖的变更捕获数据 (CDC ...
- JindoFS解析 - 云上大数据高性能数据湖存储方案
JindoFS背景 计算存储分离是云计算的一种发展趋势,传统的计算存储相互融合的的架构存在一定的问题, 比如在集群扩容的时候存在计算能力和存储能力相互不匹配的问题,用户在某些情况下只需要扩容计算能力或 ...
- 基于Apache Hudi构建数据湖的典型应用场景介绍
1. 传统数据湖存在的问题与挑战 传统数据湖解决方案中,常用Hive来构建T+1级别的数据仓库,通过HDFS存储实现海量数据的存储与水平扩容,通过Hive实现元数据的管理以及数据操作的SQL化.虽然能 ...
- Apache Hudi助力nClouds加速数据交付
1. 概述 在nClouds上,当客户的业务决策取决于对近实时数据的访问时,客户通常会向我们寻求有关数据和分析平台的解决方案.但随着每天创建和收集的数据量都在增加,这使得使用传统技术进行数据分析成为一 ...
- Robinhood基于Apache Hudi的下一代数据湖实践
1. 摘要 Robinhood 的使命是使所有人的金融民主化. Robinhood 内部不同级别的持续数据分析和数据驱动决策是实现这一使命的基础. 我们有各种数据源--OLTP 数据库.事件流和各种第 ...
- Apache Hudi:CDC的黄金搭档
1. 介绍 Apache Hudi是一个开源的数据湖框架,旨在简化增量数据处理和数据管道开发.借助Hudi可以在Amazon S3.Aliyun OSS数据湖中进行记录级别管理插入/更新/删除.AWS ...
随机推荐
- Java_进程与线程
进Process&Thread 区别 进程 线程 根本区别 作为资源分配的单位 调度和执行的单位 开销 每个进程都有独立的代码和数据空间(进程上下文), 进程间的切换会有较大的开销 线程可以看 ...
- Elasticsearch原理解析与性能调优
基本概念 定义 一个分布式的实时文档存储,每个字段 可以被索引与搜索 一个分布式实时分析搜索引擎 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据 用途 全文检索 结构化搜索 分 ...
- Java—字符流
一.字符流 字符流概述: 在操作过程中字节流可以操作所有数据,操作的文件中有中文字符,并且需要对 中文字符做出处理 二.字符编码表 文字-->(数字):编码."abc".ge ...
- Elasticsearch 第七篇:父子结构mapping设计以及相关查询
h2.post_title { background-color: rgba(43, 102, 149, 1); color: rgba(255, 255, 255, 1); font-size: 1 ...
- 实现一个简易vue
vue主要的功能实现主要分为3部分: 数据劫持/数据代理:数据改变时通知相关函数进行更新操作 数据依赖收集:建立保存dom节点与数据的关联关系 模板与数据之间的绑定:接受到新数据时对dom节点进行更新 ...
- 分库分表神器 Sharding-JDBC,几千万的数据你不搞一下?
今天我们介绍一下 Sharding-JDBC框架和快速的搭建一个分库分表案例,为讲解后续功能点准备好环境. 一.Sharding-JDBC 简介 Sharding-JDBC 最早是当当网内部使用的一款 ...
- ceph与flashcache的around模式结合启动问题
问题 通过对我们的启动流程看了下,目前是穿到一个脚本里面的,然后这个脚本是用无限循环的方式去执行一些事情,这个地方不符合松耦合的设计,一个模块做一个事情,两个并不相关的功能不要嵌入另一个脚本,否则出现 ...
- Python_案例_斐波那契数
方法一: 1 #!/usr/bin/python3 2 3 # Fibonacci series: 斐波纳契数列 4 # 两个元素的总和确定了下一个数 5 a, b = 0, 1 6 while b ...
- 建议收藏,从零开始创建一个Activiti工作流,手把手教你完成
环境配置 项目环境: JDK1.8 tomcat7 maven3.5 开发工具: IDEA activiti7 创建项目 目标:创建一个maven项目,集成Activiti,并自动生成25张数据库表 ...
- Qt For MacOs环境搭建
使用VMWARE关于macos镜像搭建,参考https://blog.csdn.net/u011415782/article/details/78505422 关于darwin8.5.5 来安装vmt ...