在当今数字化商业浪潮中,数据无疑是企业的核心资产,而流量数据更是电商巨头京东业务运转的关键驱动力。它广泛应用于搜索推荐、广告投放等多个核心业务场景,直接影响着用户体验和商业效益。但随着业务规模的不断膨胀,传统架构在处理流量数据时逐渐力不从心,升级架构迫在眉睫。本文将深入剖析京东流量资产架构从 Lambda 架构迈向湖仓一体架构的变革之旅,包括面临的挑战、创新的解决方案、显著的收益以及未来的发展方向。

今天的介绍会围绕下面四点展开:

1. 背景与痛点

2. 挑战与优化

3. 收益与表现

4. 总结与展望


01背景与痛点

京东早期采用 Lambda 架构,在处理流量数据时,构建了离线和实时两条独立的处理链路。在实时链路中,数据经埋点采集服务裁剪解析后,进入消息队列,再由 Flink 实时加工处理,供下游业务实时使用;离线链路则将全量数据存储到对象存储,后续通过 Hive 加工,为下游业务提供离线数据分析支持。

这种架构虽然能提供不同时效的数据服务,但弊端明显。计算资源方面,两条链路独立运转,导致计算资源双倍消耗,开发和维护成本也随之翻倍。存储和计算架构异构,使得实时流数据和离线表数据常常无法对齐,存在数据差距,下游用户在使用数据时,需要花费大量时间和精力排查解决数据不一致问题,使用体验较差。

此外,为优化离线链路时效,采用小时级加工替代 T+1 批处理,却引入了数据冗余存储和多次拷贝的问题,进一步增加了存储和计算成本。而且,流量数仓 GDM 层 T+1 数据时效在日常通常为凌晨两点,面对复杂的内部业务场景,下游计算处理时间紧张,数据的 SLA(数据可用性保证)难以保障,在大促或流量高峰期,问题更加突出,严重影响业务决策的及时性和准确性。

为解决 Lambda 架构的痛点,京东引入湖仓一体架构。湖仓架构具有诸多特性,如支持数据更新、存储分离,能处理结构化和非结构化等多种数据类型。在流量资产场景中,其端到端的分钟级能力、支持事务保障数据读写一致性、MVCC(多版本并发控制)提供轻量级时间旅行能力以及数据重新布局降低存储和查询成本等特性,发挥了关键作用。

图片

在新架构下,数据经埋点采集服务进入消息队列,由 Flink 实时加工后实时写入湖表。湖表数据既能满足下游业务分钟级时延的实时需求,也可供下游业务通过批读方式进行离线处理。新架构将两条链路收敛为一条,统一了数据口径,减少了存储成本。基于 Hudi 的事务能力,实现了数据处理的 EOS(Exactly-Once Semantics,精确一次语义),确保数据处理的准确性和完整性。Flink 与 Hudi 的技术组合,为下游业务提供了近实时的精准数据,有力地支持了业务的高效运营。

02挑战与优化

1. 多模 IO 能力优化:突破写入性能瓶颈

在 Flink 实时写入 Hudi 的过程中,某些 HDFS 集群在热点时段繁忙度高,导致 Flink 写入任务频繁出现 timeout 重试,甚至作业失败重启,严重限制了写入性能。单纯扩充 Flink 资源,对性能提升效果不佳。

京东自研多模 IO 能力,将湖表物理存储划分为缓冲层和持久层。创新性地设计统一的 IO 抽象层和 Hudi 逻辑表视图,底层存储可插拔集成多种介质,如 HDFS、OSS、Kafka、HBase、Redis 等。热数据先写入以高性能 HDFS 为基础的缓冲层,后续通过 Hudi 的 Clustering、Compaction 表服务将数据搬运到共享 HDFS 持久层。

开启数据缓冲层后,Flink 实时入湖任务的写入均值速率和稳定性显著提升。对比测试显示,写入吞吐提升 104%,checkpoint 平均完成时间减少 95%,作业异常失败次数大幅降低,稳定性提升 97%,有效解决了写入性能和任务稳定性问题。

图片

2. 湖表动态分区策略:应对数据倾斜难题

