Apache Linkis 介绍
![Apache Linkis 介绍](https://static001.geekbang.org/infoq/70/704e3567214881bc3ba71d1a3b0c3bca.png)
关键名词
LinkisMaster:Linkis 的计算治理服务层架中的管理服务,主要包含了 AppManager、ResourceManager、LabelManager 等几个管控服务。原名 LinkisManager 服务 。
Entrance:计算治理服务层架中的入口服务,完成任务的调度、状态管控、任务信息推送等功能 。
Orchestrator:Linkis 的编排服务,提供强大的编排和计算策略能力,满足多活、主备、事务、重放、限流、异构和混算等多种应用场景的需求。现阶段 Orchestrator 被 Entrance 服务所依赖 。
EngineConn(EC):引擎连接器,负责接受任务并提交给底层引擎如 Spark、hive、Flink、Presto、trino 等进行执行 。
EngineConnManager(ECM):Linkis 的 EC 进程管理服务,负责管控 EngineConn 的生命周期(启动、停止)。
LinkisEnginePluginServer:该服务负责管理各个引擎的启动物料和配置,另外提供每个 EngineConn 的启动命令获取,以及每个 EngineConn 所需要的资源 。
PublicEnhencementService(PES): 公共增强服务,为其他微服务模块提供统一配置管理、上下文服务、物料库、数据源管理、微服务管理和历史任务查询等功能的模块。
Linkis 的作用
Linkis 是在底层引擎和上层应用工具之间的一个通用的“计算中间件”的中间层,统一了上层应用工具到底层计算存储引擎的入口(作为大数据平台的统一入口),以标准化可重用的方式处理紧耦合、重复造轮子、扩展难、应用孤岛等计算治理问题。
通过使用 Linkis 提供的 REST/WebSocket/JDBC 等标准接口,上层应用可连接访问 MySQL/Spark/Hive/Presto/Flink /Trino 等底层引擎,同时实现变量、脚本、函数和资源文件等用户资源的跨上层应用互通,以及通过 REST 标准接口提供了数据源管理和数据源对应的元数据查询服务。
作为计算中间件,Linkis 提供了强大的连通、复用、编排、扩展和治理管控能力。通过计算中间件将应用层和引擎层解耦,简化了复杂的网络调用关系,降低了整体复杂度,同时节约了整体开发和维护成本。
![](https://static001.geekbang.org/infoq/67/6752d7906e34f2bb00600b3de660f3ff.png)
VS
![](https://static001.geekbang.org/infoq/1c/1ca2b0d27b5555c9199d7c701ce13549.png)
Linkis 的核心特点
丰富的底层计算存储引擎支持
目前支持的计算存储引擎:Spark、Hive、Flink、Python、Pipeline、Sqoop、openLooKeng、Presto、ElasticSearch、JDBC 和 Shell 等。
正在支持中的计算存储引擎:Trino(计划 1.3.1)、SeaTunnel(计划 1.3.1)等。
支持的脚本语言:SparkSQL, HiveQL, Python,Shell, Pyspark, R, Scala 和 JDBC 等。
强大的计算治理能力
基于 Orchestrator、Label Manager 和定制的 Spring Cloud Gateway 等服务,Linkis 能够提供基于多级标签的跨集群/跨 IDC 细粒度路由、负载均衡、多租户、流量控制、资源控制和编排策略(如双活、主备等)支持能力。
全栈计算存储引擎架构支持
能够接收、执行和管理针对各种计算存储引擎的任务和请求,包括离线批量任务、交互式查询任务、实时流式任务和存储型任务。
资源管理能力 ResourceManager
不仅具备对 Yarn 和 Linkis EngineManager 的资源管理能力,还将提供基于标签的多级资源分配和回收能力,让 ResourceManager 具备跨集群、跨计算资源类型的强大资源管理能力。
统一上下文服务
为每个计算任务生成 context id,跨用户、系统、计算引擎的关联管理用户和系统资源文件(JAR、ZIP、Properties 等),结果集,参数变量,函数和 UDF 等,一处设置,处处可引用。
统一物料
系统和用户级物料管理,可分享和流转,跨用户、系统共享物料。
数据源管理服务
提供了 hive、es、mysql、kafka 等类型数据源的增删查改、版本控制、连接测试等功能,可以用于流式数仓、交互式分析等功能工具的数据源管理能力。并提供了 hive、es、mysql、kafka 等元数据的查询能力。
Linkis 的服务架构
![](https://static001.geekbang.org/infoq/4e/4ec95214fbec5d87bf706959e0de4c90.png)
Linkis 主要由三组服务组成:
计算治理服务组 CGS (Computation Governance Services)
完成计算任务和请求的提交、准备、执行、返回结果等主要步骤,且为每个步骤提供了强大和灵活的能力 。
提交阶段:主要提供通用的接口,接收上层应用工具提交过来的任务,并能提供基础的解析和拦截能力。
准备阶段:主要通过编排器 Orchestrator,和 LinkisMaster 完成对任务的解析编排,并且做资源控制,和完成 EngineConn 的创建。
执行阶段:通过引擎连接器 EngineConn 来去实际完成和底层引擎的对接,通常每个用户要连接不同的底层引擎,就得先启动一个对应的底层引擎连接器 EC。计算任务通过 EC,来提交给底层引擎做实际的执行,和状态、日志、结果等信息的获取。
结果返回阶段:返回任务执行的结果信息,支持按照多种返回模式,如:文件流、JSON、JDBC 等。
整体的时序图如下:
![](https://static001.geekbang.org/infoq/a1/a1b672a626a8b36c3711c7bafc2ea094.png)
公共增强服务组 PES (Public Enhancement Services)
打破了上层应用工具间的孤岛,做到变量、函数、文件、结果集等上下文的共享。
主要提供了以下能力 :
公共的上下文能力:统一 UDF、变量、小函数的定义规范和语义,做到一处定义多个工具都可使用。
统一的数据源能力:数据源在 Linkis 层进行统一定义和管理,应用工具只需要通过数据源名字来进行使用,不再需要去维护对应数据源的连接信息。而且在不同的工具间数据源的含义都是一样的。
统一物料的能力:提供统一的物料,在多个工具间支持共享访问这些物料,并且物料支持存储多种的文件类型,并支持版本控制。
微服务治理服务组 MGS (Microservice Governance Services)
主要复用了 SpringCloud 的能力。
Linkis 的引擎连接器
Linkis 从 4 类引擎使用特点出发,包括 AP(分析型)、TP(事务处理)、MACHINE LEARNING(机器学习)和 STREAMING(流式计算),抽象出了 3 种场景,及对应的 3 种顶层的引擎连接器 EngineConn:
OLAP EngineConn:对应 AP 和 MACHINE LEARNING 引擎,这两类底层引擎的计算任务处理过程比较类似,都需要能够提交、获得运行时进度、状态和日志、获得结果集等。
OLTP EngineConn:对应 TP 引擎,通过提供通用的 JDBC/ODBC Driver 和接口,来提供对 OLTP 引擎的对接支持。
Stream EngineConn:对应 STREAMING 流式计算引擎,能够完成流式计算任务的提交和管理,不需要获得结果集。
计算任务通过引擎连接器 EngineConn,提交给底层引擎做实际的执行,和状态、日志、结果等信息的获取。
Linkis 的优势
一般在对接和使用计算引擎的时候,一般会有环境准备、计算任务提交、计算任务执行、和系统运维管理 4 个阶段。
环境准备:需要安装和运维多个底层引擎的客户端和运行时环境。
计算任务提交:是否支持自定义参数,和执行的控制规则等功能,如超时、重试等;是否支持支持底层引擎的原生参数等。
计算任务执行:需要能够方便的去获取任务的执行结果、运行状态、日志等信息。
系统运维:是否支持多租户、细粒度的资源控制、高并发、高可用、审计等。
将 Linkis 作为计算中间件时,在各个阶段有以下优势:
环境准备
能解耦上层应用和底层引擎间的连接,简化上层应用工具的环境准备的维护,提供复用。
计算任务提交
可以支持用各种类型接口提交各种不同语言类型的任务,对上层工具调用底层引擎提供了很强的友好度和灵活度,让下层引擎的调用变得很便利;
基于多层级的异步调度模式,可以去支持百万级别的任务提交,等待运行并返回结果。
计算任务执行
通过执行节点 ECM 构建了一个连接层的资源池,把之前分散在各个上层工具系统中的用于启动 client、driver 的机器集中了起来,池化统一利用,方便运维。
系统运维:
支持高可用:利用了微服务架构的优势,所有的服务都是可以多活提供服务,并支持灰度更新去保证服务的稳定性。
支持多租户、细粒度的资源控制:基于 Linkis 的标签体系机制,可以做到 Linkis 层级的租户和机器隔离,支持多用户多租户场景。基于标签的多级精细化资源管控策略,可以从租户、用户、应用、EC 类型、到具体启动的 EC 实例等多层级进行精细化资源控制。
更高的安全性:通过限制底层引擎的统一入口为 Linkis,在 Linkis 层提供身份识别能力。提供任务的检验拦截功能,可以对高风险操作的任务,在任务执行前进行检验对 Bad SQL,高危险 SQL、敏感表查询进行识别拦截。
完善的日志审计功能:提供统一的日志和审计功能,所有的任务和接口请求都会进行记录,而不需要再去各个工具和引擎收集日志。
比如想统一用 restful 接口方式,向底层不同引擎提交计算任务,可以调 Linkis 的 restful 接口,如果是用 python 开发的上层工具,就可以用习惯的 Python 语言,初始化一个 LinkisClient,然后提交比如 Scala 类型的任务,到 spark 集群执行,然后再方便的将返回结果集放到一个 python dataframe 中做进一步处理。
参考文章:
评论