Apache Linkis 全面技术大纲
大数据服务层与中间件平台
一、Linkis概述与核心价值
1.1 什么是Linkis
- 定位:大数据统一计算中间件/服务层
- 诞生背景:解决大数据生态组件(Hive、Spark、Flink、HBase等)的复用、隔离、治理问题
- 核心思想:"为上层应用提供统一入口,屏蔽底层计算引擎差异"
- 发展历史:由腾讯开源,2018年捐赠Apache,成为顶级项目
- 应用场景:数据中台、数据服务平台、AI平台、交互分析平台
1.2 核心价值与优势
- 统一入口:一套接口访问多种引擎(Hive/Spark/Flink/Elasticsearch/Python等)
- 资源隔离:多租户、队列、标签、并发控制
- 元数据管理:统一数据源、表、视图管理
- 权限控制:细粒度数据权限、操作权限
- 结果缓存:查询结果缓存,提升性能
- 监控告警:全链路监控、资源使用统计
- 扩展性:插件化架构,易于扩展新引擎
1.3 Linkis生态定位
应用层(DataStudio、Notebook、Azkaban、DolphinScheduler)
↑
Linkis(服务层:REST/Java/Scala/Python接口)
↑
引擎层(Hive/Spark/Flink/HBase/Presto/Elasticsearch/Python/Shell等)
↑
资源层(YARN/K8s/Standalone)
二、Linkis架构设计
2.1 整体架构图
┌─────────────────────────────────────────────────────────────┐
│ External Applications │
│ (DataStudio, Notebook, DolphinScheduler, Azkaban) │
└───────────────────────────┬─────────────────────────────────┘
│ (REST, Java/Scala, Python SDK)
┌───────────────────────────┴─────────────────────────────────┐
│ Linkis Gateway │
│ ┌──────────────┐ ┌──────────────┐ ┌─────────────────┐ │
│ │ REST API │ │ RPC Server │ │ WebSocket │ │
│ └──────────────┘ └──────────────┘ └─────────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┴─────────────────────────────────┐
│ Linkis Core Layer │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ Engine │ │Resource │ │ Job │ │ Label │ │
│ │ Manager │ │Manager │ │Scheduler │ │Manager │ │
│ └──────────┘ └──────────┘ └──────────┘ └─────────────┘ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │
│ │ Meta │ │Permission│ │ Cache │ │ Monitor │ │
│ │Manager │ │ Manager │ │Manager │ │ Manager │ │
│ └──────────┘ └──────────┘ └──────────┘ └─────────────┘ │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┴─────────────────────────────────┐
│ Linkis Engine Connector │
│ (Hive/Spark/Flink/HBase/Presto/Elasticsearch/Python) │
└───────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────┴─────────────────────────────────┐
│ Resource Manager (YARN/K8s) │
└───────────────────────────────────────────────────────────┘
2.2 核心模块详解
2.2.1 Linkis Gateway
- 作用:统一入口,路由、负载均衡、认证授权
- 协议支持:REST API、WebSocket、RPC(内部)
- 功能:
- 请求路由分发到对应服务
- 流量控制、限流
- 认证(集成Apache Ranger等)
- 跨域处理
- 日志记录
2.2.2 Engine Connector(引擎连接器)
- 定义:连接Linkis与底层计算引擎的桥梁
- 支持引擎:
- Hive(HiveEngineConnector)
- Spark(SparkEngineConnector)
- Flink(FlinkEngineConnector)
- HBase(HBaseEngineConnector)
- Presto/Trino
- Elasticsearch
- Python(PythonEngineConnector)
- Shell(ShellEngineConnector)
- JDBC(通用关系型数据库)
- 职责:
- 提交作业到对应引擎
- 解析引擎返回结果
- 引擎生命周期管理
- 日志收集
- 可扩展性:实现EngineConnector接口即可支持新引擎
2.2.3 Engine Manager(引擎管理器)
- 功能:
- 管理引擎实例(启动、停止、重启)
- 引擎配置管理(engine.conf)
- 引擎版本管理
- 引擎健康检查
- 引擎类型:
- Shared Engine:共享引擎(多用户共享,隔离性弱,资源利用率高)
- Exclusive Engine:独占引擎(单个用户,隔离性强)
- Session Engine:会话引擎(用户会话级别)
- 引擎创建:按标签、用户、队列等策略
2.2.4 Resource Manager(资源管理器)
- 与YARN/K8s集成:
- YARN:申请Container,管理Application
- K8s:申请Pod,管理Deployment/Job
- Standalone:本地进程
- 资源隔离:
- 标签(Label)隔离:用户、项目、优先级
- 队列(Queue)隔离:YARN队列/K8s namespace
- 并发控制(max Concurrent)
- 资源回收:空闲超时自动回收、手动回收
2.2.5 Job Scheduler(作业调度器)
- 作业提交流程:
- 接收请求 → 2. 权限检查 → 3. 标签匹配 → 4. 资源申请 → 5. 引擎选择 → 6. 作业提交 → 7. 状态回调
- 调度策略:
- FIFO:先到先得
- Fair:公平调度
- Capacity:容量调度
- Priority:优先级调度
- 作业状态:
-Submitted → Running → Succeed/Failed/Killed
2.2.6 Label Manager(标签管理器)
- 标签类型:
- User:用户标签
- System:系统标签
- EngineType:引擎类型
- Engine:引擎实例
- Request:请求标签
- 标签作用:
- 路由引擎(相同标签匹配)
- 资源隔离(标签授权)
- 多租户管理
- 标签配置:linkis.yml中定义,支持动态更新
2.2.7 Metadata Manager(元数据管理器)
- 管理对象:
- 数据源(Database、Table、View)
- 文件(HDFS、S3、OSS路径)
- 计算资源( Engine、Resource)
- 功能:
- 数据源CRUD
- 元数据缓存
- 元数据同步(从Hive Metastore同步)
- 数据权限(列级、行级)
- 后端存储:MySQL(生产级)、Derby(演示)
2.2.8 Permission Manager(权限管理器)
- 权限模型:
- 资源:数据库、表、视图、函数、引擎
- 操作:use、select、insert、update、delete、create、drop、alter、manage
- 权限类型:
- 用户权限(User)
- 用户组权限(UserGroup)
- 继承权限(继承上级)
- 集成:Apache Ranger、Apache Sentry(可选)
- 鉴权流程:检查用户→用户组→资源→操作
2.2.9 Cache Manager(缓存管理器)
- 缓存对象:
- 查询结果(ResultSet Cache):Key=SQL+Params+Engine,TTL可配置
- 元数据(Metadata Cache)
- 认证信息(Auth Cache)
- 缓存策略:LRU、TTL、手动清除
- 存储:Redis、Caffeine、Guava Cache(内存)
- 命中率统计
2.2.10 Monitor Manager(监控管理器)
- 监控维度:
- 引擎:状态、资源使用(CPU/Memory/磁盘)
- 作业:提交数、成功率、耗时、资源消耗
- 用户:提交量、数据下载量
- 系统:Gateway/Manager自身指标
- 数据采集:
- Linkis自身:Metrics(Prometheus format)
- 引擎:YARN Application日志、K8s Pod指标
- 存储:MySQL(历史)、InfluxDB/Prometheus(实时)
- 告警:集成Alertmanager、邮件、钉钉
- 可视化:Grafana Dashboard
2.3 数据流与作业提交流程
1. 用户提交SQL(通过DataStudio/API)
↓
2. Gateway接收请求,认证鉴权
↓
3. Engine Manager根据标签查找可用Engine实例
↓
4. Resource Manager向YARN/K8s申请资源(若无可用引擎)
↓
5. 创建Engine实例,返回地址
↓
6. Job Scheduler提交作业到Engine
↓
7. Engine执行作业(调用Hive/Spark等)
↓
8. 引擎返回执行状态(Running/Succeed/Failed)
↓
9. 结果缓存(若启用)
↓
10. Gateway返回结果给客户端
三、核心功能详解
3.1 多引擎支持
- Hive引擎:MR/Tez/Spark执行引擎配置,支持HiveServer2
- Spark引擎:Standalone/YARN/K8s模式,支持Spark SQL/Spark Thrift Server
- Flink引擎:Batch/Streaming模式,支持SQL
- Python引擎:PySpark/纯Python,支持Jupyter Kernel
- JDBC引擎:通用关系数据库(MySQL/PostgreSQL等)
- Elasticsearch引擎:DSL查询
- HBase引擎:Phoenix SQL/原生API
- 引擎版本管理:支持多版本并存,按需切换
3.2 多租户与资源隔离
- 用户/用户组管理:集成LDAP/AD,或本地管理
- 标签体系:
- 动态标签(用户提交时携带,如priority=high)
- 静态标签(用户固有,如department=fin)
- 资源组/队列:
- YARN队列:容量调度、公平调度
- K8s资源配额:ResourceQuota、LimitRange
- 并发限制:
- 用户级最大并发数
- 引擎级最大并发数
- 队列级并发数
- 资源配额:
- 用户最大可用资源(内存、vCore)
- 队列最大资源
3.3 结果缓存机制
- 缓存Key生成:
- 算法:MD5(SQL + Params + EngineType + EngineLabel + …)
- 可配置是否忽略大小写、空格
- 缓存存储:
- 内存:Caffeine(适合小结果)
- Redis:分布式,结果大小无限制(需配置最大大小)
- 缓存失效:
- TTL过期(默认1小时,可配置)
- 手动清除(API调用)
- 引擎元数据变更自动失效(如表结构变化)
- 缓存命中:直接返回结果,跳过作业提交
- 命中率监控:缓存命中次数、未命中次数
3.4 作业提交方式
3.4.1 REST API(最常用)
POST /api/rest_jars/v1/query/execute
Content-Type: application/json
{
"sessionUser": "user1",
"sessionMax": 10,
"executionEngines": "spark",
"engineLabel": "spark2.4",
"varibles": {
"input": "/path/to/data"
},
"properties": {
"spark.sql.shuffle.partitions": "10"
},
"runMode": "sync", // sync/async
"code": "SELECT * FROM table LIMIT 100"
}
3.4.2 Java/Scala SDK
val linkisManager = new LinkisJobClient("http://linkis-gateway:8991")
val result = linkisManager.execute(
user = "user1",
engineType = "spark",
code = "SELECT COUNT(*) FROM table",
runMode = JobRunMode.SYNC
)
3.4.3 Python SDK
from linkis import LinkisJob
linkis = LinkisJob(gateway_url="http://linkis-gateway:8991")
result = linkis.execute(
user="user1",
engine_type="spark",
code="SELECT * FROM table"
)
3.4.4 JDBC Driver(兼容Hive JDBC)
- 提供Linkis JDBC Driver,应用无需修改代码
- 连接URL:
jdbc:linkis://gateway:8991/spark - 支持Hive JDBC协议
3.5 作业查询与控制API
- 查询作业状态:GET
/api/rest_jars/v1/query/{executionID}/status - 获取作业日志:GET
/api/rest_jars/v1/query/{executionID}/log - 获取作业结果:
- 结果导出(CSV/JSON格式)
- 分页查询(大数据集)
- 杀死作业:POST
/api/rest_jars/v1/query/{executionID}/kill - 取消作业:POST
/api/rest_jars/v1/query/{executionID}/cancel
3.6 元数据管理
- 数据源注册:JDBC URL、Driver、用户名、密码(加密存储)
- 表/视图管理:
- 自动同步Hive Metastore
- 手动注册外部表
- 表注释、字段注释
- 函数管理:UDF注册与权限
- 数据预览:快速预览表数据(LIMIT 100)
3.7 权限控制
- 角色:Admin、User、Guest
- 权限维度:
- 动作:use、select、insert、update、delete、create、drop、manage
- 资源:database、table、view、function、engine
- 授权方式:
- 管理员:
GRANT SELECT ON TABLE db.table TO USER user1 - 用户组继承:
GRANT SELECT ON DATABASE db TO GROUP group1
- 管理员:
- 数据脱敏:列级脱敏(如身份证隐藏中间位)
四、部署与配置
4.1 环境要求
- JDK:1.8+(推荐11)
- Scala:2.11.x(Spark 2.x)、2.12.x(Spark 3.x)
- Hadoop:2.7+(HDFS、YARN)
- MySQL:5.7+(元数据存储)
- Redis:可选(缓存)
- ZooKeeper:可选(引擎注册发现)
4.2 目录结构
linkis/
├── conf/
│ ├── linkis-engine.conf # 引擎配置
│ ├── linkis-env.sh # 环境变量
│ └── log4j.properties # 日志配置
├── lib/ # 依赖jar包
├── logs/ # 运行日志
├── bin/ # 启动脚本
│ ├── start-all.sh # 全部启动
│ ├── stop-all.sh
│ ├── start-gateway.sh
│ ├── start-engineconn.sh
│ └── ...
└── conf/
└── linkis-entry.conf # Gateway入口配置
4.3 配置文件详解
4.3.1 linkis-engine.conf(核心)
# 引擎配置
wds.linkis.engine.name=spark
wds.linkis.engine.type=spark
wds.linkis.engine.version=2.4.7
# 引擎启动配置
wds.linkis.engine.start.type=yarn # yarn/standalone/k8s
wds.linkis.engine.spark.submit.parameters={
"spark.driver.memory":"4g",
"spark.executor.memory":"8g",
"spark.executor.instances":"2"
}
# 资源标签
wds.linkis.engine.label=spark2.4,highmem
# 引擎并发数
wds.linkis.engine.max.concurrent=10
# 引擎空闲回收时间(分钟)
wds.linkis.engine.idle.timeout=30
# 日志存储路径
wds.linkis.engine.log.path=hdfs:///tmp/linkis-logs
4.3.2 linkis-gateway.conf
# Gateway监听端口
wds.linkis.gateway.port=8991
# 认证方式(默认为simple,可换f2c、ldap)
wds.linkis.gateway.auth.type=simple
# 允许的CORS源
wds.linkis.gateway.cors.allowed.origins=*
# 限流配置
wds.linkis.gateway.rate.limit=1000 # 每秒请求数
4.3.3 application.yml(Spring配置,新版)
server:
port: 8991
spring:
datasource:
url: jdbc:mysql://localhost:3306/linkis?useUnicode=true&characterEncoding=utf-8
username: root
password: linkis123
driver-class-name: com.mysql.jdbc.Driver
linkis:
gateway:
ip: 0.0.0.0
port: 8991
engine:
default:
engineType: spark
engineVersion: 2.4.7
label: spark24
4.4 部署模式
4.4.1 伪分布式(单机)
- 所有服务(Gateway、Engine Manager、Job Scheduler等)部署在同一节点
- 适合:测试、开发环境
- 启动:
bin/start-all.sh
4.4.2 分布式部署
- 组件分离:
- Gateway:独立部署,负载均衡前放Nginx
- Engine Manager:独立,HA部署(Active-Standby)
- Job Scheduler:独立
- Label Manager:独立
- Metadata Manager:独立
- Permission Manager:独立
- Monitor Manager:独立
- 数据库:MySQL主从,高可用
- 缓存:Redis集群
- 资源管理:YARN集群(多NodeManager)或K8s集群
4.4.3 HA高可用部署
- 服务层面:
- 关键服务(Gateway、Engine Manager)双机热备,VIP漂移
- 使用Keepalived或云LB
- 数据层面:
- MySQL主从复制,读写分离
- Redis主从或集群
- 引擎层面:
- 引擎实例本身由YARN/K8s保证高可用
- 多标签分发到不同机器
4.5 引擎安装与配置
4.5.1 Spark引擎安装
- 前提:Spark已安装在集群(/opt/spark-2.4.7-bin-hadoop2.7)
- 配置:
conf/spark-defaults.confspark.eventLog.enabled true spark.eventLog.dir hdfs:///spark-logs spark.history.fs.logDirectory hdfs:///spark-logs - Linkis引擎配置:
- 引擎类型:spark
- Spark Home:
export SPARK_HOME=/opt/spark-2.4.7-bin-hadoop2.7 - 提交参数:
spark-submit --master yarn --deploy-mode cluster
- 测试:提交简单SQL验证
4.5.2 Hive引擎安装
- 前提:Hive已安装,HiveServer2运行
- 配置:
- Hive JDBC URL:
jdbc:hive2://hs2-host:10000/default - Hive配置目录:
/etc/hive/conf
- Hive JDBC URL:
- Linkis引擎配置:
- 引擎类型:hive
- 使用HiveServer2模式(推荐)或直接命令行
五、核心API接口
5.1 作业执行API
- 同步执行:
POST /api/rest_jars/v1/query/execute- 阻塞直到作业完成,返回结果
- 适合小查询、交互场景
- 异步执行:
POST /api/rest_jars/v1/query/executeAsync- 立即返回executionID,后续轮询状态
- 适合长作业、批量任务
- 查询状态:
GET /api/rest_jars/v1/query/{executionID}/status- 返回:Running/Succeeded/Failed/Cancelled/Killed
- 杀死作业:
POST /api/rest_jars/v1/query/{executionID}/kill - 获取日志:
GET /api/rest_jars/v1/query/{executionID}/log?page=1&size=100 - 获取结果:
GET /api/rest_jars/v1/query/{executionID}/result(全部)GET /api/rest_jars/v1/query/{executionID}/result?page={n}&size={m}(分页)
- 导出结果:
GET /api/rest_jars/v1/query/{executionID}/export?format=csv
5.2 元数据API
- 查询数据库:
GET /api/rest_jars/v1/databases - 查询表:
GET /api/rest_jars/v1/tables?database={db} - 查询表结构:
GET /api/rest_jars/v1/table/{database}/{table}/schema - 预览数据:
GET /api/rest_jars/v1/table/{database}/{table}/preview?limit=100 - 查询函数:
GET /api/rest_jars/v1/functions?database={db}
5.3 引擎管理API
- 查询引擎列表:
GET /api/rest_jars/v1/engines - 查询引擎状态:
GET /api/rest_jars/v1/engine/{engineInstance}/status - 杀死引擎:
POST /api/rest_jars/v1/engine/{engineInstance}/kill - 引擎日志:
GET /api/rest_jars/v1/engine/{engineInstance}/log
5.4 用户与权限API
- 查询用户信息:
GET /api/rest_jars/v1/users - 查询用户权限:
GET /api/rest_jars/v1/permissions/user/{user} - 授权:
POST /api/rest_jars/v1/permissions/grant - 回收权限:
POST /api/rest_jars/v1/permissions/revoke
六、应用层集成
6.1 DataStudio(Web IDE)
- 功能:SQL编辑、作业提交、结果展示、数据可视化
- 架构:前端(Vue/React) + 后端(调用Linkis API)
- 核心页面:
- 工作空间(Workspace):SQL编辑器、变量设置
- 作业历史(Job History):查看历史作业、日志、结果
- 数据地图(Data Map):浏览数据库、表、字段
- 作业监控(Monitor):实时监控运行中作业
- 数据预览(Preview):快速预览表数据
6.2 Jupyter Notebook(Zeppelin/Linkis Notebook)
- Kernel:Linkis提供Jupyter Kernel,底层调用Linkis API
- Notebook功能:
- 多语言:Spark SQL、PySpark、Scala、Python
- 图表展示(matplotlib、echarts)
- 变量共享(%spark.sql、%spark.python)
- 协作编辑
6.3 DolphinScheduler(任务调度)
- Linkis作为计算引擎:DolphinScheduler任务节点调用Linkis API提交SQL
- 优势:DolphinScheduler负责任务依赖调度,Linkis负责计算资源管理
- 集成方式:自定义DolphinScheduler任务类型(LinkisTask)
6.4 Azkaban(任务调度)
- Linkis作为Hive/Spark替代:Azkaban的Hive/Spark Job改为调用Linkis API
- 优势:统一资源管理,避免Azkaban直接提交YARN的资源竞争
6.5 自定义应用集成
- 方案1:直接调用Linkis REST API(最灵活)
- 方案2:使用Java SDK(更类型安全)
- 方案3:使用JDBC Driver(兼容现有代码)
七、性能优化与调优
7.1 Linkis自身性能优化
- Gateway:
- 调大线程池(tomcat max threads)
- 启用HTTP/2
- 静态资源缓存
- Engine Manager:
- 引擎池预热(提前启动常用引擎)
- 引擎回收策略调优(idle timeout)
- 并发创建引擎控制
- Job Scheduler:
- 队列策略选择(FIFO/Fair)
- 作业优先级配置
- 缓存:
- Redis缓存结果(大数据集不适合)
- 调整缓存TTL、最大条目数
- 启用元数据缓存
- 数据库:
- 索引优化(linkis元数据库)
- 历史数据归档(分表)
- 读写分离
7.2 引擎执行优化
- Spark作业优化:
- 动态资源分配(spark.dynamicAllocation.enabled)
- 内存配置(driver/executor memory,off-heap)
- Shuffle优化(spark.shuffle.file.buffer、spark.reducer.maxSizeInFlight)
- 并行度调整(spark.default.parallelism、spark.sql.shuffle.partitions)
- 数据倾斜处理(skew join、salting)
- Hive作业优化:
- 执行引擎选择(Tez > Spark > MR)
- 向量化查询( hive.vectorized.execution.enabled)
- 分桶、压缩(ORC/Parquet)
- Tez容器内存配置
- 通用优化:
- 预处理小表广播(broadcast join)
- 数据过滤下推(predicate pushdown)
- 列裁剪(column pruning)
- 压缩中间结果(snappy/lz4)
7.3 网络与存储优化
- YARN配置:
- yarn.nodemanager.resource.memory-mb / vcores
- yarn.scheduler.maximum-allocation-mb / vcores
- yarn.scheduler.minimum-allocation-mb / vcores
- HDFS优化:
- 块大小(128MB/256MB)
- 副本数(生产3)
- 机架感知
- K8s优化:
- 资源requests/limits设置合理
- 使用优先级(PriorityClass)
- 存储卷性能(SSD vs HDD)
八、监控与告警
8.1 监控指标
- Linkis服务:
- QPS、响应时间(P50/P90/P99)
- 错误率(5xx、4xx)
- 引擎创建数、销毁数
- 作业提交数、成功率、失败率
- 缓存命中率
- 活跃引擎数
- 引擎资源:
- YARN Application状态、资源使用(memory、vcore)
- Spark Executor数量、运行时间
- K8s Pod状态、资源使用
- 系统资源:
- CPU使用率、负载
- 内存使用、swap
- 磁盘I/O、空间
- 网络带宽
8.2 监控工具与集成
- Prometheus + Grafana:
- Linkis提供Prometheus Exporter(/metrics端点)
- 导入Grafana Dashboard(官方提供JSON)
- ELK:收集Linkis日志,集中分析
- 告警:
- Prometheus Alertmanager → 邮件/钉钉/企业微信
- 阈值:作业失败率 > 5%、Gateway错误率 > 1%、引擎不足等
8.3 日志管理
- 日志级别:INFO(生产)、DEBUG(调试)
- 日志存储:
- 本地:/tmp/linkis-logs/
- HDFS:hdfs:///tmp/linkis-logs/(推荐,便于集中)
- 结构化:JSON格式,便于解析
- 日志包含:请求ID(traceId)、用户、引擎、SQL、资源消耗
九、故障排查与运维
9.1 常见问题与解决方案
9.1.1 作业提交失败
- 现象:返回错误"Failed to create engine"
- 原因:
- YARN资源不足
- 引擎配置错误(spark-submit参数)
- Label匹配不到引擎
- 引擎启动权限问题
- 排查:
- 查看YARN ResourceManager UI,确认资源
- 查看Linkis日志(EngineManager.log)
- 检查engine.conf配置
- 手动测试
spark-submit --master yarn是否成功
9.1.2 作业运行缓慢
- 排查:
- Spark UI:查看Stage、Task耗时,Shuffle溢出
- YARN Application UI:容器资源使用(CPU、内存)
- Linkis监控:引擎并发数、队列等待
- SQL优化:执行计划、数据倾斜
- 解决:
- 增加executor数量、executor内存
- 调整并行度
- 数据倾斜处理(加盐、广播小表)
- 优化SQL(避免全表扫描)
9.1.3 引擎频繁重启
- 原因:
- 引擎空闲超时设置过短(idle.timeout)
- 资源被YARN回收(container expiration)
- OOM Killer杀死
- 解决:
- 调大idle.timeout
- 调整YARN
yarn.resourcemanager.am.max-attempts - 检查YARN日志,确认Container是否被回收
9.1.4 权限错误
- 现象:
Access denied: Table not found - 原因:用户没有表权限,或元数据不同步
- 解决:
- 管理员通过API授权:
GRANT SELECT ON db.table TO user1 - 手动刷新元数据缓存:
刷新元数据中心 - 检查Metadata Manager与Hive Metastore同步状态
- 管理员通过API授权:
9.1.5 大结果集返回慢或OOM
- 原因:结果缓存到内存,结果集过大
- 解决:
- 关闭缓存:
spark.sql.inMemoryColumnarStorage.compressed=false - 分页查询:使用
page和size参数 - 导出到文件,而非返回内存
- 关闭缓存:
9.1.6 时间不一致
- 现象:作业提交时间与Spark UI显示时间差较大
- 原因:Gateway、Engine、YARN节点时间不同步
- 解决:NTP时间同步
9.2 运维检查清单
- 每日检查:
- Linkis服务状态(systemctl status)
- MySQL连接数、慢查询
- Redis内存使用
- YARN/Spark作业堆积
- 每周检查:
- 链接数增长(用户数、作业数)
- 磁盘空间(日志目录)
- 审计日志(异常访问)
- 每月检查:
- 元数据表大小(archives)
- 缓存命中率
- 升级评估
十、二次开发与扩展
10.1 扩展新引擎
步骤:
- 继承
EngineConnector(或BaseEngineConnector) - 实现核心方法:
beforeSubmitJob():作业提交前处理submitJob():提交到引擎(返回JobID)getJobStatus():查询作业状态getLog():获取日志getResult():获取结果killJob():杀死作业
- 实现
EngineConnLoader(SPI加载) - 配置
engine.conf - 重启Engine Manager
示例:添加Presto引擎
public class PrestoEngineConnector extends BaseEngineConnector {
@Override
public String submitJob(EngineJob engineJob) {
String sql = engineJob.getJobContent();
String queryId = prestoClient.execute(sql);
return queryId;
}
// ... 其他方法
}
10.2 自定义调度器
- 继承
JobScheduler接口 - 实现调度逻辑(如:优先调度VIP用户)
- 配置
wds.linkis.schedule.impl=your.package.CustomScheduler
10.3 自定义权限模型
- 实现
PermissionProvider接口 - 集成公司AD/LDAP
- 实现数据行级权限(Row Level Security)
10.4 结果插件
- 自定义结果解析器(
ResultConvert接口) - 支持特殊格式导出(Excel、PDF)
- 数据脱敏结果过滤器
10.5 审计插件
- 实现
AuditPlugin接口 - 记录用户操作(谁、何时、做了什么)
- 发送审计日志到SIEM系统(Splunk、Elastic)
十一、生产环境最佳实践
11.1 容量规划
- 引擎数量:
- 每台机器可运行2-4个Spark引擎(根据内存)
- 备用20%容量应对突发
- Gateway:
- 建议2台以上,负载均衡(Nginx)
- 机器配置:4C8G+
- DB:
- MySQL主从,16C32G+,SSD
- 预留连接数:200+
- YARN:
- NodeManager数量:根据集群规模
- 总资源:估算峰值并发 × 单作业资源
11.2 安全加固
- 认证:集成LDAP/AD,禁用simple
- 传输加密:HTTPS(SSL证书)
- 数据脱敏:敏感列(手机号、身份证)权限控制
- 审计:记录所有查询SQL、用户、时间
- 网络隔离:Linkis集群在内网,通过Gateway暴露API
11.3 灾备与高可用
- 服务层:Gateway、EngineManager双机+VIP
- 数据层:MySQL主从、Redis主从
- 引擎层:YARN/K8s本身高可用
- 备份:每日备份元数据库(mysqldump)
- 恢复演练:定期演练主备切换
11.4 成本优化
- 引擎空闲回收:设置合理的idle.timeout(30-60分钟)
- 资源标签:区分生产/测试环境,测试环境低优先级
- 缓存热点数据:减少重复计算
- YARN队列:设置容量限制,避免单个用户占用全部资源
十二、与周边生态集成
12.1 Apache Ranger
- 集成目的:集中权限管理
- 集成方式:Linkis插件模式,实现
RangerPlugin - 策略同步:Ranger中配置Hive/Spark策略,Linkis读取
- 审计同步:Linkis操作审计发送到Ranger Admin
12.2 Apache Atlas
- 集成目的:数据血缘、元数据统一管理
- 集成方式:Linkis Metadata Manager与Atlas同步
- 同步内容:表、列、作业、血缘关系
12.3 时序数据库(InfluxDB/TDengine)
- 监控数据存储:Linkis Monitor写入时序数据库
- 优势:高写入、时间范围查询快
12.4 ELK
- 日志收集:Filebeat收集Linkis日志到Elasticsearch
- 分析:Kibana可视化,查询错误日志
- 告警:ElastAlert基于日志模式告警
12.5 消息队列(Kafka)
- 事件通知:作业完成事件发送到Kafka,下游系统消费
- 审计日志:审计日志异步发送到Kafka,减少主链路延迟
十三、性能对比与选型
13.1 Linkis vs 直接提交YARN/Spark
| 维度 | 直接提交 | Linkis |
|---|---|---|
| 资源复用 | 低(每次new Application) | 高(引擎复用) |
| 隔离性 | 差 | 好(标签+队列) |
| 权限控制 | 依赖Hive/Spark自身 | 细粒度(表/列级) |
| 结果缓存 | 无 | 支持 |
| 监控 | 分散 | 统一 |
| 多租户 | 困难 | 内置支持 |
| 开发成本 | 低 | 需部署Linkis |
13.2 Linkis vs Presto/Trino
- 定位差异:Linkis是中间件,Presto是查询引擎
- 可共存:Linkis包含Presto引擎,上层应用无感知
13.3 Linkis vs AWS EMR/Databricks
- 自建 vs 托管:Linkis自建,成本可控;EMR/Databricks托管省心但贵
- 灵活度:Linkis可定制,深度集成内部系统
- 功能:Linkis专注服务层,EMR/Databricks是全栈
十四、社区与生态
14.1 Apache Linkis项目
- 官网:https://linkis.apache.org
- GitHub:https://github.com/apache/linkis
- 邮件列表:dev@linkis.apache.org
- JIRA:https://issues.apache.org/jira/projects/LINKIS
14.2 版本发布
- 0.9.x:稳定版本
- 1.0.0+:重构版本,模块更清晰
- Release Notes:关注Breaking Change
14.3 贡献指南
- 新手任务:Good First Issue
- 代码规范:遵循Apache编码规范
- 测试:单元测试+集成测试
- CLA:签署Apache贡献者许可协议
14.4 部署案例
- 腾讯:TDMQ、数据平台(TDP)
- 工商银行:大数据服务层
- 京东数科:数据中台
- 中国移动:磐基平台
- Netflix:开源社区贡献
十五、未来发展趋势
15.1 云原生
- K8s作为第一类资源管理器:减少对YARN依赖
- Operator部署:Linkis Operator一键部署
- Serverless引擎:按需启停,按量计费
15.2 AI集成
- Notebook集成:增强Jupyter Kernel,支持AI模型训练
- MLflow集成:模型注册、版本管理
- 特征工程服务化:Linkis提供特征计算API
15.3 实时化
- 流式引擎:Flink引擎优化,支持实时查询
- 流批一体:同一套API处理批量和流式
15.4 低代码/No Code
- SQL可视化:拖拽生成SQL,自动路由到Linkis
- 数据地图:智能推荐关联表
15.5 多模态计算
- 存储引擎:接口支持对象存储(S3、OSS)
- 计算引擎:GPU调度(AI训练任务)
十六、常见问题FAQ
Q1: Linkis适合多大的数据量?
A: 适合TB~PB级,底层依赖HDFS/Hive,规模无上限,Linkis只是中间层。
Q2: Linkis能替代HiveServer2/Spark Thrift Server吗?
A: 能,且功能更强(多租户、缓存、监控等),但引入额外组件复杂度。
Q3: Linkis的延迟如何?
A: 同步查询:P99 < 2s(小查询);异步提交:毫秒级。引擎启动时间取决于YARN(~30s)。
Q4: Linkis有单点故障吗?
A: Gateway、Engine Manager单点,建议HA部署。元数据DB、缓存需高可用。
Q5: Linkis支持Kerberos认证吗?
A: 支持,可通过Ranger集成Kerberos,或配置Hadoop安全模式。
Q6: 如何对接现有数据平台?
A: 本文档见DataStudio集成章节,或直接调用REST API。Key是统一数据源和权限。
Q7: Linkis与数据湖(Delta Lake/Hudi/Iceberg)兼容吗?
A: 兼容,底层Spark/Flink支持即可,Linkis无感知。
Q8: Linkis支持跨集群访问吗?
A: 支持。可配置多个集群,通过标签路由。或使用HDFS Federation。
Q9: 如何做数据治理?
A: 结合Apache Atlas做血缘,Ranger做权限,Linkis提供执行入口。
Q10: Linkis与Apache Spark比,性能有损失吗?
A: 几乎无损失。Linkis只是路由层,作业由Spark执行,性能相同。
十七、总结
Apache Linkis作为大数据服务层中间件,核心解决:
- 复用:引擎复用,避免每次启动开销
- 隔离:多租户、标签、队列
- 治理:权限、监控、审计、缓存
- 统一:屏蔽底层引擎差异,统一API
适用场景:
- 企业数据中台、数据服务平台
- 交互式分析(DataStudio/Notebook后端)
- 任务调度系统(DolphinScheduler/Azkaban)的底层计算引擎
- AI平台(训练任务提交、特征提取)
不适用场景:
- 简单小规模集群(少于5个用户)
- 仅批处理,无交互需求
- 对延迟极其敏感(<100ms)
学习路径建议:
- 入门:部署伪分布式,熟悉API
- 进阶:分布式部署,集成DataStudio
- 高级:二次开发(自定义引擎、调度器)
- 专家:源码阅读(Gateway、EngineManager)、性能调优
文档版本:v1.0
最后更新:2025年3月
评论区