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

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis:打通上层应用与底层计算引擎的数据中间件

  • 1.引言
  • 2.背景
  • 3.设计初衷
  • 4.技术架构
  • 5.业务架构
  • 6.处理流程
  • 7.如何支撑高并发
  • 8.用户级隔离度和调度时效性
  • 9.总结

Linkis 是微众银行开源的一款 数据中间件,用于解决前台各种工具、应用,和后台各种计算存储引擎间的连接、访问和复用问题。

1.引言

Linkis,一个打通了多个计算存储引擎如 SparkTiSparkHivePythonHBase 等,对外提供统一 REST / WebSocket / JDBC 接口,提交执行 SQLPysparkHiveQLScala 等脚本的数据中间件。

Linkis 基于微服务架构,提供了金融级多租户隔离、资源管控、权限隔离等企业级特性,支持统一变量、UDF、函数、用户资源文件管理,具备高并发、高性能、高可用的大数据作业 / 请求全生命周期管理能力。

2.背景

大数据技术的广泛应用,催生出层出不穷的上层应用和下层计算引擎。

通过引入多个开源组件来实现业务需求,不断更新和丰富大数据平台架构,几乎是现阶段所有企业的通用做法。

如下图所示,当我们的上层应用、工具系统,和底层的计算存储组件越来越多时,整个数据平台的情况就会变成如上图的网状结构。

在这里插入图片描述
不断引入新组件来实现业务需求,越来越多的痛点也随之产生:

  • 业务需求变化多端,上层组件各具特色,用户使用起来割裂感强烈,学习成本高昂。
  • 数据种类繁多,存储和计算非常复杂,一个组件一般只解决一个问题,开发人员必须具备完善的技术栈。
  • 新组件的引入,在多租户隔离、用户资源管理、用户权限管理等无法兼容原有数据平台,自上而下的定制化开发,不仅工程浩大,而且重复造轮子。
  • 上层应用直接对接底层计算存储引擎,一旦底层环境发生任何改变,都会直接影响业务产品的正常使用。

3.设计初衷

如何提供统一的数据中间件,对接上层应用工具,屏蔽掉底层的各种调用和使用细节,真正做到让业务用户只需关注业务实现,就算底层平台机房扩建、整体搬迁都不受影响,是 Linkis 的设计初衷!

在这里插入图片描述

4.技术架构

在这里插入图片描述
如上图所示,我们基于 SpringCloud 微服务技术,新建了多个微服务集群,来打造 Linkis 的中间件能力。

每个微服务集群都承担系统的一部分功能职责,我们对其进行了如下明确的划分。如:

  • 统一作业执行服务(UJES):一个分布式的 REST / WebSocket 服务,用于接收上层系统提交的各种访问请求。
    • 目前支持的计算引擎有:SparkPythonTiSparkHiveShell 等。
    • 支持的脚本语言有:SparkSQLSpark ScalaPysparkRPythonHQLShell 等;
  • 资源管理服务(RM): 支持实时管控每个系统和用户的资源使用情况,限制系统和用户的资源使用量和并发数,并提供实时的资源动态图表,方便查看和管理系统和用户的资源。
    • 目前已支持的资源类型:Yarn 队列资源、服务器(CPU 和内存)、用户并发个数等。
  • 统一存储服务(Storage):通用的 IO 架构,能快速对接各种存储系统,提供统一调用入口,支持所有常用格式数据,集成度高,简单易用。
  • 统一上下文服务(CS):统一用户和系统的资源文件(用户脚本、JARZIPProperties 等),用户、系统、计算引擎的参数和变量统一管理,一处设置,处处自动引用。
  • 物料库服务(BML):系统和用户级物料管理,可分享和流转,支持全生命周期自动管理。
  • 元数据服务(Database):实时的 Hive 库表结构和分区情况展示。

依赖这些微服务集群的相互协作,我们改善了整个大数据平台对外服务的方式和流程。

5.业务架构

