京东大数据治理探索与实践 | 京东零售技术实践

news2024/12/22 23:09:50

01背景和方案

在当今的数据驱动时代,数据作为关键生产要素之一,其在商业活动中的战略价值愈加凸显,京东也不例外。

图片

作为国内领先的电商平台,京东在数据基础设施上的投入极为巨大,涵盖数万台服务器、数 EB 级存储、数百万个数据模型及数以百万计的任务执行。每年成本上的投入高达两位数个小目标,而且还在持续增长,成本压力比较大。

面对这样的成本压力,治理是一个必然的选择,并且不能是运动式、救火式的,而应该是持续的,需要一个规模化、常态化的治理体系。为了实现这一目标,就要应对治理中的诸多挑战。首先,场景复杂,平台建设是个长期过程,管控规则在不断迭代,历史原因导致平台有部分作业的访问方式跳过数据表直接访问底层 HDFS 文件,或者绕过平台的推数工具,直接在 MapReduce 或 Spark 里面写入数据,导致审计和血缘追踪困难,给治理带来了很大风险。此外,平台用户较多,成本意识很难拉齐,且大家工作繁忙,主动治理的意愿较低。而且人工治理不仅成本高,风险也高,如果人工判断不准,就会造成生产事故。

图片

为了解决这些问题,我们首先设计了健康分和货币化账单,用来量化治理的收益,帮助用户直观感受治理的变化。再就是打造自动化治理平台,自动发现问题,及时通知用户,一键执行,并通过量化指标来判断收益,提高治理人效。

具体治理从以下几个角度一起考虑:

  • 多种数据源相互印证。联合 HDFS 和 Hive 的审计日志、HDFS 的元数据以及数据血缘等数据一起校验,避免因单一数据源引发的误判。

  • 设置多环节校验。判断会综合连续多日的诊断结果,避免特殊异常波动导致误诊。

  • 作业提交会进行实时校验。当前数据作业是通过 t+1 离线模型进行计算,存在时间差,为避免时间差导致误诊,在执行时针对选择的治理做二次校验。

  • 操作可逆。对于治理数据做自动备份,即使有误操作,也可以一键回滚。

  • 数据治理落地的机制保障。增加数据管理专员小组、组织机构治理负责人等角色,并明确各自职责。

  • 明确目标。每年采购前,会达成年度治理目标的共识及预计的治理量。将目标拆解到每个事业部、每个部门,以及每个季度、每个月的指标,并通过周期性例行会议不断跟进和校准。

  • 完善奖惩机制,做得好会有激励,做得不好,会在其他产品上限制其使用。

当前整个治理系统已经涵盖了成本、稳定性、安全、质量等四个方向一共几十个治理项。例如成本治理中表的生命周期,不仅仅按照人工设定时间定期删除数据,还可以根据数据实际被访问的周期推荐更合理的生命周期数值。在稳定性中的“依赖缺失”治理,防止任务执行时,上游数据还未产出,导致任务失败。在安全方面,平台能及时发现对安全等级打标不准,质量方向的元数据缺失,元数据标注不准以及数据质量异常等治理项,及时发现,及时处理。

02关键技术

接下来介绍一下治理平台使用的关键技术。

图片

1. 审计日志

审计日志记录了用户在何时何地因何原因访问了哪些数据及访问方式,这是安全治理的基础。

以无效任务为例(有产出,但是产出的数据没有下游访问),自身作业还在运行,一定有日志产生,那如何来判断有没有下游呢,就需要排除掉自身任务的访问,审计当中就必须要有“任务 ID”这个属性。另外,治理需要明确的责任人,单单靠大家主动去维护表的负责人,一定会存在错漏的问题,所以审计一定要能识别到具体哪个人在操作,再加上数据的反算策略,来补充和校准负责人信息,确保数据一定有人负责。

