当前位置: 首页 > article >正文

Hudi 生产问题排障-乱序Upsert入湖数据丢失

一、背景与问题在大数据流式处理领域乱序一直是一个无法越过的问题如何正确处理乱序数据也是流式组件不断努力优化的方向比如FLink提供的watermark机制forBoundedOutOfOrderness/allowedLateness/sideOutputLateData也是应对数据延迟乱序的设计。Hudi作为实时湖存储表格式提供流式数据的插入、更新、删除能力自身也对乱序有一定的处理策略特别是Upsert操作模式下支持基于precombine.field字段解决同主键数据冲突基于hoodie.is_deleted字段实现物理删除。最近我们遇到了一个头疼的问题有项目组反馈一张Flink1.16实时Upsert写入的Hudi0.14表数据量不对与离线Hive表数据做核验发现少了几万条。二、问题排查与分析我们首先检查FLink作业监控与运行日志发现指标监控与日志均正常没有任何反压、Exception等问题排除了作业运行异常导致的数据问题。我们找项目组调研了作业的数据链路与处理逻辑通过Canal实时采集上游Mysql的Binlog日志到KafkaFlink消费Kafka以Upsert模式写入Hudi表为了处理主键冲突配置了业务时间TMP_TIME为预合并字段。这是一个简单而常规的实时入湖链路理论上应该不会有问题。我们找了其他几张实时Upsert入湖的Hudi表与Hive表数据条数进行核验误差都在可控范围内实时与离线难以精准100%对齐不像出问题的这张表误差有几万条。接着推测会不会是乱序原因导致预合并失效找到Canal采集项目组确认Kafka-Topic推送策略对方反馈出于性能与负载均衡考虑采取的轮询推送策略同时发现该Kafka-Topic分区数为10。从技术上分析轮询多分区的写入搭配确实容易出现同一条主键的数据发往多个分区出现乱序处理场景。基于此思路我们在测试环境做了乱序模拟验证模拟更新删除乱序下预合并的表现。数据顺序到达或仅插入场景处理结果符合预期正常。数据乱序到达仅更新场景因建表未设置乱序处理策略默认按照OverwriteWithLatestAvroPayload即按最新到达覆盖旧数据设置为EventTimeAvroPayload可按预合并字段值排序处理。数据乱序到达涉及更新删除场景建表设置乱序处理策略为EventTimeAvroPayloadString与Decimal类型预合并字段因类型不匹配导致处理排序不生效。我们将问题表的预合并字段类型修改为bigint或timestamp进行验证后Hudi预合并处理符合预期。接着我们进行端到端数据验证发现在更新删除场景下仍然存在数据对不上的问题除了预合并阶段我们思考是否还有其他环节也存在处理异常呢我们查阅官方文档以及源码Hudi在处理同主键数据的变更合并时涉及三个关键阶段每个阶段都可能成为问题的源头预合并阶段当多条相同主键的记录同时出现在内存缓冲区时Hudi会在写入前调用HoodieRecordPayload#preCombine进行去重合并。该过程仅保留预合并字段值最大的记录此阶段对应调用链EventTimeAvroPayload.preCombine→ compareTo。读时合并阶段在MOR表读取时当Log文件中存在删除记录而Base Parquet文件中存在对应插入记录时Hudi需要通过HoodieMergedLogRecordScanner#processNextDeletedRecord来协调二者该过程需依据预合并字段值判断是保留插入记录还是应用删除记录。合并阶段在Compaction表合并阶段当Log和Parquet文件中存在同主键记录时通过EventTimeAvroPayload#combineAndGetUpdateValue进行最终合并。我们查看Compaction源码发现在处理delete记录合并时Hudi以删除记录优先未进行预合并字段比较排序。到这里问题表的异常原因基本就清晰了是Hudi三个合并处理阶段对乱序删除场景下存在逻辑处理异常。上述问题根因汇总如下序号问题阶段根本原因影响范围1预合并String/Decimal类型比较时类不匹配Utf8 vs StringGenericData.Fixed vs BigDecimal预合并结果不符合预期2读时合并processNextDeletedRecord中String/Decimal类型比较时类不匹配删除记录与插入记录取舍错误3合并combineAndGetUpdateValue中删除优先原则未考虑预合并字段值比较删除操作可能误删更新记录三、解决方案最直接的解决方案是修复Hudi在三个合并阶段的源码逻辑BUG能正常处理相同主键的记录判断与取舍操作。此问题已记录Issue#17642修复pr#17713影响0.14/1.x等多个版本暂未合入Release。此问题是相同主键乱序处理引发的保障数据顺序到达Hudi可以规避。Canal采集策略由轮询改造为Hash保障局部有序。相同主键数据有序在Flink写入Hudi前增加排序预处理。如row_num等最终我们通过修改源码重新编译打包上线解决灰度验证准出通过另一方面也在推动整体的Canal采集策略调整经过理论分析与数据验证具备可行性。四、总结展望本次生产问题的排查过程是一次由表及里的诊断剖析对账-核验-溯源。Hudi的Payload机制和preCombine机制虽然功能强大但深入理解其在不同场景下的行为差异至关重要。在后续使用过程中我们也要不断完善测试用例、监控体系及时跟进社区技术发展新动态推动Hudi技术栈的稳定高效使用。

