基本概念
- Project:项目,MaxCompute的基本组织单元。
- Table:表,分为内部表(数据存储在MaxCompute)和外部表(数据不存储在MaxCompute)。
- Function:函数,包括内建函数和UDF。
- Instance:实例,SQL、Spark和MapReduce任务再执行时都会被实例化。
- Resources:资源,使用UDF和MapReduce需要依赖资源,资源类型:
- File类型:文件
- Table类型:MaxCompute的表
- Jar类型:java jar包
- Archive类型:通过资源名称中的后缀识别压缩类型,支持的压缩文件类型包括.zip/.tgz/.tar.gz/.tar/jar。
- Partition:分区,可以看做表的一个目录,可以有多级分区。
- Lifecycle:生命周期,只能再表级别设置生命周期。
- Task:任务,MaxCompute的基本计算单元。
- MaxCompute的ACID特性:
- Atomicity:原子性,冲突时只会有一个作业成功,跨表操作时不支持原子性。
- Consistency:一致性,OVERWRITE类作业可保证一致性。
- Isolation:隔离性,非INTO类操作保证读已提交。
- Durability:持久性,MaxCompute保证数据的持久性。
- Endpoint:端点,连接MaxCompute需要配置Endpoint。
数据通道
- 历史数据通道:Tunnel,离线数据上传下载服务。
- 分区表的上传下载一定要指定分区,多级分区一定要指定到末级分区;
- 将本地文件的数据上传至MaxCompute的表中,以追加模式导入;
- 目前Tunnel仅支持表(不包括视图View)数据的上传下载;
- 支持上传的单个资源大小上限为500MB;
- 支持upload、download、resume、show、purge、help;
- 命令参数
- -bs,--block-size:每次上传至Tunnel的数据块大小,默认值:100MiB (MiB=1024*1024B );
- -dbr:是否忽略脏数据(多列,少列,列数据类型不匹配等情况)。值为’true’时,将全部不符合表定义的数据忽略。值为’false’,若遇到脏数据,则给出错误提示信息,目标表内的原始数据不会被污染;
- -s:是否扫描本地数据文件,默认值为’false’。值为’true’时,先扫描数据,若数据格式正确,再导入数据。值为’false’,不扫描数据,直接进行数据导入。值为’only’时,仅进行扫描本地数据,扫描结束后不继续导入数据;
- -ni:NULL数据标志符,默认为" "(空字符串);
- -mbr,--max-bad-records:默认情况下,当上传的脏数据超过1000条时,上传动作终止。通过此参数,可以调整可容忍的脏数据量;
- -h: 数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始上传数据;
- -tz:指定时区。默认为本地时区:Asia/Shanghai
- -te:指定tunnel的Endpoint;
- -e: 指定odps的endpoint;
- -rd:本地数据文件的行分割符,默认为’\r\n’;
- -fd:本地数据文件的列分割符,默认为逗号’,’,列分隔符不能够包含行分隔符;
- -dfp:DateTime类型数据格式,默认为’yyyy-MM-dd HH:mm:ss’;
- -cp,--compress:指定是否在本地压缩后再上传,减少网络流量,默认开启;
- -c,--charset:指定本地数据文件编码,默认为’UTF-8’;不设定,默认下载源数据;
- 实时增量数据通道:使用DataHub服务实现增量数据导入。
- OGG插件
- Flume插件
- LogStash插件
- Fluentd插件
连接地址
- 阿里云内网地址
- ODPS地址:http://odps-ext.aliyun-inc.com/api
- Tunnel地址:http://dt-ext.odps.aliyun-inc.com
- 阿里云外网地址
- ODPS地址:http://service.odps.aliyun.com/api
- Tunnel地址:http://dt.odps.aliyun.com
任务Task
- Task任务是ODPS的基本计算单元,包括以下任务类型:
- SQL:MaxCompute提供sql查询功能以及内置函数处理查询数据;
- UDF:用户自定函数,包括UDSF、UDTF、UDAF;
- MapReduce:MaxCompute提供的Java MapReduce编程模型;
- Graph:面向迭代的图计算处理框架;
- Spark on MaxCompute:大数据分析引擎。
- 任务提交后,将会在第二天23:30自动生成实例来运行任务。如果是在23:30以后提交的任务,则第三天才会开始生成实例来自动运行任务。
- 重跑并恢复调度:可以重跑某任务,任务执行成功后可以触发下游未运行状态任务的调度。常用于处理出错节点和漏跑节点。仅支持重跑未运行、成功和失败状态的任务。
- 规则
- 周期性调度任务在配置依赖属性时,上游任务可以是不同项目空间的任务;
- 仅等待运行、运行中状态的实例可以进行终止运行的操作,进行此操作后,该实例将为失败状态;
项目空间
- 是MaxCompute的基本组织单元,一个用户可以同时拥有多个项目空间的权限,通过安全授权,可以在一个项目空间中访问另一个项目空间中的对象,例如表(Table)、资源(Resource)、函数(Function)和实例(Instance)。
- MaxCompute的表格有两种类型:内部表和外部表(表格的数据可以存放在OSS或OTS中 。MaxCompute仅会记录表格的Meta信息,您可以通过MaxCompute的外部表机制处理OSS或OTS上的非结构化数据)。
- ODPS中一个用户最多可以创建10个项目空间。
- 通过安全授权,可以在一个项目空间中访问另一个项目空间中的数据。
- 一旦ODPS项目空间保护打开(set sercurity.ProjectProtection=true),无法将项目空间内的数据转移到项目空间之外,所有的数据都只能在项目空间内流动。
MapReduce
- 应用场景
- 搜索:网页爬取、倒排索引、PageRank;
- Web访问日志分析;
- 文本统计分析;
- 海量数据挖掘;
- 机器学习;
- 自然语言处理;
- 广告推荐。
- 处理流程
- 输入数据
- 在正式执行前,需要将输入的数据进行分片;
- 分片完毕后,多个Map Worker便可以同时工作,处理数据;
- 输入只能是表,不支持视图(View)作为输入,可以为空;
- 接受多表输入,且输入表的Schema可以不同。
-
- Map阶段
- 每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce;
- Map Worker在输出数据时,需要根据哈希函数为每一条输出数据指定一个Key;
- Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据;
- Map阶段是必须的,可以没有Reduce,但不能没有Map;
-
- Shuffle(洗牌)阶段
- 在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻;
- 如果指定了合并操作(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合;
- Combiner的输入、输出的参数必须与Reduce保持一致,继承的是同一个接口;
- 合并操作非必须。
-
- Reduc阶段
- 每个Reduce Worker会对Key相同的多个数据进行Reduce操作,一个Key的多条数据经过Reduce的作用后,将变成一个值;
- 支持在一个Map后连续多个reduce;
- Reduce接受多路输出,可以输出到不同表,或者同一张表的不同分区;
-
- 输出结果数据
- MR2支持一次map多次reduce,hadoop chain支持多次map一次reduce。
- 对于 MapRedcuce 作业,使用 Combiner 是一种常见的长尾优化策略。当 Map 输出数据后,框架会在 Map 端对相同 key 值的数据进行本地的归并操作。
- 单个Job默认Reduce Instance个数为Map Instance个数的1/4,可以通过setNumReduceTasks设置Reducer任务数,默认为Mapper任务数的1/4,用户设置作为最终的Reduce Instance个数,范围[0,2000]。
- 顺序处理数据,避免随机访问数据。磁盘的随机访问和顺序访问在性能上有巨大的差异。
Graph图计算
- 图计算作业使用图进行建模,图由点(Vertex)和边(Edge)组成的有向图,点和边包含权值(Value)。
- 支持的图编辑操作:
- 修改点或变的权值;
- 增加、删除点;
- 增加、删除边。
- 处理流程
- 图加载
- 加载图:框架调用您自定义的GraphLoader,将输入表的记录解析为点或边;
- 分布式化:框架调用您自定义的Partitioner对点进行分片(默认分片逻辑:点ID哈希值,然后对Worker数取模),分配到相应的Worker。
-
- 迭代计算:一次迭代为一个超步(SuperStep)
- 处理上一个超步发给当前点的消息(Messages);
- 对图进行编辑;
- 通过Aggregator汇总信息到全局信息;
- 设置当前点状态,结束或非结束状态;
- 框架将消息以异步的方式发送到对应Worker,并在下一个超步进行处理。
-
- 迭代终止:满足以下任意一条,迭代即终止
- 所有点处于结束状态(Halted值为True)且没有新消息产生。
- 达到最大迭代次数。
- 某个Aggregator的terminate方法返回True。
- graph作业运行出现OutOfMemory(OOM)异常,性能调优:
- 使用setNumWorkers方法适当增加Worker数目;
- 使用setSplitSize方法适当减少切片大小,默认64MB,提高作业载入数据速度;
- 加大Worker的CPU或内存;
- 避免读取用不到的字段;
- 设置最大迭代次数,如果有些应用结果精度要求不高,可以考虑减少迭代次数,尽快结束;
- 尝试Combiner,将这些Key对应点的消息进行本地聚合,以减少存储消息的内存和网络数据流量,缩短作业的执行时间。
视图
- 创建视图时,必须有对视图所引用表的读权限。(查询时不需要对引用表有读权限,有视图读权限就行)。
- 视图只能包含一个有效的select语句。
- 视图可以引用其它视图,但不能引用自己,也不能循环引用。
- 不可以向视图写入数据,例如使用insert into 或者insert overwrite操作视图。
- 当视图建好以后,如果视图的引用表发生了变更,有可能导致视图无法访问。
- 如果没有指定if not exists,在视图已经存在时用create view会导致异常。这种情况可以用create or replace view来重建视图,重建后视图本身的权限保持不变。
函数
- UTF:广义上的自定义标量函数,输入输出是一对一,输入一条,输出一条。
- UTTF:用户自定义表值函数,输入输出是一对多,输入一条,输出多条。
- UTAF:用户自定义聚合函数,输入输出是多对一,输入多条,输出一条。
资源类型
- Table类型:MaxCompute中的表
- Jar类型:编译好的Java Jar包。
- Archive类型:通过资源名称中的后缀识别压缩类型,支持的压缩文件类型包括.zip/.tgz/.tar.gz/.tar/jar。
- File类型。
Java沙箱限制
- 不允许直接访问本地文件,只能通过MaxCompute MapReduce/Graph提供的接口间接访问。
- 不允许直接访问分布式文件系统,只能通过MaxCompute MapReduce/Graph访问到表的记录。
- 不允许JNI调用限制。
- 不允许创建Java线程,不允许启动子进程执行Linux命令。
- 不允许访问网络,包括获取本地IP地址等,都会被禁止。
- Java反射限制:suppressAccessChecks权限被禁止,无法setAccessible某个private的属性或方法,以达到读取private属性或调用private方法的目的。
- 通过System.out和System.err输出日志信息,可以通过MaxCompute客户端的Log命令查看日志信息。
SQL限制
- 创建表
- 单表的列定义个数最多1200个。
- 分区值不可以有双字节字符(如中文),必须是以英文字母a-z,A-Z开始后可跟字母数字,名称的长度不超过128字节
- 注释内容是长度不超过1024字节的有效字符串。
- 快速建表时,AS不复制属性,不能带入分区键、生命周期和注释,可以带入数据;like复制除生命周期以外的属性,不能带入数据。
- MaxCompute SQL不支持事务、索引、主外键约束及Update/Delete等操作。
- Select语句
- Select表达式里不能用子查询,可以用Join改写。
- 子查询必须要有别名。
- order by必须与limit连用。
- sort by前必须加distribute by。
- 目前最多支持16个并发Join操作。
- 在mapjoin中,最多支持8张小表的mapjoin。
- select分区表时禁止全表扫描,对分区表做扫描。
- set odps.sql.allow.fullscan=true; %也可以设置整个项目对分区表全部扫描。
- 允许的SQL的最大长度为2M。
- Insert语句
- 向某个分区插入数据时,分区列不可以出现在Select列表中。
- 动态分区插入时,动态分区列必须在Select列表中。
- 目前INSERT OVERWRITE还不支持这种指定插入列的功能,暂时只能用INSERT INTO。
- 不支持update,delete,更新只支持insert overwrite和insert into。
- 对于多路输出multi insert,单个SQL里最多可以写128路输出;对于分区表,同一个目标分区不可以出现多次;对于同一分区表的不同分区,不能同时有insert overwrite和insert into操作。
- Join语句
- MaxCompute的JOIN支持多路链接,但不支持笛卡尔积,即无on条件的链接。
- 连接条件,只允许and连接的等值条件。只有在MAPJOIN中,可以使用不等值连接或者使用or连接多个条件。
- Map join语句
- 关联操作中有张表非常小或不等值的连接操作,需要用map join,性能比普通的Join要快很多。
- left outer join的左表必须是大表。
- right outer join的右表必须是大表。
- inner join左表或右表均可以作为大表。
- full outer join不能使用MapJoin。
- MapJoin支持小表为子查询。
- 在MapJoin中,可以使用不等值连接或者使用or连接多个条件。
- MaxCompute在MapJoin中最多支持指定8张小表。
- 如果使用MapJoin,则所有小表占用的内存总和不得超过512MB。
- 多个表Join时,最左边的两个表不能同时是MapJoin的表。
- 清除数据
- 对于分区表,可以用ALTER TABLE table_name DROP PARTITION的方式将分区里的数据清除。
- 清空非分区表里的数据的语法格式:TRUNCATE TABLE table_name;
授权
- owner角色
owner是项目拥有者,不支持赋给其他用户
- admin角色
- 每一个项目空间在创建时,会自动创建一个admin的角色和super administrator角色
- 不能将 admin 权限指派给用户
- 不能设定项目空间的安全配置
- 不能修改项目空间的鉴权模型
- admin 角色所对应的权限不能被修改。
- 授权方式
- Role
- 基于角色授权,操作角色:项目Owner、Super_Administrator角色或Admin角色。
- 查看当前项目空间所有角色:list roles;。
- 查看角色中的权限:describe role <role_name>;。
- 查看某用户拥有的角色:show grants for <username>;。
-
- ACL
- 操作角色:项目Owner、Super_Administrator角色或Admin角色。
- 授权操作一般涉及到三个要素:主体(Subject,可以是用户也可以是角色),客体(Object)和操作(Action)。
- ACL授权需要逐条授权,逐条取消。
- 当一个用户被移除后,与该用户有关的 ACL授权 仍然会被保留。一旦该用户以后被再添加到该项目空间时,该用户的历史的 ACL授权 访问权限将被重新激活。
- 查看指定用户的权限: show grants for <username>;。
-
- Policy
- 基于策略授权,
- Policy支持GRANT方式授权。
- Policy授权文件的格式是Json。
- Policy只支持授权给角色(Role),不支持授权给用户(User)。
- privilegeproperties中的{"policy" = "true"}表示当前为Policy授权。
- privilegeproperties中的{"allow"="[true|false]"}表示本次授权为白名单形式授权。黑名单形式授权为{"deny"="[true|false]"},当黑名单与白名单同时存在时,黑名单优先。
-
- Package
- 包授权管理,操作角色:项目Owner或Super_Administrator角色。
- 如果开启ProjectProtection的项目没有在同一个互信项目组(TrustedProject Group),则必须使用Package方式赋权。
- 查看已创建和已安装的Package列表:show packages;。
- 查看Package详细信息: describe package <pkgname>;。
-
- Label
- 标签授权管理,操作角色:项目Owner、Super_Administrator角色。
- Maxcompute的字段、表、Package分为0~4个等级,应根据用户实际需要,赋予对应的Label权限。
- 支持根据敏感级授权。
- 不支持对角色进行Label授权。
- 查看用户可以访问的敏感数据集:SHOW LABEL [<level>] GRANTS [FOR USER <username>];。
- 查看可以访问敏感数据表的用户:SHOW LABEL [<level>] GRANTS ON TABLE <tablename>;。 执行结果将显示指定Table上的Label授权。
- 不支持在项目空间中彻底移除一个用户及其所有权限数据。
注意
- 连接MaxCompute的Endpoint是http://service.odps.aliyun.com/api,不是Endpoint官方文档中对应Region的Endpoint。tunnel Endpoit也同样不是,但现在还不知道是哪个。。。