原生的大数据系统,并没有这么丰富的信息,所以需要定制化改造:

  • 改造 API 协议。通过对底层 HDFS,以及上层计算引擎的适配性改造,附加了任务来源以及任务 ID 等上下文信息。

  • 内容反算。原始 metastore 日志记录存储的是原子 API 的使用记录(如 get_table ,get_partition),但具体操作(读、写、改表)没办法区分。平台通过对命令的访问序列,总结规律,生成自动识别规则进行反算。

  • 数据联合使用。Hive 审计日志只记录表级,具体访问的分区是看不到的。而结合 HDFS 审计来反推分区访问的活跃程度,从而推荐合理的生命周期,避免生命周期设置的偏大或偏小。

2. 全链路血缘

图片

首先介绍一下图中的一些术语,JDQ:是京东基于 kafka 进行二开的消息队列;JRC:京东实时数据加工平台,主要是用的 FLink 技术;DTS:数据集成工具;Plumber in、out:数据的导入导出。

上图展示的是正常的数据流转过程。从生产到数仓,再到数据应用或服务的全过程来看,已经不单单在大数据平台,要进行数据治理,如果不能掌握上下游关系,很容易出现问题。比如数仓将数据推到了应用系统,后续访问都在大数据平台外,如果把表的加工任务当成无效任务禁用后,就会影响业务正常运行。

除治理外,还可以利用血缘对全链路进行影响分析,链路优化等(比如一个表在任务加工链路上属于第 10 层,而他所依赖的所有数据都在第 3 层,那中间的几层依赖即为无效的,直接依赖第 3 层的加工任务来缩短链路,就可以更快完成数据加工)。

在不同阶段会用到不同的技术,比如生产侧主要用到的是调用链,在大数据侧主要使用审计和执行计划的解析,在数据应用与服务侧主要是运用审计的能力。将各阶段的数据进行整合,就可以得到全链路的血缘。

血缘的粒度如果只到表一级,还是存在一些局限性,在分析的时候,影响容易被放大。比如下游的表仅仅使用上游表做关联查询条件,他的结果当中就不会保存上游表的数据内容,在前面提到的影响分析场景,就应该排除掉。要做到这一点,就需要实现算子级血缘。

图片

算子级血缘描述的是字段间存在的具体关系,比如是直接引用的原字段,还是做了加减乘除等转换,是结果存储还是仅作为关联条件,为精细化数据治理提供支撑。比如相似表计算和重复存储识别就需要算子级血缘来帮助判断。我们的算子血缘实现的方案集成在了逻辑执行计划优化的阶段,和优化之后的 Hive Hook 的方式相比,可以拿到更原汁原味的血缘关系,对用户来说更容易理解。下面就是利用血缘关系,进行主动元数据治理的一个案例。

图片

用户开发时,经常要去找依赖的数据在哪里,有的是直接找表,而更多的时候是找字段,比如我想要知道订单优惠后的金额在哪,他的加工口径是什么,这样单纯的按表来检索就非常低效。所以我们设计了标准字段的概念,他是字段的抽象,在标准字段上可以维护更多的元数据信息,比如加工口径,使用说明等。当标准字段和表的实体字段关联上之后,就可以通过它来寻找字段和表。

但是如果需要大家一个个的维护关联关系,也是个巨大的成本,在这里就可以通过算子血缘来进行提效,用户仅需要将字段的源头做好关联,那么根据算子血缘关系,就可以直接算出有哪些直接引用的下游。

当然,我们这个标准字段也不仅仅是用于找数的提效,在字段元数据上维护好枚举值、取值范围、格式规范等信息,我们在后台会自动检测真实数据是否和定义匹配,异常及时触达用户,让用户做治理。这个检测不需要提前配置,完全是系统自动行为。

03从“节流”到“开源”

前面介绍的内容更多是如何推动业务主动治理,其目的主要是“节流”,减少不必要的占用。另一方面,我们也在寻求“开源”的手段,在不增加成本的情况下,使资源得到更充分的利用。这里主要列举三种手段:资源混部、任务错峰,以及跨机房的任务编排。

