一.MaxCompute 整体架构
1.四层核心架构
| 1. 客户端 (Client) | 用户交互入口 | – odpscmd:命令行工具 – DataWorks:可视化开发运维平台 – SDK:Java/Python 等语言的编程接口 – Tunnel:用于批量上传下载数据 |
odpscmd 默认不进入任何项目,必须手动执行 use <project_name>; 才能操作指定项目。 |
| 2. 接入层 (Access Layer) | 请求网关 | – 接收所有客户端请求 – 负责用户身份认证(通过 AccessKey ID/Secret) – 将认证后的请求(含 AccountID)转发给逻辑层 |
认证过程涉及 HTTP Server 和 云账号服务。 |
| 3. 逻辑层 (Logic Layer) | 大脑中枢 | – SQL 解析器 & 优化器:将 SQL 转为执行计划,并做列裁剪、分区裁剪、谓词下推等优化 – Scheduler (调度器):对等待提交的 Task 进行排序和调度 – 元数据管理:管理表、分区、用户、权限等信息 |
Scheduler 是负责 Task 调度的核心模块。 |
| 4. 存储与计算层 | 身体与肌肉 | – 存储:基于 盘古 (Pangu) 分布式文件系统,使用自研列式存储格式 (CFile) – 计算:由 伏羲 (Fuxi) 分布式调度系统管理 Worker 节点,执行 M/R/J/L 等任务 |
飞天内核三件套: – 伏羲 (Fuxi):调度 – 盘古 (Pangu):存储 – 女娲 (Nuwa):协调 |
【易错点】:大禹 (Dayu) 是 DDoS 防护服务,不属于飞天内核。
2.任务执行流程
[Client]
↓ (提交SQL)
[Access Layer] → (认证鉴权)
↓
[Logic Layer] → (解析SQL → 生成逻辑计划 → 优化 → 拆分为Task → Scheduler调度)
↓
[Storage & Compute Layer] → (Fuxi分配Worker → 从Pangu读数据 → 执行计算 → 写回Pangu)
↓
[Client] ← (返回结果或Job状态)
二.MaxCompute SQL 核心语法与限制
1. 表与分区管理
| 创建分区表 | CREATE TABLE t1 (id BIGINT, name STRING) PARTITIONED BY (dt STRING); | 分区列不能是 DOUBLE/FLOAT 类型。 |
| 动态分区插入 | INSERT OVERWRITE TABLE t1 PARTITION (dt) SELECT col1, col2, dt FROM src; | 分区列 dt 必须在 SELECT 列表的最后。 |
| 生命周期 | ALTER TABLE t1 SET LIFECYCLE 30; | 未设置则永久保存;生命周期作用于表和所有分区。 |
| 清空数据 | TRUNCATE TABLE t1; (非分区表) ALTER TABLE t1 DROP PARTITION (dt='20240520'); (分区表) |
MaxCompute 不支持 DELETE 语句。 |
| 建表保护 | CREATE TABLE IF NOT EXISTS t1 … | 如果 t1 已存在,后续的 AS SELECT … 不会执行。 |
2.关键函数与特性
| 数值函数 | FLOOR(x):向下取整 CEIL(x) / CEILING(x):向上取整 |
FLOOR(3.7)=3 CEIL(-2.3)=-2 |
必考基础函数。 |
| 字符串函数 | CONCAT(str1, str2, …) | CONCAT('a', NULL) = NULL | 只要有一个参数为 NULL,结果就是 NULL。 |
| MAPJOIN | 将小表加载到内存进行 Join | /*+ MAPJOIN(b) */ SELECT a.id FROM a JOIN b ON a.id=b.id; | – 小表总内存 ≤ 512MB – 不支持 FULL OUTER JOIN – 支持子查询,但必须用别名 |
| Multi-Insert | 一条 SQL 写入多个目标 | FROM src INSERT INTO t1 SELECT … INSERT INTO t2 SELECT … | 单条语句最多 255 路输出。 |
3.一些限制
| SQL 长度 | 单条 SQL 语句最大长度为 2 MB。 | – |
| 查询结果 | 直接 SELECT 屏显最多返回 10,000 行 或 10 MB 数据。 | 作为子查询时无此限制。 |
| 关键字 | like, order, group 等是关键字,不能直接用作字段名。 | 如需使用,必须用反引号 `like` 包裹。 |
三.MaxCompute 权限与安全模型
1.四大安全机制对比
| ACL (访问控制列表) | 最基础的对象级授权 | GRANT SELECT ON TABLE t1 TO USER alice; | 不支持黑名单授权 不支持带条件的授权 |
| LabelSecurity (标签安全) | 强制访问控制 (MAC),基于数据敏感度分级 | SET LABEL 2 TO TABLE t1(key); GRANT LABEL 2 TO USER alice; |
需要显式开启,比 ACL 更严格。 |
| ProjectProtection (项目保护) | 防止数据流出当前项目 | SET PROJECTPROTECTION = TRUE; ADD PRIVILEGE EXCEPTION …; |
开启后,禁止任何数据流出,除非添加例外。 |
| SecurityConfiguration | 统一的安全配置开关 | SHOW SECURITY CONFIGURATION; | 控制上述所有安全机制的总开关。 |
2. 跨项目资源共享
方式:通过 Package。
默认权限:Read, Describe, Select。
【常考点】:不是“读写权限”!如果需要写权限(如 Update, Drop),必须显式授予。
. Admin 角色
权限:非常广泛,可访问所有对象、管理用户和角色。
【易错点】:Admin 不能:
修改项目的 安全配置 (SecurityConfiguration)。
修改项目的 鉴权模型。
将 Admin 权限授予其他用户。
四.DataWorks 调度机制
1.任务类型与依赖关系
| 节点任务 (独立节点) | ✅ 是 | ✅ 是 | ✅ 可以 | 最常见的任务形式。 |
| 工作流任务 (Workflow) | ❌ 否 | ❌ 否 | ❌ 不能 | 工作流本身只是一个容器,不可调度。 |
| 工作流内部节点 | ✅ 是 | ✅ 是 | ❌ 不能 | 继承工作流的调度周期,自身无法单独设置。 |
2.关键时间参数
| $ {bdp.system.bizdate} | 业务日期 | yyyymmdd | 20260126 | = 调度日期 – 1 天,最常用! |
| $ {bdp.system.cyctime} | 调度时间 | yyyymmddhh24miss | 20260127000000 | 任务计划运行的时间戳。 |
3.重跑机制
| 重跑 | 仅重跑当前任务 | 处理出错或漏跑的单个节点 | 成功后会自动触发下游未运行的任务。 |
| 重跑下游 | 重跑当前任务及其勾选的下游任务 | 数据修复,确保整个链路数据一致性 | 可以自定义勾选下游范围。 |