相关文章:

Hudi 生产问题排障-乱序Upsert入湖数据丢失

一、背景与问题在大数据流式处理领域,乱序一直是一个无法越过的问题,如何正确处理乱序数据也是流式组件不断努力优化的方向,比如FLink提供的watermark机制(forBoundedOutOfOrderness/allowedLateness/sideOutputLateData&#xff…...

深入解析Xilinx PCIe IP核示例工程的仿真与调试技巧

1. Xilinx PCIe IP核示例工程快速入门 第一次接触Xilinx PCIe IP核时,我完全被复杂的文件结构和专业术语搞懵了。后来发现,只要掌握几个关键点,就能快速上手这个强大的高速串行通信接口。PCIe(Peripheral Component Interconnect …...

Kandinsky-5.0-I2V-Lite-5s多风格测试:卡通、写实、水墨画生成效果对比

Kandinsky-5.0-I2V-Lite-5s多风格测试:卡通、写实、水墨画生成效果对比 1. 开场:当静态艺术遇见动态魔法 想象一下,你珍藏的卡通插画突然活了过来,水墨画中的山水开始流动,写实照片里的场景有了生命。这正是Kandinsk…...

港大新作GS-SDF开源了!手把手教你用激光雷达+3DGS复现IROS2025论文效果(附避坑指南)

港大GS-SDF开源项目实战:从环境配置到效果复现全指南 当激光雷达遇上3D高斯溅射,会碰撞出怎样的火花?港大MARS实验室最新开源的GS-SDF项目给出了令人惊艳的答案。这个将LiDAR点云与神经符号距离场(SDF)相结合的创新方…...

从read()到硬盘:用strace和bpftrace动态追踪Linux内核文件读取的完整路径(附实战脚本)

从read()到硬盘:用strace和bpftrace动态追踪Linux内核文件读取的完整路径(附实战脚本) 当线上服务出现文件读取延迟时,大多数系统工程师的第一反应是检查磁盘I/O指标。但真正的挑战在于:如何准确定位从用户态系统调用到…...

5分钟部署Fun-ASR语音识别:支持中文、英文、日文等31种语言

5分钟部署Fun-ASR语音识别:支持中文、英文、日文等31种语言 1. 快速入门指南 1.1 学习目标 本文将带您快速完成Fun-ASR-MLT-Nano-2512多语言语音识别模型的部署与使用。通过本教程,您将掌握: 一键式Docker部署方法Web界面基本操作流程Pyt…...

PyG实战:用自定义MessagePassing为异构图构建一个简单的推荐系统消息传递层

PyG实战:构建异构图的推荐系统消息传递层 当我们在电商平台上浏览商品时,系统总能精准推荐我们可能感兴趣的内容。这背后往往隐藏着一个复杂的用户-商品交互网络,而图神经网络(GNN)正是处理这类异构关系的利器。今天,我们就来探索…...

YOLO26功能体验:官方镜像预置多种权重,开箱即用体验最新模型

YOLO26功能体验:官方镜像预置多种权重,开箱即用体验最新模型 1. 引言:告别环境配置,直接上手YOLO26 如果你对计算机视觉感兴趣,想试试最新的目标检测模型,那么YOLO26绝对值得关注。作为YOLO系列的最新成员…...

从零到一:手把手教你用cam_lidar_calibration标定自己的VLP-16与海康相机(附完整ROS Bag录制技巧)

从零到一:VLP-16激光雷达与海康相机联合标定实战指南 当激光雷达点云与相机图像在自动驾驶系统中完美对齐时,传感器融合的魔法才真正开始。作为机器人感知的核心环节,标定质量直接决定了后续目标检测、SLAM等模块的精度上限。本文将手把手带您…...

手把手教你用C语言解决Modbus TCP从站多主站连接的3个典型问题(含select使用避坑)

深度解析Modbus TCP从站多主站连接的三大实战难题与优化方案 在工业自动化领域,Modbus TCP协议因其简单可靠的特点被广泛应用于设备间通信。但当从站需要同时处理多个主站(如SCADA系统、HMI人机界面和测试工具)的连接请求时,开发者…...

告别Jupyter Lab:在香橙派AIpro上部署YOLOv5模型的三种实战方法(含命令行与VSCode远程)

香橙派AIpro进阶开发:YOLOv5模型部署的三种高效工作流实战 当你第一次在香橙派AIpro上运行官方提供的YOLOv5目标检测样例时,那种兴奋感可能还记忆犹新——通过Jupyter Notebook点击几下就能看到实时物体识别效果确实令人惊艳。但作为一名有经验的开发者&…...

CLIP-GmP-ViT-L-14入门指南:理解ImageNet/ObjectNet双基准评估意义

CLIP-GmP-ViT-L-14入门指南:理解ImageNet/ObjectNet双基准评估意义 1. 什么是CLIP-GmP-ViT-L-14 CLIP-GmP-ViT-L-14是一个经过几何参数化(GmP)微调的CLIP模型,在计算机视觉领域具有出色的表现。这个模型最大的特点是它在ImageNe…...

Leather Dress Collection 实战:为开源项目自动生成 README 与贡献指南

Leather Dress Collection 实战:为开源项目自动生成 README 与贡献指南 你有没有过这样的经历?辛辛苦苦写好了一个开源项目,代码功能强大,架构清晰,但一想到要写 README、贡献指南、行为准则这些文档,头就…...

伏羲天气预报可信AI:预报结果置信度输出、不确定性传播与可视化

伏羲天气预报可信AI:预报结果置信度输出、不确定性传播与可视化 1. 引言:天气预报,我们到底能信多少? “明天会下雨吗?”这是我们每天都会问的问题。传统的天气预报会告诉你一个概率,比如“降水概率70%”…...

SDMatte算法原理浅析:从卷积神经网络看图像分割技术

SDMatte算法原理浅析:从卷积神经网络看图像分割技术 1. 效果展示:当AI学会"精准抠图" 先来看一组实际案例。左边是原始图片,右边是SDMatte算法的处理结果: 你会注意到,即便是复杂场景下的发丝、半透明物体…...

Swagger Client 完整教程:从零开始构建强大的 API 集成应用

Swagger Client 完整教程:从零开始构建强大的 API 集成应用 【免费下载链接】swagger-js Javascript library to connect to swagger-enabled APIs via browser or nodejs 项目地址: https://gitcode.com/gh_mirrors/sw/swagger-js Swagger Client 是一款功能…...

Pixel Language Portal惊艳案例:用Hunyuan-MT-7B将甲骨文识别结果实时译为多语种学术注解

Pixel Language Portal惊艳案例:用Hunyuan-MT-7B将甲骨文识别结果实时译为多语种学术注解 1. 项目概览:当古老文字遇见现代AI Pixel Language Portal(像素语言跨维传送门)是一款基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具。…...

Nano-Banana在.NET开发中的应用:智能业务逻辑实现

Nano-Banana在.NET开发中的应用:智能业务逻辑实现 将AI能力无缝集成到企业级应用中,让智能业务逻辑开发变得简单高效 1. 开篇:当.NET遇见AI智能业务逻辑 如果你正在开发.NET企业级应用,可能会遇到这样的场景:需要智能…...

Qwen3-ForcedAligner-0.6B模型量化实战:减小部署体积

Qwen3-ForcedAligner-0.6B模型量化实战:减小部署体积 语音处理中的强制对齐技术,能够精确匹配文本与语音的时间戳,是语音识别、字幕生成等应用的关键环节。Qwen3-ForcedAligner-0.6B作为一款基于大语言模型的强制对齐工具,支持11种…...

交互弹窗设计避坑指南:Toast、Dialog、Actionbar和Snackbar的常见错误与优化建议

交互弹窗设计避坑指南:Toast、Dialog、Actionbar和Snackbar的常见错误与优化建议 在移动应用和网页设计中,交互弹窗是用户界面中不可或缺的元素。它们像数字世界中的交通信号灯,引导用户完成各种操作流程。然而,设计不当的弹窗不仅…...

AI绘画作品集:Anything V5图像生成服务实际效果与案例分享

AI绘画作品集:Anything V5图像生成服务实际效果与案例分享 1. 引言:当AI绘画遇见Anything V5 想象一下,你有一个创意在脑海中盘旋——也许是一个穿着宇航服在咖啡馆里喝咖啡的熊猫,或者是一座漂浮在云端的蒸汽朋克城市。在过去&…...

Nomic-Embed-Text-V2-MoE向量模型部署教程:Python环境配置与快速上手

Nomic-Embed-Text-V2-MoE向量模型部署教程:Python环境配置与快速上手 你是不是也遇到过这样的问题:想用最新的向量模型来处理文本,但一看到复杂的部署步骤和满屏的依赖报错就头疼?特别是像Nomic-Embed-Text-V2-MoE这种混合专家模…...

Picocli错误处理终极指南:7个技巧构建健壮命令行应用

Picocli错误处理终极指南:7个技巧构建健壮命令行应用 【免费下载链接】picocli Picocli is a modern framework for building powerful, user-friendly, GraalVM-enabled command line apps with ease. It supports colors, autocompletion, subcommands, and more.…...

小白也能当对联大师!春联生成模型-中文-base开箱即用教程

小白也能当对联大师!春联生成模型-中文-base开箱即用教程 1. 前言:人人都能创作春联 春节贴春联是中国人延续千年的传统习俗,但创作一副对仗工整、寓意美好的春联并非易事。传统春联创作需要掌握平仄、对仗等复杂规则,这让许多对…...

Cucumber.js数据表格完全指南:如何优雅处理复杂测试数据

Cucumber.js数据表格完全指南:如何优雅处理复杂测试数据 【免费下载链接】cucumber-js Cucumber for JavaScript 项目地址: https://gitcode.com/gh_mirrors/cu/cucumber-js Cucumber.js是JavaScript生态中最流行的行为驱动开发(BDD)测…...

通义千问1.5-1.8B-Chat-GPTQ-Int4在网络安全领域的应用初探:威胁情报摘要

通义千问1.5-1.8B-Chat-GPTQ-Int4在网络安全领域的应用初探:威胁情报摘要 每天一上班,安全运营中心的分析师小李就要面对成百上千条新涌进来的安全告警、漏洞报告和威胁情报。这些文档动辄几十页,充斥着技术术语和复杂描述,光是快…...

Infect工具完整教程:快速掌握Android设备病毒传播技术

Infect工具完整教程:快速掌握Android设备病毒传播技术 【免费下载链接】infect Infect Any Android Device With Virus From Link In Termux 项目地址: https://gitcode.com/gh_mirrors/in/infect Infect是一款基于Bash的Android病毒传播工具,专为…...

Qwen3.5-2B辅助Python科学计算环境搭建:NumPy、Pandas与模型集成

Qwen3.5-2B辅助Python科学计算环境搭建:NumPy、Pandas与模型集成 1. 为什么需要Qwen3.5-2B与科学计算环境结合 在数据分析和机器学习工作中,我们经常面临一个痛点:数据处理和报告撰写是两个割裂的环节。传统的工作流是先使用NumPy、Pandas等…...

RexUniNLU开源模型实战:400MB模型在A10/A100/T4不同GPU上的适配

RexUniNLU开源模型实战:400MB模型在A10/A100/T4不同GPU上的适配 1. 引言 你是否遇到过这样的困扰:想要使用强大的自然语言理解模型,但动辄几十GB的大模型让部署变得困难重重?或者你的GPU显存有限,无法运行那些"…...

从“画个女孩”到“绝世圣女”:圣女司幼幽-造相Z-Turbo提示词进阶指南

从“画个女孩”到“绝世圣女”:圣女司幼幽-造相Z-Turbo提示词进阶指南 1. 理解圣女司幼幽-造相Z-Turbo模型特性 1.1 模型定位与核心优势 圣女司幼幽-造相Z-Turbo是基于Z-Image-Turbo的LoRA微调版本,专门针对"牧神记"中的圣女司幼幽角色进行…...