图片

京东有两大消耗大户,分别是大数据和在线服务,基数大,而且资源缺口也大。拿在线服务来说,在双十一、618 等促销节点,资源非常紧缺。而离线是常年高负荷运行,利用率都达百分之七八十。当在线服务在大促峰值过后,需求就会降得很低,就可以借给离线使用。离线虽然常年是高负载的情况,但每天晚上八点后相对比较空,在大促时就可以进行在线的支援。因此资源混部的价值是很大的。

资源池化,可以根据业务特点和等级进行资源分配,进行统一调度。此外也可以进行按需分配,当大促时,离线只需要借用几个小时不会对整体造成影响,离线可借用的空间就会很大。

资源池化落地有几个关键点。

  • 存算分离是基础,计算需要做到无状态才行。

  • 容器化技术,尤其是离线计算服务的容器化。

  • 资源隔离,包括各种层面的隔离(比如 CPU 网络)。

前面讲的是空间的挪移,而任务错峰则是时间上的挪移。平台上跑的上百万的作业,涉及很多开发人员,靠人工设定的运行规则,不是很合理。从数据表现来看,在凌晨 3-5 点集中了 30% 的任务,导致资源抢占和高峰拥堵。还有就是父任务的结束时间和当前任务的开始时间存在大量的 gap,如果父任务结束之后的空档期,资源负载较低的话,可以把任务做提前的编排,不光可以提高资源的利用率,也可以提升运行的时效。对整个过程中每个队列的资源使用情况,以及任务的运行时长进行预测,并根据这个预测结果结合任务的重要度来去动态调整任务的可执行时间,即可实现削峰填谷。

第三个手段就是跨机房的任务搬迁。对于大公司来说,单个机房很难完全满足需求,因为很少有机房能放数十万台服务器。另外也很难做到高可用,从安全角度来讲,一般是要做到两地三中心的架构,不同机房间的系统负载就很难相同,一定有的机房相对繁忙,另外一边相对空闲。如果能对任务进行动态调整,把任务尽量分在空闲的一边,就一定能跑得更快。这里比前面两个手段要多出一项对存储的考量,因为计算和存储是跨机房的访问,势必就会带来两机房之间专线的额外占用。如果调度不当,就会导致专线堵塞。而且跨机房的存储调拨,也会带来一些更高的存储需求。这个过程需要平衡存储和计算的成本。

以上三个方面如果能够做到极致,利用率就会接近一条直线,仅在均线上下小幅波动,采购就会大幅减少,甚至零采购,从而降低成本。

04未来展望

图片

未来的治理将在以下几个方向继续推进:

  • 实时发现和治理。当前的数据治理主要是依托于离线模型测算,后面会做更实时的诊断与治理,尽量是在业务上线之前就做到拦截,减少事后治理的场景。

  • 智能化。系统从规则化向智能化演变,让问题的识别变得更精准、更智能。

  • 自动化。现在治理需要人工参与一小部分,未来的目标是落地托管模式,实现无人化的治理。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

android:sharedUserId 应用进程声明介绍

背景 adb install 安装系统软件报错,原因是签名不一致,进程改变。 代码分析 AndroidManifest.xml 定义的 android:sharedUserId 应用归属进程不同,从phone切换到system。 初始配置 <manifest xmlns:android="http://schemas.android.com/apk/res/android"c…

Liveweb视频融合共享平台在果园农场等项目中的视频监控系统搭建方案

一、背景介绍 在我国的大江南北遍布着各种各样的果园&#xff0c;针对这些地处偏僻的果园及农场等环境&#xff0c;较为传统的安全防范方式是建立围墙&#xff0c;但是仅靠围墙仍然无法阻挡不法分子的有意入侵和破坏&#xff0c;因此为了及时发现和处理一些难以察觉的问题&…

交换机链路聚合(手动负载分担模式)(eNSP)