业务分区数据倾斜严重,最大分区与最小分区数据量相差达 730 万倍。若直接写入湖表,会产生大量小文件,给 HDFS 存储和后续处理带来巨大压力,同时单个 subtask 写多个分区文件,频繁切换文件柄也会消耗大量性能。

京东在 Flink 流写 Hudi 的核心拓扑链路上,新增自定义 Partitioner 策略。根据分区大小设计动态分区方案,数据量大的分区(如 S 分区)单独路由到特定的 subtask 集合,集合大小依据分区数据量确定;小分区则三两成组路由到其他单独的 subtask。优化后,一次 commit 写入文件数从约 10.8 万个减少到 6000 多个,减少了 94%,写入性能提升一倍多,有效缓解了数据倾斜和小文件问题。

图片

3. 多写并发 Append:突破流量增长瓶颈

随着流量数据量持续增长,尤其是大促期间数据量骤增,Flink 机房资源有限,单个 Flink 集群即使扩容也会出现性能瓶颈。

京东将入湖任务拆分,利用湖的多写能力并发 Append 同一张流量湖表。例如,将数据量大的 S、P 分区拆分成一个任务,非 S、P 分区拆分成另一个任务。在拆分过程中,解决了检查点元数据冲突和 Hive 元数据同步冲突等问题。通过在每个任务的检查点元数据目录维护各自元数据信息,确保任务失败时可回滚恢复;每个作业维护自己的 last_commit_time 标识,避免分区缺失问题,实现了轻量级并发 Append,提升了实时入湖任务的写入性能。

图片

4. 反序列化优化:降低行级反序列化成本

新架构采用 JSON 数据格式,且比旧架构多了 120 多个字段,行级反序列化成本高,成为任务性能瓶颈。

京东采取两项优化措施。一是将反序列化操作从 source 算子中抽离,source 算子仅负责从 Kafka 拉取字节级消息数据,通过注册专门的反序列化 lookup table 执行反序列化操作,并扩展该算子并行度提升读取性能。二是在拆分任务时,将消息业务域字段写入 Kafka 消息 header 中,拆分后的任务只需解析 header 过滤数据,避免反序列化整条消息,有效降低了反序列化开销。

图片

5. 流转批处理:精准调度离线任务

在处理实时湖表时,需要一种机制感知湖表业务时间水位线,判断 T-1 数据是否准备就绪,以启动下游离线加工任务。

京东通过流量湖表的流转批机制实现这一目标。改造 Flink Hudi writer,使其将业务时间写入元数据,流转批服务定期扫描湖表元数据中的业务水位线。当所有分区水位线最小值超过 T 日零点,且对应的 Clustering 表服务合并完成时,表明 T-1 数据准备就绪,下游离线任务即可调度运行,确保了离线任务调度的准确性和及时性。

图片

03显著成效:湖仓架构升级的收益

1. 数据时效性飞跃

湖仓一体架构升级后,数据时效性从 T+1 提升到 15 分钟,SLA 从凌晨两点半提前到零点半。数据量越大,SLA 提升越明显,为下游业务提供了更充裕的处理时间,极大地提高了业务响应速度和决策效率。

2. 存储成本降低

基于社区 Clustering 能力,实现分区级 30 分钟数据全局排序与合并,提升了数据压缩率,存储数据量从每天 120TB 优化到 50TB,存储成本降低 58.3%。在流量数据增长 60% 的情况下,每年节省两千多万元,有效节约了企业运营成本。

3. 大促表现卓越

在去年双 11 大促期间,面对流量洪峰,最大流量曝光模型总量同比增长 80%,均值达每分钟 4.5 亿。新架构首次实现流量数据全时间段平稳运行且无延迟,SLA 更加稳定,T+1 GDM 层流量数据全部就绪时间从 6 点 03 分提前到 0 点 54 分,提前了 5 个小时,有力保障了大促期间业务的稳定高效运行。

04 未来展望:持续创新的方向

1. 探索生产环境大规模流读

