广发证券基于 Apache Kyuubi 构建“提效可控”大数据赋能层
广发证券于 2023 年 11 月成为通过 DCMM 数据管理成熟度能力成熟度评估获得管理量化级(四级)的首批券商之一,目前上万个 Kyuubi 作业已成为广发数据综合治理和关键数据体系的核心部分。
本文作者为广发证券大数据平台架构师梁博文,参与了 Apache Kyuubi 项目孵化并成为 PMC 成员。本文主要介绍和讨论了广发证券大数据平台围绕数智中台战略和敏态数据时代挑战为切入,重点围绕“提效可控”四大关键转型目标,基于 Apache Kyuubi 构建大数据赋能层及一体化权控思路的架构分析、落地策略、全链路效益提升。同时作为 Apache Kyuubi 的使用者和贡献参与者,在业界与社区共建未来探索进行展望与预期。
本文主要覆盖以下内容:
1. 大数据赋能层与 Apache Kyuubi 的目标分析与架构效益
2. Apache Kyuubi 大数据赋能层的落地策略与场景构建
3. 一体化数据权限管控总体思路
4. Kyuubi Authz 插件 Spark 权控能力介绍及对接 Ranger 新特性
01 大数据赋能层与 Kyuubi 的目标、架构
对广发证券大数据平台而言,我们希望在理解自身使命和对架构的预期基础上,跟踪大数据生态技术,进而确定数据赋能转型方向并确定大数据赋能层的目标、收益与决断点。
广发证券,自 2014 年起开始持续构建大数据平台体系,是较早一批实践和演进一体化大数据平台的大型券商。作为“数字化中台”中重要组成部分,广发证券建设一体化公司级数据中台必须统一在架构上面对强监管、强权控、重稳定与灵活数据形态与场景数据需求之间做出积极的响应与对齐。在平台架构上,我们秉持“积极评估、审慎落地、持续演进”的思路方法,综合以自研、集成、引入多种手段,以自身数据战略为目标,建设一体化数据服务体系。就具体而言,我们希望在统一核心底座的前提下,对关键引擎、关键服务、关键链路的选型、适配上从架构级到源码级保持主动权和集成能力,同时在以自身为主的前提下对大数据开源生态保持敏锐,以保证持续强化对数据形态场景的支撑。这是一项具有持续挑战的使命。
在积极摄入业界技术进展和的同时,我们也积极依托自身诉求,参与到大数据生态的贡献共建中。其中,我们有 Apache Kyuubi 项目 PMC 成员 1 人,代码贡献量位列前 4 位。并在顶级大数据项目上参与,包括数据引擎 Apache Spark、数据湖存储 Iceberg、OLAP 数仓等。同时,我们对 Spark 大数据生态,尤其是其次在 Spark 权限控制带来兼容 Iceberg 等多种数据湖的核心贡献,并参与完成了 Spark 3.1 至 3.5 以及 Scala2.13 的适配。
此图仅供概要说明,不作为具体大数据平台架构示意
在考虑以数据赋能转型前的方向,先来回顾一下当前整体大数据平台的现状与潜在瓶颈。
统一的大数据平台底座核心首先包括了 Hadoop 底座以及 Hive Metastore 服务,其中 Hadoop 提供的 HDFS/YARN 持续提供可靠的分布式计算存储能力,是整体对接大数据生态的基础。而 Hive Metastore 则是作为统一的大数据数仓标准,为对接各项引擎提供数仓信息,是所有数据场景的基础。我们在各时期此基础上引入了三种引擎,分别是 Hive MR、Trino、Spark 各自承担不同的作用,首先 HiveMR 是提供最终的查询、加工的分布式执行方案,也统一使用 HiveSQL 作为逻辑界面。其次是为了解决查询场景对速度的诉求,引入了 Trino/PrestoSQL 作为 Adhoc 和 BI 的 OLAP 查询引擎,因其可能存在单点的架构局限和曾遇到 0day 计算错误而仅用作查询,且 Trino 独立的语法会成为独立于 HiveSQL 的资产包袱。同时在部分场景引入了 Spark 引擎作为兼容 HiveSQL 的 ETL 计算引擎,但 SparkSQL 迟迟没有合适的方案而无法成规模作为类似 HiveServer 的方式进行规模化使用。
这里带来了几个对数据赋能造成的瓶颈:
1. 查询与加工的引擎界面不一致。由于 Trino 在数据探索时候性能提升巨大,数据开发往往先用 Trino 进行数据探索,而 Trino 语法与 HiveSQL 语法不兼容,导致需要改写并验证一次再次组装成数据加工逻辑。往返周折费时费力。
2. 依赖组件细节接入方而言过于繁复。数据研发上在对接大数据平台时,开发一个大数据作业需要考虑多种因素,从技术栈版本到配置通路细节,包括数仓元数据服务 HMS、引擎(Spark 等)、存储格式、表格式等。造成开发、调试、运行的一系列成本而人效大幅降低,无法专注于完成业务数据逻辑。
3. 大数据平台无法整体演进服务组件版本。当作业具体决定了组件的搭配与细节,意味着大数据平台更多是作为资源底层提供服务,而无法按最新的评估和业务需求,统一遮蔽和演进引擎版本、引入新的协调服务、管控底层资源等。
4. 权限在特定渠道控制,无法作为通用服务开放赋能,只能在局限于特定的应用层服务。金融行业强监管需求导致必须在特定平台的特定场景下,来满足列表权限检查、涉密内容过滤 SQL 改写、集中化审计等要求。应用层如数据门户等的改写可以满足上述需要,但显著约束了大数据平台在通用场景下的对接可能性。
在架构上,我们需要一个统一大数据赋能层来解决上述问题,同时满足金融方向的一贯要求。
大数据赋能层的目标定位,除了回顾现状和历史演进包袱,我们还需从一个更远的视角来理解整体挑战,才能保障我们的演进方向和方式。
从宏观挑战上说,一体化数据中台带来数据生命周期在各个阶段带来的全方位挑战,必须在大数据赋能层统一满足:
1. In 数据摄入:具备从多源异构数据摄入到数据湖的能力,包括流式、批式、结构化、非常结构化等多种形态数据来源,需要具备多 catalog 能力。
2. Out 数据输出:推送有效的数据资产到场景直接形成具体数据支撑能力,适应不同的 schema 统一而后转化。
3. With 协同计算:已逻辑数据湖的方式,将不同 catalog 和异构数据源参与到现场的计算,已计算通达部分取代传统采数,同样是异构数据源的读写能力,同时要求统一的逻辑视图。
4. Over 复杂关联:满足即席查询和数据探索,具备多层次的复杂关联计算能力,同时在面对海量数据充分发挥 CBO、RBO 尽量提升查询响应效能,具备结果直出到 BI、AdHoc 等场景。
5. Of 数据治理:数据综合治理对元数据和血缘关系提出了全新的要求,需要数据中台和大数据平台对数据生命周期尤其是数据加工,能够主动感知数据变动的流向和细粒度关系,同时进一步沉淀数据治理的结果运用在全生命周期之中。
6. By 体系化加工:分层建模、调度依赖、高性能 ETL 能力、分布式算力与存储的挑战等。
从微观挑战上说,数据的加工方式和输出形态也发生了很大的变化,统一底座需要满足这些指标化/标签化、混合形态、弹性场景带来的新要求:
1. 指标化/标签化:数据输出方式从单一传统宽表进行指标输出,更多以逻辑形态结合复杂关联在运行时动态组合进行输出。这要求我们必须在行过滤上具备能力,进行数据管控与执行计划优化。同时满足多层次窄表与复杂宽表形态支持。同时指标化标签化的数据加工也会要求对同一资源领域进行多点分散并行加工的并发能力。
2. 混合形态:以一体化解决方案,解决多种存储架构,包括逻辑数据湖和异构存储带来的挑战,具备多 Catalog 协同计算能力,同时满足仓表、流表、维表等各种逻辑和存储形态的参与计算的资源实体。
3. 弹性场景:以弹性资源策略面对弹性场景,既能满足 AdHoc 爆发式的复杂查询,也能进行大规模读写加工场景。执行时必须有动态调度所用资源,并协同底座扩展和回收运行时资源。具体到执行计划必须充分优化,持续发挥业界 CBO、RBO 能力发挥现场所有信息进行调整。
因此综合来看,无论从宏观还是微观,以传统大数据 4V 特性即规模性(Volume)、多样性(Varity)、高速性(Velocity)和价值性(Value)来面对当前的挑战已经不再完全适合。
“敏态数据” Agile Data 是广发证券大数据平台对全新数据时代的理解和抽象。敏态数据要求以数据赋能的方式构建数据中台,以更积极的数据活性和更有效的数据成熟度,将数据自身浅出深入场景中,更广泛地被运用和支撑大小形态的数据场景中,同时内部以多种混合数据形态来响应在计算和存储上的挑战。敏态数据 AgileData 的四大特征可归纳为“HEAD”,即混合形态 Hybrid、数据成熟度 Enabling、数据活性 Active、弹性算力 Dynamic。
1. 混合的数据形态 Hybrid:向上提供统一的接入形态,向下综合运用多种数据形态,包括湖仓一体、流批一体、异构多 Catalog 等手段,将数据已开放式的形态统一进行处理,不追求单一引擎上的特性,而作为通用要求来对数据和引擎进行综合考察和纳管。
2. 有效的数据成熟度 Enabling:以成熟有效的数据驱动数据场景,经过良好的数据治理和数据管控,并达到可靠的数据质量满足数据规范。数据平台本身要使能这些过程所需的要素,更重要的是通过持续迭代数据成熟度,数据平台与数据业务相互成就价值。
3. 就绪的数据活性 Active:数据产品、指标化、标签化,逻辑/物理灵活形态输入输出,即时、就绪、有效。
4. 弹性的数据算力 Dynamic:细粒度动态伸缩的算力平台,全域集成的适应性数据引擎,大规模算力与多租户。
结合以上分析和基于数据中台战略为背景,整体数据平台可向敏态数据平台转型,以主动赋能的形态将大数据平台的数据能力对外输出。
以往,大数据平台自身就是数据赋能的瓶颈,上下游对接方都会成为赋能上有更多无法响应的诉求。数据开发在面对各种数据场景缺少对平台能力进行体系化分析手段,只能更多给大数据平台提出更垂直化数据链路诉求,再用最小路径以散乱的技术方式组合满足。而运维管理作为运行时的资源管控和系统管理,对大数据平台提出了资源、权限、可用性、稳定性等各个诉求,大数据平台在切入数据生命周期之中疲于奔命,只能以更低的保障手段满足,同时舍弃演进的可能和路径。
转型后,大数据赋能层自身通过低成本的统一接入手段、统一的高性能弹性算力引擎、统一的数仓管理和统一的资源权控等管控措施,同时还在底层具备与数据治理和数据管控双向对齐元数据、规则、标准等的内在成熟度提升手段。此时,数据开发可以灵活以标准化的能力按需投入到各个数据应用场景,从要求海量计算能力的数据加工场景到复杂逻辑关联且时效要求高的数据展示和指标输出。同时,运维管理的诉求和管控直接落地到大数据赋能层,对数据开发进行在权限、存储、计算等进行精细化的赋能和管控。大数据平台架构本身也得以专注摄入更多符合敏态数据场景的技术并统一到数据中台之中。
至此,大数据赋能层的总体四大目标“提效可控”成型,如下:
控:可控是金融场景的生命线,对数据权限、资源配额、审计、监控上全方位的满足。通过细粒度数据管控能力,为精细化数据管控提供可能,兼容多域异构数据源管控,并以此作为数据可控开放的前提。在资源管控上可以精细化区分各数据线各终端用户在资源、权限上的管控与差异,精细化管控运行时调优参数。提供一体化的审计收集与管控,并提升服务运行与查询定位能力。
可:可持续迭代、可持续演进、可用性。在统一的计算接入界面下,底座持续提升引擎版本和总体大数据技术栈,兼容多域异构数据源和存储底层细节,充分发挥业界在 CBO、RBO、RBO 等方面的成果持续提升执行计划中的优化,达到对存量数据和存量计算作业的迭代优化。可持续演进即是可扩展可扩充更多大数据技术和关键生命周期协调服务,以更具弹性的能力对外集成化标准化数据及服务。可用性即在原有分布式的存算能力基础上,进一步巩固全层次包括引擎层和执行层的高可用能力,赋予数据场景可靠的运行能力和算力保证能力。
效:全生命周期提效,覆盖数据对接和数据赋能的事前(接入准备等)、事中(运行效率、权限管控和行过滤实现)、事后(审计、收集血缘、补充元数据信息等)。提升执行效率,在同一份数据和逻辑的情况持续体现执行计划优化而带来的收益。提升数据开发按人力效率,统一以 SQL 抽象方式聚焦数据逻辑对数据完成查询机加工,显著降低接入环境要求和条件准备。
提:兼顾存量数据资产和数据作业为基准,降低破坏性变更对已有数据资产的影响,同时大幅提升其数据响应性及数据效率。统一低成本的 SQL 接入方式和编程界面,遮蔽底座基础设施细节对接入的数据作业要求,提供轻量化接入方式,并尽量降低语言环境要求。统一不同用途场景下的对接方式,以统一精细化调优令全场景收益。
在“提效可控”大数据赋能层的总体目标之下,Apache Kyuubi 进入我们的架构评估视野。Apache Kyuubi 常被首先作为 SparkSQL 服务网关层的可选服务,Spark 及 Spark SQL 作为成熟稳定且持续演进的计算引擎在不同数据范围都有良好的表现与演进能力。但 Apache Kyuubi 总体定位作为分布式多租户 serverless 的湖仓数据网关门户,赋予了他更大的使命可可能性。
首先,其聚焦于提供 SQL(但不局限于 SQL)的服务模式,允许接入方以低成本方式以交互和抽象逻辑而非具体作业运行,能够满足演进和提效的潜力需求;同时,以核心主体架构服务端与引擎段分离的模式强化多租户模式,能够有效隔离用户对会话的隔离要求,和满足细粒度的资源和配置管控需求;其次,湖仓兼容定位意味着可以按照实际场景需要灵活组合,不同的引擎特性和跨域的底层数据存储形态,兼顾仓表、对象存储、数据湖表、流批一体表等各种持续演进的平台底座组合;再次,其深入数据逻辑提交和执行的具体过程,可以深入适配各个计算过程发挥引擎特性,为数据权限、数据血缘、监控管理等以灵活组合插件方式,提供可能性和必要的现场关键支持。
广发证券自 2021 年伴随底座升级整体设计,开始跟踪 Apache Kyuubi 项目进展,从 1.2 版本开始总体被评估阶段。Apache Kyuubi 的诸多特性来自于其核心架构,session-namespace-server-engine 多层框架自 1.0 版本以来保持稳定,并持续丰富和扩展。Apache Kyuubi 在此基础上所发挥的多种特性,包括统一对接方式和入口、多租户及会话隔离、跟随 Spark 引擎演进适配 engine、细粒度资源管控、多种共享隔离模式,符合和满足数据中台大数据赋能层的目标定位及构建方向。
在数据中台中构建大数据赋能层,将服务和能力以交钥匙的方式提供给上下游,通过合理的架构搭配实现平台与数据业务互相成就。结合 Kyuubi 作为大数据赋能层的统一架构方案之一,我们将预期与目标在架构上对接:
1. 统一接入:标准化以 Hive Thrift 协议使用 JDBC Driver,兼顾多语言环境低成本接入。同时通过 namespace 选用合适的服务并通过 JDBC Driver 上提供服务发现满足高可用支持,无须使用方额外实现。
2. 统一 SQL 能力:以 SparkSQL 对外,兼容 HiveSQL 语法为已有数据作业和资产平滑过渡提供可能,并通过额外特性语法并结合 Iceberg 数据湖格式提供 update/delete/merge 等关键的数据延展加工能力。底层集中化按场景需要优化读写配置、特性开关、启用 AQE 等。
3. 遮蔽底层细节:1)无感兼容使用 Iceberg 表,满足 CRUD 操作。2)按平台需要引入和演进底座引擎版本,1 是当前 Spark 最新稳定发行版 3.3,2 是可以继续纳管 Flink 及 Trino 引擎。
4. 权限控制:全面覆盖认证与鉴权的需要。用户认证在 server 层连接点为终端用户的接入进行,灵活组合 JDBC、token 校验等方式。而鉴权则是深入到执行引擎内部,提供 Spark 对接 Ranger 权限控制,感知细粒度库表列权限、行过滤、列遮蔽等规则,并在执行计划中直接拦截或生效。
5. 全生命周期支持:细粒度的计算资源控制及统一的参数调优。按用户随时调整作业资源上限。支持提取列级的血缘关系深入引擎中执行计划向数据综合治理对齐。数据生命周期上覆盖取数方案场景的必要组件,并统一控制关键流程,如写入小文件优化、读取数量限定等。
以 Apache Kyuubi 为统一的 SQL 服务网关层,我们终于可以全面拥抱一系列长久以来看到的 Spark3 上关键特性演进,以标准化的方式向用户默认开启并优化调参,赋能所有对接的数据场景,以此收拢核心能力对齐大数据赋能层的各向要求。其中包括:
Adapative Query Execution 动态查询执行:从 Spark2.4 以来 AQE 是最受关注的特性之一,也是 Spark3 最受瞩目的关键特性。通过上 Spark3.3 我们得益默认开启(Spark3.2+)这项重要能力。数据倾斜和不均衡的情况是数据的常态,而 AQE 显著提升此情况下的运行表现,在执行时动态决定分区数量重新综合处理能力和数据分布状况令数据查询和数据加工真正可以做到聚焦业务逻辑,而减少传统上任务粒度调优的额时间成本
WholeStage CodeGen 全阶段运行时代码生成:通过 CodeGen 方式运行时深入执行细节和执行现场统计信息生成最具效率的运行代码,令同一份数据资产、同一份查询加工逻辑,持续得益于引擎优化提升运行效能缩短执行时间。
Dynamic Resource Allocation 动态资源分配:运行阶段在可控数量范围下动态申请和销毁 executor 实例,令分布式运行资源得到最大化的运用。全面兼顾了 Adhoc 场景对常驻服务结合弹性伸缩资源的迫切诉求,也兼顾了数据加工下运行时资源的动态释放。显著提升了总体的可用度和资源可控程度。
DRA with Shuffle Tracking 不依赖 ESS 的动态资源分配:使用 ShuffleTracking 避免使用 ESS(External Shuffle Service)。而长久以来 DRA 要求以 ESS 来满足 executor 重分布的需求,这要求每个分布式集群中每个执行节点上必须安装独立的 ESS 服务和暴露端口进行通讯,这极大增加了运维成本和限制版本演进的可能。统一使用 ShuffleTracking 不需要独立部署服务,并且动态依赖作业和引擎的版本,使用足迹和运维成本明显减少。此为 Spark3.2+ 提供的实验性特性。
使用 Kyuubi 作为大数据赋能层的另一个重要原因是,其在同一外观即通过 server 暴露服务的前提下,仍然保留了多样化的前端协议与后端服务的灵活组合,使其在不同对接需求可以选用合适的前端协议,同时保留了增加其他不同类型不同原理的引擎成为可能。
当前 Apache Kyuubi 已经成功实现了这一架构思路,具体而言:
前端协议支持包括,HiveThrift 协议、REST HTTP 接口协议、Mysql 协议(实验性)、FlightSQL(原型论证中),而后端服务已经深入支持 Spark3.0+(各组件兼容覆盖 3.0~3.3 的所有主线版本)、Flink、Trino、Doris(从 1.6 起)等,并开始深入提供 Spark 等引擎下对接其他底层湖仓的连接器,如 Spark DSV2 Hive connector 等。
02 Kyuubi 大数据赋能层的落地策略与场景构建
在经历大数据赋能层的目标定位,以及 Apache Kyuubi 的架构分析作为其中核心服务之一,我们开始考虑的是如何有效平稳的落地,其中演进策略和场景构建将会是大数据平台中加入 Apache Kyuubi 的关键点。既要渐进式接入避免破坏性变更,不得影响已有的数据和逻辑,也要平稳过渡成为核心主力数据查询和数据加工的关键通路。
因此,我们采取了四个层面来推进 Apache Kyuubi 落地,遵循从易到难,从读到写,从封闭到开放的原则,在每个关键阶段设置明确的目标和验证点。
1. 平替孵化:即席查询,只读查询。优先在可控应用层区域下,引入 Kyuubi 作为查询引擎,将 SparkSQL 作为只读查询引擎赋能与数据探索场景。并且重点验证多租户场景在 SERVER 全局共享模式可行性与 Spark 动态资源伸缩 DRA 的有效性。
2. 试点构建:试水用于只读型的数据跑批作业,验证系统对接特性,例如试点用于数据质量跑批。检验对存量 HiveSQL 语法数据加工作业对接 Kyuubi 按 SparkSQL 兼容解析执行的能力。
3. 成熟落地:进一步推广到用于写入数据的大规模数据加工作业。全面启用所有预期的底座架构组合,包括 Kyuubi、Spark3.3、Iceberg 等全体系基准能力,并验证 USER、CONNECTION 级别在数据加工场景下的细粒度资源隔离与配置控制。
4. 可控开放:基于权限管控自动化对接的前提下,可控开放用于数据加工和数据探索。对接 Ranger 数据权限规则,应用库表行列权限及过滤。对接数据开发灵活使用场景。同时针对性隔离数据加工和数据探索,为不同场景使用不同的资源和管控策略。
在架构调研和落地过程中,我们意识到,大数据赋能层各方面的统一要求及 Apache Kyuubi 的单一选型并不意味着必须以同一套服务同一个端口对外,而是应该灵活按场景需要组合来达到资源与隔离之间的平衡。充分发挥各共享模式下,用于减少启停时间,综合 engine 上 Kyuubi UI 定位问题,充分满足资源隔离配置隔离等的需要。其中 Apache Kyuubi 中不同的共享模式我们要按实际需要划分和使用,例如:
即席查询、BI 工具等场景,考虑使用 SERVER 模式,避免重复提交 engine 作业所需要的传包、启停、资源分配等往返操作,同时在此模式下保持对终端用户的身份认证与数据鉴权能力。
数据加工、ETL、采数推数场景:考虑按用户和会话划分所用 engine 实例,分别使用 USER 模式和 CONNECTION 模式。
在数据加工作业场景下,大数据赋能层通过 Kyuubi 首先转变了数据加工开发对接能力的思路和方式。数据开发人效可预期提升超过 100%,开发一种新类型的数据作业从数周的周期压缩到数天内完成,最快可以在 1 天内完成准备,一周内完整全链路开发与验证。具体效益来说,数据加工作业开发不再需要详细了解语言、引擎、版本、特性开关、关键调优等,而能够聚焦于核心逻辑,通过 SQL 方式抽象描述对数据查询和加工的意图,通过不同语言按 JDBC Driver 的方式提交到 Kyuubi,即可完成。尤其是 JVM 下 JDBC 能力开箱即用,简单引用 Driver 库即可完成准备,而其他语言如 Python 等也可以容易通过多种方式对接 Driver。
在数据探索 Adhoc query 及自助查询场景下,再作为非首选引擎引擎的前提下,约 20% 的 HiveSQL 查询主动向 Kyuubi (SparkSQL) 进行使用。具体效益而言,在零额外使用成本的前提下下,多层次的经验与资产得以平滑演进和增效,包括:复用已有产品化的 HiveSQL 场景查询,复用 Hive UDF,复用数据开发在 HiveSQL 上的能力与经验,复用原有 Hive 数仓资产与能力等。并且数据探索与数据开发都得以继续使用 HiveSQL 同一套语法完成,大大避免了 Tinro/Hive-Hive 往返人工转换语法的耗时。对于常见的外部作业数据加工和取数的场景,我们继续围绕 Kyuubi 作为统一的数仓读写入口,这里以 PySpark/Spark 作为链接客户端为例。
接入方式 PySpark,补充实现了 Spark Hive Dialect 插件解决 SparkSQL 列名方言与 HiveSQL 风格不一致的问题,解决 JDBC RDD 转换问题。
数据准备和数据加工的 SQL 通过 JDBC 提交给 Kyuubi 在数仓内统一进行加工。
数据提取走 JDBC 提取需要解决性能与中间结果堆积的问题,SparkRDD 将操作尽可能下推到 Kyuubi 在 Spark 上执行,运行结果集通过 Resultset 微批方式顺序获取,而为了避免 Kyuubi 下 Spark 在 Driver 上堆积全部数据结果,开启 incremental_collection 开关分散压力,逐批获取结果中的分区数据。
所有数据连接均在用户认证加数据权限校验下进行,数据权限从 Ranger 服务感知鉴权规则,与数据综合治理和数据管控对齐。
作为使用方 PySpark/Spark 保持分布式执行能力,可以使用自建 standalone 的 spark 集群也可以在可控前提下与 YARN 混布。
上述过程涉及的 PySpark 接入方式文档、PyHive 接入文档、Spark Hive Dialect 插件等均已提交社区。
总体而言,我们通过 Apache Kyuubi 构建大数据赋能层,在开发效率、运行效率、管控程度都有了显著的提升:
● 运行效率提升 50%:在典型的数据加工场景与 Hive MR 引擎对比,全链路缩短 30-50% 执行时间,部分场景甚至可以达到 60-70% 的提升,充分体现引擎在执行计划上的优化。
● 开发效率提升 100%:新类型数据开发人效提升,从周级别降低到天级别,显著缩短数据场景探索周期和数据逻辑对接时间。
● 运维管理能力提升 100%:运维管控和应变能力提升,所见即所管,从运行资源到数据内容权限再到配置调优,管控直接触达到数据场景,进行细粒度的全生命周期管控。
03 一体化数据权限管控总体思路
在大数据赋能层的目标“提效可控”识别当中,可控实际上是最优先考虑的步骤。而在具体落地实施过程中,可控对接是作为最后一步,当中涉及额外要素和组件需要进一步与数据生命周期对齐和通过一体化数据权限管控转换为实施策略。
作为金融行业成员,无论是监管要求还是业务隔离需要,数据权限管控都是数据赋能和数据开放的先决条件。因此数据中台战略要求实施一体化权限管控:
1. 以数据权限作为切面,同一份策略必须能够对接大数据赋能层中各种引擎,如 Spark、Trino 等。
2. 能够对数据进行不同维度不同粒度的授权,库表列级别权限管控到位。
3. 能够有效响应精细化数据管控需求,其中包括表内数据行过滤、列遮蔽等。
4. 能够充分对接数据治理的沉淀结果,包括分类分级定义、数据标准等进行数据管控。
5. 能在不同的数据场景以不同策略进行区别的权限支撑:一方面令统一数仓在不同场景下有不同视角获得不同的权限赋能,以不同流程方式管控;另一方面区别不同用途的权限规则,减少单场景下规则数量,达到提升运行时规则匹配的效率。
基于此,大数据赋能层需要响应一体化数据权控带来的需求:
1. 依托统一的大数据权限服务统一管控不同场景的权限规则,例如 Ranger 服务。
2. 管控与审计在一体化权控服务集中进行。
3. 保持低成本的接入前提下,有效对用户进行按不同场景和不同方式的身份认证。
4. 数据赋能层中的各项引擎使用针对性对接插件,能够对接数据权限规则,在数据鉴权、数据执行计划中的应用规则和拦截越权操作。
5. 数据赋能层需要有能力满足列级血缘提取、元数据感知等,为数据综合治理提供数仓元数据变化感知信息。
6. 进而数据综合治理将管治理规则和规范同步到一体化权控服务中,例如分类分级等。
在当前大数据体系生态中,Apache Ranger 可能是唯一持续迭代的大数据权限控制服务,尤其是在 Apache Sentry 项目 2018 后停止维护的背景下。而 Apache Ranger 项目中提供对接各种引擎并不包含对 Spark 引擎的支持和对应的规则定义体系。Apache Kyuubi Authz 插件是 Spark 生态下对接 Apache Ranger 权控策略的唯一选择。其规则定义遵循了 Ranger 中 Hive 规则风格,完整支持 Ranger 各项关键特性,覆盖库表列权限、行过滤、列遮蔽等管控规则。广发证券参与到 Apache Kyuubi 的 Authz 插件持续演进中:
●首次完成适配 Spark 3.x 中逐步完善的 DataSource V2 API,覆盖 20+ 项命令及其执行计划,并保持兼容 Spark 3.0-3.3 在细节上的差异。
● 首次支持 Iceberg 自有执行计划,覆盖 MergeInto、UpdateFrom 等被 Iceberg 插件改写的异构 V2 命令
● 并提供了一个 DataSource V2 的权限通用适配模式,令适配对接更多数据湖插件命令,并持续演进对引擎版本变化成为易事
● 其他有关临时/永久视图、临时/永久函数的鉴权处理
一体化数据权控的关键始终在于,“统一数仓、统一权控”。前者要求统一底座和数仓元数据,而后者要求数据权限规则可以落地到不同的赋能层数据引擎中,并抚平差异。
同一份数据权限控制策略,在所有引擎生效,我们通过综合手段在不同引擎去满足。首先 HiveServer2 继续作为可用数据引擎,使用 Ranger 提供的 Hive 插件,通过 HiveAuthorizer 进行权限干预。其次,对 Kyuubi 在 Spark 引擎使用 Kyuubi Authz 插件对接。继而,保留 Trino 引擎继续支持存量 Trino 语法的查询,在使用 Ranger 提供的 Trino 插件基础上,进行二次开发,对特定 catalog 改用与 Hive、Spark 中使用的同一份权限策略控制。对于统一数仓中的流式存储部分,我们对 Ranger 的 Kafka 进行了一定适配以满足 SASL/SCRAM 连接和认证的要求。
至此,一体化权控体系在对接。
04 Kyuubi Authz 鉴权 Spark 插件介绍及对接 Ranger2.3 新特性
如前所述,Ranger 服务本身并没有提供 Spark 插件对接数据权限。此前 Kent Yao 在 Apache Submarine 中提供了 Spark 对接 Ranger 安全插件,在其开源 Apache Kyuubi 后重构并放到此项项目中。Apache Kyuubi 从 1.6.0 版本起,提供了 Authz 插件,是 Spark 生态下对接 Apache Ranger 权控策略的唯一选择。其规则定义遵循了 Ranger 中 Hive 规则风格,完整支持 Ranger 各项关键特性,覆盖库表列权限、行过滤、列遮蔽等管控规则。
上图仅供示意,不作为具体代码结构参考
Apache Kyuubi 的 Authz 鉴权插件总体机理如下:
1. 通过 Spark 的 SQL 插件机制启用 Authz 插件,并注入各类权控优化器,包括 RuleAuthorization 等。
2. 对 SparkSQL 命令及其执行计划进行特征映射与资源提取,在 PrivilegeBuilder 内完成对 V1、V2 等命令的解析与权限请求构建。
3. Authz 插件内部集成了 Ranger 客户端的核心组件 RangerBasePlugin,得益于此,可以从 Ranger Admin 后台 REST 接口定时拉取权控规则策略及用户信息的拉取等,并加载到内存中备用,同时缓存本地保证服务持续性。
4. 对涉及权控的实体资源进行规则匹配与鉴权,其中支持包括 AccessRequest 检查是否具备访问权限、Row-level filter 行过滤规则应用、Data Masking 列级数据遮蔽等。
就具体而言,一个 Ranger 数据规则是通过三大核心要素完成对 RBAC 基于用户和角色的权限控制的。
一条 Ranger 权控规则是面向资源按用户/角色赋予特定权限的。
1. 资源:通过规范维度,在库、表、列三个维度定义资源,支持模糊匹配,在此框架下,纳管包括数据库、数据表、数据列、UDF 等。
2. 用户及角色:定义用户、角色、用户组,并绑定相互关系,进而可选定范围按不同粒度进行授权。其中用户与角色、用户组及用户角色、用户角色与用户角色之间可以是一对多的关系。用户组与用户角色的区别在于用户组可有自己的属性,且用户组不可以绑定到自身。
3. 权限:具体授予的权限操作,包括 Access 授予对应资源的各项操作权限,Row-level filtering 数据行过滤规则,以及 DataMasking 对指定列进行数据遮蔽。
Ranger 对以上三类规则,进行了进一步的抽象,进一步赋予了有效期、是否启用、描述等通用能力。Access 规则授予对应资源的各项操作权限,例如库表权限的 SELECT/UPDATE 等。Row-level filtering 规则定义数据行过滤规则,可以按不同授权对象指定不同过滤规则,并可以使用 UDF 等。而 DataMasking 对指定列进行数据遮蔽。
在具体运用中,往往可以灵活赋予不同资源的授权。例如,对外暴露特定数据可以考虑在永久视图作为表进行 Access 授权,保持终端用户感知逻辑中关联关系,同时在此视图上进行 Row-level filtering 对其所涉及的数据范围进行控制。并且进一步可以在视图上进行 DataMasking 最终对敏感数据数据进行统一的数据遮蔽规则,避免了直接对底层数据表的干预而无法完成关联等。
在大数据赋能层中,我们要求能够满足以不同的“认证-鉴权”组合来应对不同场景。
首先是应对不同的用户,例如终端用户采用账号 +token,通过 JDBC 或 LDAP 完成用户认证;而同时对跑批用户采用账号密码等,通过 JDBC 方式认证。
其次是在不同场景使用区别的权控策略,在自助查询面向终端用户的场景使用最细粒度的规则来管控用户行为,而在跑批场景下对跑数用户按数据加工需要以颗粒度授权,降低规则数量的压力,减少运行时占用的内存和鉴权耗时。
广发证券为 Apache Kyuubi 提供了一项 JDBC Authentication 认证插件。一方面非常易用,快速对接 RMDBS 等完成认证,满足对鉴权细节要素存在常用数据库的通用需求,无论加密还是签名都能够以 SQL 方式快速完成。另一方面在动态生成 token 的认证场景,也可以快速对接 H2 等内存数据库,以免部署数据库方式,通过 SQL 完成签名、加密、有效期校验等一系列认证操作。组件及文档均已向社区提交。
截图仅供示意
在完成对接各项权控规则下,Ranger 审计页面可以帮助我们以统一视角,综合管控各路引擎所被终端用户访问的各项数据资源的情况,包括库表、UDF 等,以及对应的引擎和操作时机等。
Apache Ranger 2.3 中一项关键的新特性,行过滤条件新增支持宏对用户属性进行动态匹配,尤为具有价值。此项特性能大幅降低行过滤规则数量,对用户属性等进行高效复用,并保留对不同粒度用户范围的授权能力。
在 Row-level filtering 中,以往的版本只能针对每个授权指定单独的完整过滤规则,例如,按用户指定多个不同指标 ID 对数据表进行过滤,需要逐一写入,如 index_id in ("1","7","9"......) 等。而此时每个人或每个角色稍有条件细节上的差异,就必须重复定义多个不同的行过滤规则而无法复用。
而有了 RANGER-3605 及 RANGER-3550 的支持后,可以运用此特性,将行过滤条件定性为 index_id in ${{USER.allowIndexIds}},即可解耦行过滤规则与授权,并将具体属性值放在用户属性下进行复用。
Ranger 还支持其他的宏,例如获取用户组属性、判定用户是否特定用户组等,建议宏用法参考上述 Ranger 上述 Issue 说明。
Apache Ranger 2.3 中与上述能力紧密关联的是,新引入了 UserStore 接口和特性,覆盖包括用户属性拉取、用户-用户组关系等。与此相关的收益是,可以对用户组进行授权,大幅降低权限规则数量,同时因用户组可以有自带属性定义能力,结合行过滤宏能力相得益彰。
我们将相关能力的开关以提交到 Kyuubi 文档中方便参考。
05 展望与后续工作
Apache Kyuubi 作为快速完成孵化的顶级大数据生态开源项目,精准定位大数据生态位和架构融合性,具有良好和持续的技术演进和业务价值。我们将继续在更多场景探索和实践 Apache Kyuubi 在大数据赋能层的实践与运用。包括引入 Flink 引擎探索流式计算场景的使用结合 FlinkSQL 打通流式数据探索阶段瓶颈;增强 KyuubiHiveDriver 未实现的各种 JDBC 特性,以解决 Spark/PySpark 在写入场景只能 overwrite 的问题;扩充更多更有效的 FE 特性,解决取数瓶颈和效率,以实现更广泛的对接特性,例如:MySQL 协议完善、PG 协议对接等,更高效率的取数方式,例如:完善 FlightSQL 等向量化、阶段化取数的手段。
同时在我们主要参与的 Authz 权控插件中,进一步推动其关键能力的演进。首先,解决当前只支持单套权控策略的问题,在 DataSourceV2 及多 Catalog 已经逐渐成熟的背景下,允许不同 Catalog 使用不同的权控规则变得尤为关键。其次,通过命令和权控解析进行解耦,强化其不同组件不同执行计划中的适应能力,提供基于 SPI 的定义的动态插件,进一步扩充对接其他插件、其他组件的私有命令封装与执行计划,并允许并存,例如,Paimon、Hudi、Delta Lake、Amoro 等中的私有命令和执行计划。
Apache Kyuubi 持续在各领域深入发展,目前已顺利在全球落地互联网及 IT 厂商、券商等行业数百家企业,包括广发证券及华泰证券等。在参与 Apache Kyuubi 的贡献当中,我们广发证券立足于自身场景与数据战略愿景,提交我们所推动和参与的贡献与修正,积极与社区交流合作,期间得到了 committer 和 contributor 以及使用者的大量的帮助、指导与支持。
版权声明: 本文为 InfoQ 作者【网易数帆】的原创文章。
原文链接:【http://xie.infoq.cn/article/2d2f9728b015caddf55efebaa】。文章转载请联系作者。
评论