目录 交换机SW_C配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 交换机SW_D配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 验证: 链路聚合的端口清除: 交换机端口聚合的存在意义主要有以下几点: 增加带宽 提高冗余性和可靠性 实现负载均衡 降低成本 …

玩转树莓派Pico(19): 迷你气象站5——软件整合

一、前言 各个模块都已经测试了&#xff0c;硬件也组装完成&#xff0c;到了软件整合的步骤了。 目前我仅按照自己的经验来整合&#xff0c;肯定要踩坑的。以后除了多去开源网站看看大佬的代码&#xff0c;还要继续揣摩《无线电》杂志里的文章。很多文章对我来说比较高深&#…

30. 多进程编程

一、什么是进程 进程&#xff08;process&#xff09;则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行&#xff0c;并为这些进程合理分配时间。进程也可以通过派生新的进程来执行其它任务&a…

Unity Post请求发送fromdata数据content-type

wwwfrom 的 headers["Content-Type"]修改 错误代码&#xff1a; WWWForm form new WWWForm(); if (form.headers.ContainsKey("Content-Type")) {string boundary string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));form…

aosp15 - Activity生命周期切换

本文探查的是&#xff0c;从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点&#xff0c;为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

SAP PP ECN CSAP_MAT_BOM_MAINTAIN

刚开始的时候ECN总是加不上&#xff0c; 参考kimi给出的案例 点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/cth1ipmqvl7f04qkggdg 效果 加上了 FUNCTION ZPBOM_PLM2SAP. *"------------------------------------------------------------------…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

定义 开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;是一种目标检测任务&#xff0c;旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别&#xff0c;而OVOD模型则具有识别“开放词汇…

JaxaFx学习(三)

目录&#xff1a; &#xff08;1&#xff09;JavaFx MVVM架构实现 &#xff08;2&#xff09;javaFX知识点 &#xff08;3&#xff09;JavaFx的MVC架构 &#xff08;4&#xff09;JavaFx事件处理机制 &#xff08;5&#xff09;多窗体编程 &#xff08;6&#xff09;数据…

【C++】小乐乐求和问题的高效求解与算法对比分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述与数学模型1.1 题目概述1.2 输入输出要求1.3 数学建模 &#x1f4af;方法一&#xff1a;朴素循环求和法2.1 实现原理2.2 分析与问题2.3 改进方案2.4 性能瓶颈与结论…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会&#xff0c;法律服务的需求日益增长&#xff0c;但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题&#xff0c;通过线上平台&#xff0c;用户可以轻松搜索、比较和选择合适的律师&#x…

【Spring】方法注解@Bean,配置类扫描路径

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入 一&#xff1a;Bean方法注解 1&#xff1a;方法注解要搭配类注解使用 2&#xff1a;执行结果 …

深度学习0-前置知识

一、背景 AI最大&#xff0c;它的目的是通过让机器模仿人类进而超越人类&#xff1b; ML次之&#xff0c;它是AI的一个分支&#xff0c;是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器&#xff0c;让机器自行学会如何执行任务&#xff0c;它的成功取决于…

前端面试题整理-前端异步编程

1. 进程、线程、协程的区别 在并发编程领域&#xff0c;进程、线程和协程是三个核心概念&#xff0c;它们在资源管理、调度和执行上有着本质的不同。 首先&#xff0c;进程是操作系统进行资源分配和调度的独立单位&#xff08;资源分配基本单位&#xff09;&#xff0c;每个进…

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

群晖利用acme.sh自动申请证书并且自动重载证书的问题解决

前言 21年的时候写了一个在群晖&#xff08;黑群晖&#xff09;下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本&#xff0c;自动申请虽然解决了&#xff0c;但是自动重载一直是一个问题&#xff0c;本人也懒&#xff0c;一想到去…

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…

delve调试环境搭建—golang

原文地址&#xff1a;delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境&#xff0c;习惯在 linux终端vim 环境下开发&#xff0c;所以找了golang的调试工具&#xff0c;delve类似gdb的调试界…