在这里插入图片描述

  • Gateway 网关:基于 Spring Cloud Gateway 进行了插件化功能增强,新增了前端 Client 与后台多 WebSocket 微服务 1 1 1 N N N 支持,主要用于解析和路由转发用户的请求到指定微服务。

  • 统一入口:统一入口是用户某一类引擎作业的 Job 生命周期管理者。从接收作业、作业提交给执行引擎、到作业执行信息反馈给用户,再到作业完成,Entrance 管理了一个作业的全生命周期。

  • 引擎管理器:引擎管理器负责管理引擎的全生命周期。负责向资源管理服务申请和锁定资源,并实例化新的引擎,也负责监控引擎的生命状态。

  • 执行引擎:执行引擎是真正执行用户作业的微服务,它由引擎管理器启动。为了提升交互性能,执行引擎直接跟统一入口进行交互,实时推送执行的日志、进度、状态和结果集给统一入口。

  • 资源管理服务:实时管控每个系统和每个用户的资源使用情况,管理引擎管理器的资源使用和实际负载,限制系统和用户的资源使用量和并发数。

  • Eureka:Eureka 是 Netflix 开发的服务发现框架,SpringCloud 将它集成在其子项目 spring-cloud-netflix 中,以实现 SpringCloud 的服务发现功能。每个微服务都内置了 Eureka Client,可以访问 Eureka Server,实时获得服务发现的能力。

6.处理流程

Linkis 如何处理上层系统提交的一条 SparkSQL?

在这里插入图片描述

  • 上层系统的用户提交一个 SQL,先经过 GatewayGateway 负责解析用户请求,并路由转发给合适的统一入口 Entrance
  • Entrance 会先寻找该系统的该用户是否存在可用的 Spark 引擎服务,如果存在,则直接将请求提交给 Spark 引擎服务。
  • 不存在可用 Spark 引擎服务,开始通过 Eureka 的服务注册发现功能,拿到所有的引擎管理器列表,通过请求 RM 实时获取引擎管理器的实际负载。
  • Entrance 拿到负载最低的引擎管理器,开始要求引擎管理器启动一个 Spark 引擎服务。
  • 引擎管理器接收到请求,开始询问 RM 该系统下的该用户,是否可以启动新引擎。
  • 如果可以启动,则开始请求资源并锁定;否则返回启动失败的异常给到 Entrance
  • 锁定资源成功,开始启动新的 Spark 引擎服务;启动成功后,将新 Spark 新引擎返回给 Entrance
  • Entrance 拿到新引擎后,开始向新引擎请求执行 SQL。
  • Spark 新引擎接收 SQL 请求,开始向 Yarn 提交执行 SQL,并实时推送日志、进度和状态给 Entrance
  • Entrance 将获取的日志、进度和状态实时推送给 Gateway
  • Gateway 回推日志、进度和状态给前端。
  • 一旦 SQL 执行成功,Engine 主动将结果集推给 EntranceEntrance 通知前端拿取结果。

如何保证高实时性

众所周知,Spring Cloud 集成了 Feign 来作为微服务之间的通信工具。

基于 Feign 的微服务之间 HTTP 接口调用,只支持 A 微服务实例根据简单规则随机访问 B 微服务的某个实例。

但 Linkis 的执行引擎,却可以直接主动推送日志、进度和状态给请求它的统一入口,Linkis 是如何做到的?

Linkis 基于 Feign 实现了一套自己的底层 RPC 通信方案。

在这里插入图片描述
如上图所示,我们在 Feign 的基础上,封装出了 SenderReceiver

Sender 作为发送端直接可用,用户可以指定访问某个微服务实例,也可以随机访问,还支持广播。

Receiver 作为接收端,需要用户实现 Receiver 接口,用于处理真正的业务逻辑即可。

Sender 提供三种访问方式,如下:

  • ask 方法为同步请求响应方法,要求接收端必须同步返回响应。

  • send 方法为同步请求方法,只负责同步将请求发送给接收端,不要求接收端给出答复。

  • deliver 则为异步请求方法,只要发送端的进程不异常退出,在稍后会通过其它线程将请求发送给接收端。

7.如何支撑高并发

Linkis 设计了 5 5 5 大异步消息队列和线程池,Job 每次占用线程不到 1 1 1 毫秒,保证每个统一入口可承接超 10000 10000 10000+ TPS 常驻型 Job 请求。

在这里插入图片描述

  • 如何提高上层的请求吞吐能力?
    • EntranceWebSocket 处理器,内置一个处理线程池和处理队列,接收 Spring Cloud Gateway 路由转发的上层请求。
  • 如何保证不同系统不同用户的执行请求,互相隔离?
    • EntranceJob 调度池,每个系统的每个用户,都有一个专用线程,保证隔离度。
  • 如何保证 Job 执行高效?
    • Job 执行池,只用于提交 Job,一旦 Job 提交给了 Engine 端,则立马放入 Job 执行队列,保证每个 Job 占用执行池线程的时间不超过 1 1 1 毫秒。
    • RPC 请求接收池,用于接收和处理 Engine 端推来的日志、进度、状态和结果集,并实时更新 Job 的相关信息。
  • 如何实时将 Job 的日志、进度和状态推给上层系统?
    • WebSocket 发送池,专门用于处理 Job 的日志、进度和状态,将信息推给上层系统。