目前,流量数据资产下游业务主要以批读方式为主,流读在生产环境中尚未大规模验证。未来,京东将重点关注流读数据的稳定性、处理性能和数据完整性。当前已在流读方面进行了部分完善,如支持更细粒度的限速、灵活的数据分发策略、多写场景下的流读功能,并丰富了 metric 指标用于监控,后续将进一步探索和优化,推动流读在生产环境中的大规模应用。

2. 追求 Hudi 秒级实时处理

数据入湖时,写入速度较慢,通常为分钟级提交。京东计划扩展湖表多模 IO 能力,将数据写入 Kafka、HBase、Redis 等高速存储中,并在湖表元数据记录高速存储的位点和 key 等元信息。读取时,将持久存储与高速存储内容联合,实现 Hudi 的秒级时延,进一步提升数据处理的实时性。

京东流量资产湖仓一体架构的升级实践,成功解决了传统架构的诸多问题,取得了显著的成效。未来,京东将继续在流读和实时处理等方面深入探索创新,不断挖掘流量数据的价值,为业务发展注入强大动力,也为行业数据架构的发展提供了宝贵的借鉴经验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92377.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92377.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92377.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​​​​​​​【Datawhale AI夏令营】多模态RAG财报问答挑战赛:学习笔记与上分思考

