侧边栏壁纸
博主头像
毕业帮 博主等级

提供丰富的资源和服务,涵盖从论文写作、毕业设计、职业规划、就业准备等多个方面

  • 累计撰写 81 篇文章
  • 累计创建 18 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

Apache Linkis 全面技术大纲

流苏
2026-03-11 / 0 评论 / 0 点赞 / 5 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

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(作业调度器)

  • 作业提交流程
    1. 接收请求 → 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.conf
    spark.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
  • 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匹配不到引擎
    • 引擎启动权限问题
  • 排查
    1. 查看YARN ResourceManager UI,确认资源
    2. 查看Linkis日志(EngineManager.log)
    3. 检查engine.conf配置
    4. 手动测试 spark-submit --master yarn是否成功

9.1.2 作业运行缓慢

  • 排查
    1. Spark UI:查看Stage、Task耗时,Shuffle溢出
    2. YARN Application UI:容器资源使用(CPU、内存)
    3. Linkis监控:引擎并发数、队列等待
    4. 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同步状态

9.1.5 大结果集返回慢或OOM

  • 原因:结果缓存到内存,结果集过大
  • 解决
    • 关闭缓存:spark.sql.inMemoryColumnarStorage.compressed=false
    • 分页查询:使用 pagesize参数
    • 导出到文件,而非返回内存

9.1.6 时间不一致

  • 现象:作业提交时间与Spark UI显示时间差较大
  • 原因:Gateway、Engine、YARN节点时间不同步
  • 解决:NTP时间同步

9.2 运维检查清单

  • 每日检查
    • Linkis服务状态(systemctl status)
    • MySQL连接数、慢查询
    • Redis内存使用
    • YARN/Spark作业堆积
  • 每周检查
    • 链接数增长(用户数、作业数)
    • 磁盘空间(日志目录)
    • 审计日志(异常访问)
  • 每月检查
    • 元数据表大小(archives)
    • 缓存命中率
    • 升级评估

十、二次开发与扩展

10.1 扩展新引擎

步骤

  1. 继承 EngineConnector(或 BaseEngineConnector
  2. 实现核心方法:
    • beforeSubmitJob():作业提交前处理
    • submitJob():提交到引擎(返回JobID)
    • getJobStatus():查询作业状态
    • getLog():获取日志
    • getResult():获取结果
    • killJob():杀死作业
  3. 实现 EngineConnLoader(SPI加载)
  4. 配置 engine.conf
  5. 重启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作为大数据服务层中间件,核心解决:

  1. 复用:引擎复用,避免每次启动开销
  2. 隔离:多租户、标签、队列
  3. 治理:权限、监控、审计、缓存
  4. 统一:屏蔽底层引擎差异,统一API

适用场景

  • 企业数据中台、数据服务平台
  • 交互式分析(DataStudio/Notebook后端)
  • 任务调度系统(DolphinScheduler/Azkaban)的底层计算引擎
  • AI平台(训练任务提交、特征提取)

不适用场景

  • 简单小规模集群(少于5个用户)
  • 仅批处理,无交互需求
  • 对延迟极其敏感(<100ms)

学习路径建议

  1. 入门:部署伪分布式,熟悉API
  2. 进阶:分布式部署,集成DataStudio
  3. 高级:二次开发(自定义引擎、调度器)
  4. 专家:源码阅读(Gateway、EngineManager)、性能调优

文档版本:v1.0
最后更新:2025年3月

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区