8.用户级隔离度和调度时效性

Linkis 设计了 Scheduler 模块 —— 可智能监控扩展的分组调度消费模块,用于实现 Linkis 的高并发能力。

在这里插入图片描述
每个系统的每个用户,都会单独分组,来保证系统级和用户级的隔离度。

每个消费器均有一个独立的监控线程,统计消费器中等待队列的长度、正在执行的事件数量、执行时间的增长比例等指标。

消费器所对应的分组对象,会对这些指标设置阈值和告警比例,一旦某个指标超过阈值,或多个指标间的比例超过限定范围(比如监控到平均执行时间大于分发间隔参数,即认为超过阈值),监控线程就会立即对消费器进行相应的扩展。

扩展时,会充分利用上述的调参过程,具有针对性的调大某个参数,其它参数会自动随之得到扩展。

9.总结

Linkis 作为数据中间件,为实现对下层调用细节的屏蔽,做了许多的尝试和努力。

比如:Linkis 如何实现统一存储服务?Linkis 如何统一 UDF、函数和用户变量?

由于篇幅所限,本文不再详细论述,如您感兴趣,欢迎您访问官网:https://linkis.apache.org

有没有一套真正基于开源,经过金融级生产环境和场景的自研打磨完善,再回到开源社区的数据中间件,让人能相对放心的拿去服务于生产,支持金融级业务,具备企业级特性保障?

我们希望 Linkis 成为答案。

相关文章:

【大数据】Linkis:打通上层应用与底层计算引擎的数据中间件

Linkis:打通上层应用与底层计算引擎的数据中间件 1.引言2.背景3.设计初衷4.技术架构5.业务架构6.处理流程7.如何支撑高并发8.用户级隔离度和调度时效性9.总结 Linkis 是微众银行开源的一款 数据中间件,用于解决前台各种工具、应用,和后台各种…...

权限提升-数据库提权-MSF-UDF提权

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的? 后台权限,网站权限,数据库权限,接口权限,系统权限,域控权限等 2、以上常见权限获取方法简要归类说明? 后台权限:SQL注入,数…...

基于XL32F003单片机的可控硅调光方案

可控硅调光是一种用于调节电源输出电压的技术,被广泛应用于各种场景。它主要通过改变波形的导通角度来调节输出电压的大小,从而实现对照明设备亮度的控制。在照明市场占据了很大的调光市场。 可控硅调光的兼容性强,应用范围广。例如&#xff…...

【ag-grid-vue】列定义(Updating Column Definitions)

