热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Apache Hudi基于华米科技应用湖仓一体化改造

这篇文章主要介绍了Apache Hudi基于华米科技应用湖仓一体化改造 ,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家

1. 应用背景及痛点介绍

华米科技是一家基于云的健康服务提供商,拥有全球领先的智能可穿戴技术。在华米科技,数据建设主要围绕两类数据:设备数据和APP数据,这些数据存在延迟上传、更新频率高且广、可删除等特性,基于这些特性,前期数仓ETL主要采取历史全量+增量模式来每日更新数据。随着业务的持续发展,现有数仓基础架构已经难以较好适应数据量的不断增长,带来的显著问题就是成本的不断增长和产出效率的降低。

针对数仓现有基础架构存在的问题,我们分析了目前影响成本和效率的主要因素如下:

  • 更新模式过重,存在较多数据的冗余更新增量数据的分布存在长尾形态,故每日数仓更新需要加载全量历史数据来做增量数据的整合更新,整个更新过程存在大量历史数据的冗余读取与重写,带来的过多的成本浪费,同时影响了更新效率;
  • 回溯成本高,多份全量存储带来的存储浪费,数仓设计中为了保证用户可以访问数据某个时间段的历史状态,会将全量数据按照更新日期留存多份,故大量未变化的历史冷数据会被重复存储多份,带来存储浪费;

为了解决上述问题,保证数仓的降本提效目标,我们决定引入数据湖来重构数仓架构,架构如下:

  • 业务数据源实时接入Kafka,Flink接Kafka构建ODS实时增量数据层,实时ODS增量层主要作用有两方面:
    • 依赖ODS实时增量数据(保留原始格式,不做清洗转化)每日离线入湖来构建ODS层离线湖仓,ODS层数据后续作为业务数据的备份、满足DWD层全量数据重做需求;
    • 对ODS实时增量数据进行清洗、转换,编码后,每日增量数据离线写入DWD层,构建DWD层离线湖仓;
  • DWS层定义为主题公共宽表层,主要是对DWD层和DIM维度层各表信息,根据业务需求做多表关联转换整合,为业务和分析人员提供更易用的模型数据
  • OLAP层会提供强大的数据快速查询能力,作为对外的统一查询入口,用户直接通过OLAP引擎来即席查询分析湖仓中所有的表数据
  • ADS层会依赖其他各层数据来对业务提供定制化的数据服务

2. 技术方案选型

 HudiIcebergDelta
引擎支持Spark、FlinkSpark、FlinkSpark
原子语义Delete/Update/MergeInsert/MergeDelete/Update/Merge
流式写入支持支持支持
文件格式Avro、Parquet、ORCAvro、Parquet、ORCParquet
MOR能力支持不支持不支持
Schema Evolution支持支持支持
Cleanup能力自动手动手动
Compaction自动/手动手动手动
小文件管理自动手动手动

基于上述我们比较关心的指标进行对比。Hudi可以很好的在任务执行过程中进行小文件合并,大大降低了文件治理的复杂度,依据业务场景所需要的原子语义、小文件管理复杂度以及社区活跃度等方面综合考量,我们选择Hudi来进行湖仓一体化改造。

3. 问题与解决方案

3.1.增量数据字段对齐问题

华米数据云端由于业务原因会产生表Schema变更需求,从而避免因Schema变更而重做历史Base数据带来的高额计算成本。但由于新增产生的数据实体字段相对位置的乱序问题,导致入湖同步Hive的过程中产生异常。针对该问题,华米大数据团队也在和社区联动,解决数据字段对齐问题。在社区支持更完善的Schema Evolution之前,当前华米大数据团队的解决方案为:根据历史Base数据的Schema顺序重新对增量数据Schema顺序做编排,然后统一增量入湖。具体处理流程如下图所示:历史Base数据的Schema顺序为{id, fdata, tag, uid},增量数据的Schema{id, fdata, extract, tag, uid},可见新增extract字段顺序打乱了原先历史Base数据的Schema,可以根据所读取的历史数据Schema顺序对新增数据进行调整:

将{id, fdata, extract, tag, uid}变更为{id, fdata, tag, uid, extract},然后调用Schema Evolution给历史Base数据的Schema添加一个extract字段,最终将调整后的增量数据写入历史Base。

3.2 全球存储兼容性问题

华米大数据存储涉及多种存储(HDFS,S3,KS3),华米大数据团队新增对KS3存储的支持并合入社区代码,在Hudi0.9版本后可以支持KS3存储。

3.3 云主机时区统一问题

由于华米全球各个数据中心采用按需方式进行节点扩容,申请得到的云主机可能会出现节点时区不一致,从而会造成commit失败,我们对Hudi源码进行了改造,在hudi源码中统一了Timeline的时区(UTC)时间来保证时区统一,避免commitTime回溯导致的Commit失败。

3.4 升级新版本问题

在Hudi0.9升级到0.10版本中,会发现出现版本因version不一致造成的数据更新失败问题。出现的不一致问题已经反馈至社区,社区相关同学正在解决,现在我们暂时使用重建元数据表(直接删除metadata目标)来解决该问题,再次执行作业时,Hudi会自动重新构建元数据表。

3.5 多分区Upsert性能问题