一、 初识赛题——从迷茫到清晰刚看到赛题时,坦白说有些不知所措。“多模态”、“RAG”、“图文混排PDF”,这些词汇组合在一起,听起来就像一个庞大而复杂的工程。但当我强迫自己静下心来,从“终点”(提交格式和评审规则…

数据挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 线性判别式Loss Function 损失函数misclassification 误分类0-1 Loss/Error function 0-1损失函数Hinge Loss Function 铰链损失函数Optimization 优化算法Linear Discriminants 线性判别式 线性判别式公式 f(x;w)w1x(1)w…

使用qemu运行与GDB调试内核

目录 一、前期准备 二、内核编译 三、QEMU与GDB 1、QEMU调试参数 2、gdb vmlinux 一、前期准备 内核镜像:bzimage gdb:x86_64 QEMU:qemu-system-x86_64 前置知识: (1)内核编译 (2&#x…

欧盟 Radio Equipment Directive (RED)

欧盟 Radio Equipment Directive (RED) ——从 2014/53/EU 原文到 2025-08-01 强制生效的网络安全新规,一次看懂全部关键点。1. 法规身份与适用范围要素内容指令全称Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)适用产品所有“有意发射/接…

【FastExcel】解决ReadSheet在Map中获取对象不准确问题(已提交PR并合并到开源社区)

解决问题&#xff1a;源码ReadSheet在同一个Map中获取对象不准确问题 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;问题场景 ReadSheet在同一个Map中获取对象不准确(如Map<…

【网络安全入门基础教程】TCP/IP协议深入解析(非常详细)零基础入门到精通,收藏这一篇就够了

前言 这是小编给粉丝盆友们整理的网络安全入门到精通系列第三章计算机网络中TCP/IP协议的解析&#xff0c;喜欢的朋友们&#xff0c;记得给大白点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&…

Latex中公式部分输入正体的字母\mathrm{c}

Latex中公式部分输入正体的字母\mathrm{c}“\mathrm{c}”如何在Word中输入\mathrm{c}“\mathrm{c}” 在 LaTeX 中&#xff0c;“\mathrm{c}” 用于在数学模式中排版“c”这个字母为罗马体&#xff08;正体&#xff09;。“\mathrm” 是罗马字体命令&#xff0c;它告诉LaTeX以罗…

Document Picture-in-Picture API拥抱全新浮窗体验[参考:window.open]

在前端开发中&#xff0c;我们经常会遇到这样的需求&#xff1a;弹出一个浮动窗口来显示一些实时信息、工具栏或视频内容。过去我们会用 window.open()&#xff0c;后来越来越多的开发者倾向于使用 Modal。但现在&#xff0c;一个更现代的 API 出现了——Document Picture-in-P…

【指南版】网络与信息安全岗位系列(三):安全运维工程师

一、安全运维工程师到底做什么&#xff1f;—— 用校园场景帮你理解简单说&#xff0c;安全运维工程师就像 “网络世界的安保队长 系统管家”&#xff1a;既要实时监控网络和系统的 “异常动静”&#xff08;类似学校保安巡逻查隐患&#xff09;&#xff0c;又要负责日常的安全…

matlab——simulink学习(5向NXP库中添加新模块)

向NXP库中添加新的函数模块一、环境二、库添加模块1.打开文件夹2.创建文件3.添加S-Function三、浏览器添加模块一、环境 Windows10、MATLAB R2022b、安装NXP的S32K1XX系列工具包 二、库添加模块 1.打开文件夹 在文件系统中找到安装工具包的位置&#xff0c;用文件资源管理器…

使用ProxySql实现MySQL的读写分离

ProxySQL简介1、ProxySQL是一款开源的使用C编写的MySQL集群代理中间件&#xff1b;2、用于在MySQL数据库和客户端之间进行负载均衡、查询缓存、故障转移和查询分发&#xff1b;3、它可以作为中间层插入到应用程序和数据库之间&#xff1b;4、特点是高效灵活&#xff0c;使用简单…

WiFi 核心概念与实战用例全解

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 1. WiFi基础与协议 WiFi&#xff08;Wireless Fidelity&#xff09;是基于IEEE 802.11协议族的无线局域网&#xff08;WLAN…

面向远程智能终端的超低延迟RTSP|RTMP视频SDK架构与实践指南

引言&#xff1a;遥操作时代&#xff0c;视觉链路已成“主控神经元” 从工业巡检到应急救援&#xff0c;从城市安防到边境监控&#xff0c;远程操控正成为智能终端与人机协同的重要落点。而在这些场景中&#xff0c;“视觉”不再只是用来观看的工具&#xff0c;而是贯穿感知、…

C++中的继承:从基础到复杂

目录 前言 1. 继承的基本概念 2. 继承方式与访问控制 3. 派生类与基类的对象转换 4. 继承中的作用域 5. 派生类的默认成员函数 6. 继承中的特殊关系 6.1 继承与友元 6.2 继承与静态成员 7. 复杂的菱形继承问题 8. 继承与组合的选择 9. 常见面试题 总结 前言 继承…

Eyevinn 彻底改变开源部署模式

该咨询公司借助Akamai云平台&#xff0c;为其创新的开源平台和可持续收益分成模式提供强大支持。 "时间就是金钱&#xff0c;我们通过Akamai云平台快速将开源云平台投入生产。" ——Eyevinn Technology研发副总裁 Jonas Birm实现可持续视频流媒体服务 自2013年以来&…

17day-人工智能-机器学习-分类算法-KNN

1. 什么是knn算法knn算法全名叫做k-近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;&#xff0c;看到名字是不是能想到是算距离的&#xff0c;第一个k是指超参数的意思&#xff0c;就是可以认为设置的意思&#xff0c;这里是指最近的k个样本。2. 为什…

12-netty基础-手写rpc-编解码-04

netty系列文章&#xff1a; 01-netty基础-socket02-netty基础-java四种IO模型03-netty基础-多路复用select、poll、epoll04-netty基础-Reactor三种模型05-netty基础-ByteBuf数据结构06-netty基础-编码解码07-netty基础-自定义编解码器08-netty基础-自定义序列化和反序列化09-n…

解决 Windows 下的“幽灵文件”——记一次与带空格的 .gitignore 文件的艰难斗争

引言 你是否遇到过这样的情况&#xff1a;一个文件明明躺在你的文件夹里&#xff0c;ls 或 dir 命令都能清楚地看到它&#xff0c;但无论你用什么方法尝试删除&#xff0c;系统都冷酷地告诉你“找不到文件”&#xff1f; 就在今天&#xff0c;我就遇到了这样一个“幽灵”般的 .…

(易视宝)易视TV is-E4-G-全志A20芯片-安卓4-烧写卡刷工具及教程

&#xff08;易视宝&#xff09;易视TV is-E4-G-全志A20芯片-安卓4-烧写卡刷工具及教程PhoenixCard_V309烧录步骤&#xff1a;1、将TF或SD卡插入计算机&#xff0c;打开软件&#xff1b;2、选择固件所在目录&#xff1b;3、烧写模式选“卡量产”4、点击“烧录”开始量产&#x…