列定义一节解释了如何配置列。可以在初始设置列之后更改列的配置。本节介绍如何更新列定义。 添加和删除列 可以通过更新提供给网格的列定义列表来添加和删除列。当设置新列时,网格将与当前列进行比较,并计算出哪些列是旧的(要删除)、哪些列是新的(创建…...

mysql sql_mode数据验证检查

sql_mode 功能 sql_mode 会影响MySQL支持的sql语法以及执行的数据验证检查。通过设置sql_mode ,可以完成不同严格程度的数据校验,有效地保障数据准确性 sql_mode 严格模式 VS 宽松模式 宽松模式 比如,插入的数据不满足 表的数据类型,也可能…...

Prompt召唤 AI “生成”生产力,未来已来

如果说 2023 年的 AI 为世界带来了怎样的改变,那么大模型的狂飙发展, 无疑一马当先。以人机交互为例,“提示词工程师”(又称“AI 召唤师”)成为 21 世纪最脑洞大开的新兴职业,用自然语言写代码、召唤计算机…...

【0day】复现时空智友企业流程化管控系统SQL注入漏洞

目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现 一、漏洞描述 时空智友企业流程化管控系统是一个用于企业流程管理和控制的软件系统。它旨在帮助企业实现流程的规范化、自动化和优化,从而提高工作效率、降低成本并提升管理水平。时空智友企业流程化管控系统存…...

python编程中fft的优缺点,以及如何使用cuda编程,cuda并行运算,信号处理(推荐)

A.python中cuda编程的库主要有: cupy、pycuda 1,区别如下: 支持的GPU平台: PyCUDA:PyCUDA是一个用于在Python中编写CUDA代码的库。它支持NVIDIA的CUDA平台,并提供了与CUDA C/C++接口相似的功能。因此,PyCUDA主要用于与NVIDIA GPU交互的应用。 CuPy:CuPy是一个用于在P…...

统计学补充概念-16-支持向量机 (SVM)

概念 支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的机器学习算法。SVM的主要目标是找到一个最优的超平面,可以将不同类别的数据样本分开,同时使得支持向量(离超平面最近的样本点&#xf…...

Python“牵手”天猫商品列表数据,关键词搜索天猫API接口数据,天猫API接口申请指南

天猫平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范,天猫API接口是指通过编程的方式,让开发者能够通过HTTP协议直接访问天猫平台的数据,包括商品信息、店铺信息、物流信息等,从而实现天猫平台…...

SQL 错误 [22007]: ERROR: invalid input syntax for type date: ““

0. 背景 PG数据库一张表有这样一个varchar类型的字段end_date,存储的值是格式化后的年月日日期如 2024-08-10 现在我需要根据当前日期与end_date的差值作为where条件过滤,我的写法 select …… from my_table_name where current_date - cast (end_date as date) >100报错…...

SpringBootWeb案例 Part 2

目录 3. 员工管理 3.1 分页查询 3.1.1 基础分页 3.1.1.1 需求分析 3.1.1.2 接口文档 3.1.1.3 思路分析 3.1.1.4 功能开发 PageBean 3.1.1.5 功能测试 3.1.1.6 前后端联调 3.1.2 分页插件{分页查询-PageHelper插件} 3.1.2.1 介绍 官网: 3.1.2.2 代码实…...

4.14 HTTPS 中 TLS 和 TCP 能同时握手吗?

目录 实现HTTPS中TLS和TCP同时握手的前提: 什么是TCP Fast Open? TLS v1.3 TCP Fast Open TLSv1.3 HTTPS都是基于TCP传输协议实现的,得先建立完可靠得TCP连接才能做TLS握手的事情。 实现HTTPS中TLS和TCP同时握手的前提: 1、…...

游戏开发服务器选型的横向对比

来源一个某乎的作者,貌似来自台湾 上篇介绍了go版本的游戏服务器,这篇介绍下其它语言版本: SkynetkbengineNoahGameFramePomeloPinusET使用的语言C/LuaCCNodejsTypeScriptC#概述云风前辈开源的框架mmo框架server一个快速的、可扩展的、分布…...

【android12-linux-5.1】【ST芯片】HAL移植后配置文件生成报错

根据ST官方源码移植HAL源码后,执行readme指示中的生成配置文件指令时报错ST_HAL_ANDROID_VERSION未定义之类,应该是编译环境参数问题。makefile文件中是自动识别配置的,参数不祥就会报错,这里最快的解决方案是查询确定自己android…...

基于深度神经网络的分类--实现与方法说明

1、分类系统的设计 采用神经网络进行分类需要考虑以下几个步骤: 数据预处理: 将数据特征参数和目标数据整理成合适的输入和输出形式,可以使用过去一段时间的数据作为特征,然后将未来的数据作为输出标签,进行分类问题的…...

Java“牵手”天猫商品快递费用API接口数据,天猫API接口申请指南

天猫平台商品快递费用接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、商品快递费用,宝贝ID,发货地,区域ID,快递费用,月销量、总销量、库存、详情…...

哲讯科技携手无锡华启动SCM定制化项目,共谋数字化转型之路

无锡华光座椅弹簧有限公司启动SCM定制化项目 近日,无锡华光座椅弹簧有限公司顺利举行了SCM定制化项目的启动会。本次启动会作为该项目实施的重要里程碑,吸引了双方项目组核心成员的共同参与,并见证了项目的正式启动。 无锡华光座椅弹簧有限公…...

ModaHub魔搭社区:将图像数据添加至Milvus Cloud向量数据库中

将图像数据添加至向量数据库中 图像分割裁剪完成后,我们就可以将其添加至 Milvus Cloud 向量数据库中了。为了方便上手,本项目中使用了 Milvus Lite 版本,可以在 notebook 中运行 Milvus 实例。接下来,使用 PyMilvus 连接至 Milvus Lite 提供的默认服务器。 这一步骤中,…...

svn下载

Download | VisualSVN for Visual Studio svn下载...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...