Hudi on Spark需要根据增量数据所在的分区采集文件的索引文件,更新分区过多的情况下,性能较差。针对这一问题,目前我们通过两个层面来进行处理:

  • 推进上游进行数据治理,尽可能控制延迟数据,重复数据的上传
  • 代码层进行优化,设定时间范围开关,控制每日入湖的数据在设定时间范围内,避免延迟较久的极少量数据入湖降低表每日更新性能;对于延迟较久的数据汇集后定期入湖,从而降低整体任务性能开销

3.6 数据特性适应问题

从数据入湖的性能测试中来看,Hudi性能跟数据组织的策略有较大的关系,具体体现在以下几个方面:

  • 联合主键多字段的顺序决定了Hudi中的数据排序,影响了后续数据入湖等性能;主键字段的顺序决定了hudi中数据的组织方式,排序靠近的数据会集中分布在一起,可利用这个排序特性结合更新数据的分布特性,以尽可能减少入湖命中的base文件数据,提升入湖性能;
  • 数据湖中文件块记录条数与布隆过滤器参数的适应关系,影响了索引构建的性能;在使用布隆过滤器时,官方给出的默认存储在布隆过滤器中的条目数为6万(假设maxParquetFileSize为128MB,averageRecordSize为1024),如果数据较为稀疏或者数据可压缩性比较高的话,每个文件块可能会存储的记录数远大于6万,从而导致每次索引查找过程中会扫描更多的base文件,非常影响性能,建议根据业务数据的特性适当调整该值,入湖性能应该会有较好的提升;

4. 上线收益

从业务场景和分析需求出发,我们主要对比了实时数据湖模式和离线数据湖模式的成本与收益,实时成本远高于离线模式。鉴于目前业务实时需求并不是很高,故华米数仓在引入数据湖时暂采取Hudi + Spark离线更新模式来构建湖仓ODS原始层和DWD明细层,从测试对比和上线情况来看,收益总结如下:

4.1 成本方面

引入Hudi数据湖技术后,数据仓库整体成本有一定程度的下降,预计会降低1/4~1/3的费用。主要在于利用Hudi数据湖提供的技术能力,可以较好的解决应用背景部分阐述的两大痛点,节约数仓Merge更新与存储两部分的费用开销。

4.2 效率方面

Hudi利用索引更新机制避免了每次全量更新表数据,使得数仓表每次更新避免了大量的冗余数据的读取与写入操作,故而表的更新效率有了一定的提升。从我们数仓+BI报表整体链条层面来看,整体报表产出时间会有一定程度的提前。

4.3 稳定性层面

程序稳定性层面暂时没有详细评估,结合实际场景说下目前情况:

  • 中大表更新引入Hudi会相对较为稳定。基于Aws Spot Instance机制,对于数据量过大的表,每次全量shuffle的数据量过大,会导致拉取数据的时间过长,Spot机器掉线,程序重试甚至失败,或者内存原因导致的fetch失败,造成任务的不稳定。引入Hudi后,可以很大程度减少每次shuffle的数据量,有效缓解这一问题;
  • Hudi的Metadata表机制功能稳定性待继续完善,开启后影响程序稳定性。考虑提升程序性能,前期开启了Metadata表,程序运行一段时间后会出现报错,影响错误已经反馈给社区,暂时关闭该功能,待稳定后再开启;

4.4 查询性能层面

Hudi写入文件时根据主键字段排序后写入,每个Parquet文件中记录是按照主键字段排序,在使用Hive或者Spark查询时,可以很好的利用Parquet谓词下推特性,快速过滤掉无效数据,相对之前的数仓表,有更好的查询效率。

5. 总结与展望

从数据湖上线和测试过程来看,目前数据湖能解决我们的一些数仓痛点,但是依然存在一些问题。

总结如下

  • Hudi on Spark 布隆过滤器查找与构建索引过程性能尚待提升,由于华米数据分布特性(更新频率多,范围广),现阶段部分大表的更新性能提升有待加强;
  • Metadata表的使用是为了提升整体入湖性能,但目前由于稳定性问题暂时关闭,后续会持续关注社区Metadata表的改进;
  • 更新数据分布特性的研究至关重要,决定着如何组织数据湖中的数据分布,较大影响着任务性能,这块需要后续做进一步优化;

展望如下

  • 利用Flink + Hudi技术栈搭建实时数仓,构建kafka -> ods -> dwd -> olap的实时数据链条,满足业务近实时需求
  • 索引优化方案 -> HBase构建二级索引

以上就是Apache Hudi基于华米科技应用湖仓一体化改造 的详细内容,更多关于Apache Hudi华米科技应用改造的资料请关注编程笔记其它相关文章!


推荐阅读
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 从0到1搭建大数据平台
    从0到1搭建大数据平台 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • 本文详细介绍了HDFS的基础知识及其数据读写机制。首先,文章阐述了HDFS的架构,包括其核心组件及其角色和功能。特别地,对NameNode进行了深入解析,指出其主要负责在内存中存储元数据、目录结构以及文件块的映射关系,并通过持久化方案确保数据的可靠性和高可用性。此外,还探讨了DataNode的角色及其在数据存储和读取过程中的关键作用。 ... [详细]
  • 在Linux系统中,原本已安装了多个版本的Python 2,并且还安装了Anaconda,其中包含了Python 3。本文详细介绍了如何通过配置环境变量,使系统默认使用指定版本的Python,以便在不同版本之间轻松切换。此外,文章还提供了具体的实践步骤和注意事项,帮助用户高效地管理和使用不同版本的Python环境。 ... [详细]
author-avatar
nj擁我自己的天空
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有