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

news2024/12/28 20:51:28

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 成为答案。

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

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

相关文章

【git进阶使用】 告别只会git clone 学会版本控制 ignore筛选 merge冲突等进阶操作

git使用大全 基本介绍git 快速上手一 环境安装(默认已安装)二 远程仓库克隆到本地1 进入rep文件夹目录2 复制远程仓库地址3 git clone克隆仓库内容到本地4 修改后版本控制4.1 修改文件4.2 git status查看版本库文件状态4.3 git add将文件加入版本库暂存区…

NEOVIM学习笔记

GitHub - blogercn/nvim-config: A pretty epic NeoVim setup 一直使用vim,每次到了新公司都要配置半天,而且常常配置失败,很多插件过期不好用。偶然看到别人的NEO VIM,就试着用了一下,感觉还不错。 用来开发和阅读C代…

使用树莓派Pico、DHT11和SSD1306搭建一个温度湿度计(只使用官方库,以及官方案例代码的错误之处和解决方案)

最近想树莓派 Pico、DHT11 温湿度传感器和 SSD1306 OLED 屏幕做一个温度湿度计,树莓派官方案例也分别有这两个设备的案例,我就想做个简单的温度湿度计作为学习微控制器的开始,结果遇到了一个大坑,所以写本文记录一下整个过程。 本…

[完美解决]Vue项目运行时出现this[kHandle] = new _Hash(algorithm, xofLen)

vue项目运行bug解决办法 一、问题内容二、问题出现的原因三、解决方法1、方法一(推荐)2、方法二(可以解决,但不太推荐) 一、问题内容 在github寻找一些vue项目clone到本地时候,npm i没有问题,但是npm run serve 或者npm run dev的时候会出现…

计算机毕设 基于机器学习的餐厅销量预测 -大数据 python

文章目录 0 前言餐厅销量预测模型简介2.ARIMA模型介绍2.1自回归模型AR2.2移动平均模型MA2.3自回归移动平均模型ARMA 三、模型识别四、模型检验4.1半稳性检验(1)用途(1)什么是平稳序列?(2)检验平稳性 ◆白噪声检验(纯随机性检验)(1)用途(1)什么是纯随机序列?(2)检验纯随机性 五…

LLM本地知识库问答系统(一):使用LangChain和LlamaIndex从零构建PDF聊天机器人指南

随着大型语言模型(LLM)(如ChatGPT和GPT-4)的兴起,现在比以往任何时候都更容易构建比普通熊更智能的智能聊天机器人,并且可以浏览堆积如山的文档,为您的输入提供准确的响应。 在本系列中&#xf…

基于微信小程序的汽车租赁系统的设计与实现ljx7y

汽车租赁系统,主要包括管理员、用户二个权限角色,对于用户角色不同,所使用的功能模块相应不同。本文从管理员、用户的功能要求出发,汽车租赁系统系统中的功能模块主要是实现管理员后端;首页、个人中心、汽车品牌管理、…

LAMP介绍与配置

一.LAMP 1.1.LAMP架构的组成 CGI(通用网关接口)和FastCGI(快速公共网关接口)都是用于将Web服务器与后端应用程序(如PHP、Python等)进行交互的协议/接口。 特点 CGI FastCGI 运行方式 每个请求启动…

【C语言】2023.8.27C语言入学考试复盘总结

前言 本篇文章记录的是对于2023年8月27日的 C语言 的入学考试的整理总结 成绩:220/240 题目:9/12 错题整理 首先先对于我没做出来的三道题做一个整理 错题1:7-4 分段函数PLUS 题干 以下是一个二元分段函数,请你根据所给的函…

列式存储引擎-内核机制-Parquet格式

列式存储引擎-内核机制-Parquet格式 Parquet是一种开源的列式存储结构,广泛应用于大数据领域。 1、数据模型和schema Parquet继承了Protocol Buffer的数据模型。每个记录由一个或多个字段组成。每个字段可以是atomic字段或者group字段。Group字段包含嵌套的字段&…

软件工程(九) UML顺序-活动-状态-通信图

顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…

Python WEB框架之FastAPI

Python WEB框架之FastAPI 今天想记录一下最近项目上一直在用的Python框架——FastAPI。 个人认为,FastAPI是我目前接触到的Python最好用的WEB框架,没有之一。 之前也使用过像Django、Flask等框架,但是Django就用起来太重了,各种…

remove elements in c++

https://www.youtube.com/watch?vq5OfB6ZXT6E&listPL5jc9xFGsL8E_BJAbOw_DH6nWDxKtzBPA&index4

AUTOSAR规范与ECU软件开发(实践篇)6.7 服务软件组件与应用层软件组件端口连接

在生成了BSW模块的代码后, 切换到ISOLAR-A系统级设计界面,会发现产生一些基础软件模块的服务软件组件: BswM、 ComM、 Det和EcuM等, 如图6.60所示。 图6.60 生成了BSW后的服务软件组件 此时, 如果涉及服务软件组件与应用层软件组件的交互, 就需要为应用层软件组…

PowerDesigner学习笔记

备注:文章主要对概念数据模型进行深入分析 1.对各种模型图初步认识 1.1.概念数据模型 (CDM) (Conceptual Data Model) 对数据和信息进行建模,利用实体-关系图(E-R图)的形式组织数据,检验数据设计的有效性和合理性。 …

【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

字符串翻转合集 344. 反转字符串541. 反转字符串Ⅱ151. 反转字符串中的单词剑指 Offer 58 - II. 左旋转字符串反转单词思路循环挪动子串和子串的拼接 344. 反转字符串 题目链接:344. 反转字符串 题目内容: 题目中重点强调了必须原地修改输入数组&#…

Java --- 异常处理

目录 一、什么是异常 二、异常抛出机制 三、如何对待异常 四、 Java异常体系 4.1、Throwable 4.2、Error 4.2、Exception 4.2.1、编译时异常 4.2.2、运行时期异常 五、异常处理 5.1、捕获异常(try-catch) 5.1.2、catch中异常处理方式 …

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 😊 代码仓库分享 💕 前言: 今天我们来回顾一下顺序表与链表,针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习,这样才能巩固我们学习的内容。 话不多说&#xf…

C++:常成员变量、常成员函数、常对象

常成员变量: 1.用const修饰,可位于类型前后,若是成员变量类型为指针则只可位于类型后。 即:int *const p; 2.只能通过构造函数的初始化表对常成员变量进行初始化。 3.常成员所在类中的所有构造函数都必须对常成员变量初始化…

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL(数据查询) 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…