当前位置: 代码迷 >> 综合 >> 阿里云大数据ACP认证学习笔记之——————MaxCompute
  详细解决方案

阿里云大数据ACP认证学习笔记之——————MaxCompute

热度:90   发布时间:2024-02-06 23:18:37.0

基本概念

  • Project:项目,MaxCompute的基本组织单元。
  • Table:表,分为内部表(数据存储在MaxCompute)和外部表(数据不存储在MaxCompute)。
  • Function:函数,包括内建函数和UDF。
  • Instance:实例,SQL、Spark和MapReduce任务再执行时都会被实例化。
  • Resources:资源,使用UDF和MapReduce需要依赖资源,资源类型:
  1. File类型:文件
  2. Table类型:MaxCompute的表
  3. Jar类型:java jar包
  4. Archive类型:通过资源名称中的后缀识别压缩类型,支持的压缩文件类型包括.zip/.tgz/.tar.gz/.tar/jar。
  • Partition:分区,可以看做表的一个目录,可以有多级分区。
  • Lifecycle:生命周期,只能再表级别设置生命周期。
  • Task:任务,MaxCompute的基本计算单元。
  • MaxCompute的ACID特性:
  1. Atomicity:原子性,冲突时只会有一个作业成功,跨表操作时不支持原子性。
  2. Consistency:一致性,OVERWRITE类作业可保证一致性。
  3. Isolation:隔离性,非INTO类操作保证读已提交。
  4. Durability:持久性,MaxCompute保证数据的持久性。
  • Endpoint:端点,连接MaxCompute需要配置Endpoint。

数据通道

  • 历史数据通道:Tunnel,离线数据上传下载服务。
  1. 分区表的上传下载一定要指定分区,多级分区一定要指定到末级分区;
  2. 将本地文件的数据上传至MaxCompute的表中,以追加模式导入;
  3. 目前Tunnel仅支持表(不包括视图View)数据的上传下载;
  4. 支持上传的单个资源大小上限为500MB;
  5. 支持upload、download、resume、show、purge、help;
  6. 命令参数
  • -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服务实现增量数据导入。
  1. OGG插件
  2. Flume插件
  3. LogStash插件
  4. Fluentd插件

连接地址

  • 阿里云内网地址
  1. ODPS地址:http://odps-ext.aliyun-inc.com/api
  2. Tunnel地址:http://dt-ext.odps.aliyun-inc.com
  • 阿里云外网地址
  1. ODPS地址:http://service.odps.aliyun.com/api
  2. Tunnel地址:http://dt.odps.aliyun.com

任务Task

  • Task任务是ODPS的基本计算单元,包括以下任务类型:
  1. SQL:MaxCompute提供sql查询功能以及内置函数处理查询数据;
  2. UDF:用户自定函数,包括UDSF、UDTF、UDAF;
  3. MapReduce:MaxCompute提供的Java MapReduce编程模型;
  4. Graph:面向迭代的图计算处理框架;
  5. Spark on MaxCompute:大数据分析引擎。
  • 任务提交后,将会在第二天23:30自动生成实例来运行任务。如果是在23:30以后提交的任务,则第三天才会开始生成实例来自动运行任务。
  • 重跑并恢复调度:可以重跑某任务,任务执行成功后可以触发下游未运行状态任务的调度。常用于处理出错节点和漏跑节点。仅支持重跑未运行、成功和失败状态的任务。
  • 规则
  1. 周期性调度任务在配置依赖属性时,上游任务可以是不同项目空间的任务;
  2. 仅等待运行、运行中状态的实例可以进行终止运行的操作,进行此操作后,该实例将为失败状态;

项目空间

  • 是MaxCompute的基本组织单元,一个用户可以同时拥有多个项目空间的权限,通过安全授权,可以在一个项目空间中访问另一个项目空间中的对象,例如表(Table)、资源(Resource)、函数(Function)和实例(Instance)。
  • MaxCompute的表格有两种类型:内部表和外部表(表格的数据可以存放在OSS或OTS中 。MaxCompute仅会记录表格的Meta信息,您可以通过MaxCompute的外部表机制处理OSS或OTS上的非结构化数据)。
  • ODPS中一个用户最多可以创建10个项目空间。
  • 通过安全授权,可以在一个项目空间中访问另一个项目空间中的数据。
  • 一旦ODPS项目空间保护打开(set sercurity.ProjectProtection=true),无法将项目空间内的数据转移到项目空间之外,所有的数据都只能在项目空间内流动。

MapReduce

  • 应用场景
  1. 搜索:网页爬取、倒排索引、PageRank;
  2. Web访问日志分析;
  3. 文本统计分析;
  4. 海量数据挖掘;
  5. 机器学习;
  6. 自然语言处理;
  7. 广告推荐。
  • 处理流程
    • 输入数据
  1. 在正式执行前,需要将输入的数据进行分片;
  2. 分片完毕后,多个Map Worker便可以同时工作,处理数据;
  3. 输入只能是表,不支持视图(View)作为输入,可以为空;
  4. 接受多表输入,且输入表的Schema可以不同。
    • Map阶段
  1. 每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce;
  2. Map Worker在输出数据时,需要根据哈希函数为每一条输出数据指定一个Key;
  3. Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据;
  4. Map阶段是必须的,可以没有Reduce,但不能没有Map;
    • Shuffle(洗牌)阶段
  1. 在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻;
  2. 如果指定了合并操作(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合;
  3. Combiner的输入、输出的参数必须与Reduce保持一致,继承的是同一个接口;
  4. 合并操作非必须。
    • Reduc阶段
  1. 每个Reduce Worker会对Key相同的多个数据进行Reduce操作,一个Key的多条数据经过Reduce的作用后,将变成一个值;
  2. 支持在一个Map后连续多个reduce;
  3. 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)。
  • 支持的图编辑操作:
  1. 修改点或变的权值;
  2. 增加、删除点;
  3. 增加、删除边。
  • 处理流程
    • 图加载
  1. 加载图:框架调用您自定义的GraphLoader,将输入表的记录解析为点或边;
  2. 分布式化:框架调用您自定义的Partitioner对点进行分片(默认分片逻辑:点ID哈希值,然后对Worker数取模),分配到相应的Worker。
    • 迭代计算:一次迭代为一个超步(SuperStep)
  1. 处理上一个超步发给当前点的消息(Messages);
  2. 对图进行编辑;
  3. 通过Aggregator汇总信息到全局信息;
  4. 设置当前点状态,结束或非结束状态;
  5. 框架将消息以异步的方式发送到对应Worker,并在下一个超步进行处理。
    • 迭代终止:满足以下任意一条,迭代即终止
  1. 所有点处于结束状态(Halted值为True)且没有新消息产生。
  2. 达到最大迭代次数。
  3. 某个Aggregator的terminate方法返回True。
  • graph作业运行出现OutOfMemory(OOM)异常,性能调优:
  1. 使用setNumWorkers方法适当增加Worker数目;
  2. 使用setSplitSize方法适当减少切片大小,默认64MB,提高作业载入数据速度;
  3. 加大Worker的CPU或内存;
  4. 避免读取用不到的字段;
  5. 设置最大迭代次数,如果有些应用结果精度要求不高,可以考虑减少迭代次数,尽快结束;
  6. 尝试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限制

  • 创建表
  1. 单表的列定义个数最多1200个。
  2. 分区值不可以有双字节字符(如中文),必须是以英文字母a-z,A-Z开始后可跟字母数字,名称的长度不超过128字节
  3. 注释内容是长度不超过1024字节的有效字符串。
  4. 快速建表时,AS不复制属性,不能带入分区键、生命周期和注释,可以带入数据;like复制除生命周期以外的属性,不能带入数据。
  5. MaxCompute SQL不支持事务、索引、主外键约束及Update/Delete等操作。
  • Select语句
  1. Select表达式里不能用子查询,可以用Join改写。
  2. 子查询必须要有别名。
  3. order by必须与limit连用。
  4. sort by前必须加distribute by。
  5. 目前最多支持16个并发Join操作。
  6. 在mapjoin中,最多支持8张小表的mapjoin。
  7. select分区表时禁止全表扫描,对分区表做扫描。
  8. set odps.sql.allow.fullscan=true; %也可以设置整个项目对分区表全部扫描。
  9. 允许的SQL的最大长度为2M。
  • Insert语句
  1. 向某个分区插入数据时,分区列不可以出现在Select列表中。
  2. 动态分区插入时,动态分区列必须在Select列表中。
  3. 目前INSERT OVERWRITE还不支持这种指定插入列的功能,暂时只能用INSERT INTO。
  4. 不支持update,delete,更新只支持insert overwrite和insert into。
  5. 对于多路输出multi insert,单个SQL里最多可以写128路输出;对于分区表,同一个目标分区不可以出现多次;对于同一分区表的不同分区,不能同时有insert overwrite和insert into操作。
  • Join语句
  1. MaxCompute的JOIN支持多路链接,但不支持笛卡尔积,即无on条件的链接。
  2. 连接条件,只允许and连接的等值条件。只有在MAPJOIN中,可以使用不等值连接或者使用or连接多个条件。
  • Map join语句
  1. 关联操作中有张表非常小或不等值的连接操作,需要用map join,性能比普通的Join要快很多。
  2. left outer join的左表必须是大表。
  3. right outer join的右表必须是大表。
  4. inner join左表或右表均可以作为大表。
  5. full outer join不能使用MapJoin。
  6. MapJoin支持小表为子查询。
  7. 在MapJoin中,可以使用不等值连接或者使用or连接多个条件。
  8. MaxCompute在MapJoin中最多支持指定8张小表。
  9. 如果使用MapJoin,则所有小表占用的内存总和不得超过512MB。
  10. 多个表Join时,最左边的两个表不能同时是MapJoin的表。
  • 清除数据
  1. 对于分区表,可以用ALTER TABLE table_name DROP PARTITION的方式将分区里的数据清除。
  2. 清空非分区表里的数据的语法格式:TRUNCATE TABLE table_name;

授权

  • owner角色

owner是项目拥有者,不支持赋给其他用户

  • admin角色
  1. 每一个项目空间在创建时,会自动创建一个admin的角色和super administrator角色
  2. 不能将 admin 权限指派给用户
  3. 不能设定项目空间的安全配置
  4. 不能修改项目空间的鉴权模型
  5. admin 角色所对应的权限不能被修改。
  • 授权方式
    • Role
  1. 基于角色授权,操作角色:项目Owner、Super_Administrator角色或Admin角色。
  2. 查看当前项目空间所有角色:list roles;。
  3. 查看角色中的权限:describe role <role_name>;。
  4. 查看某用户拥有的角色:show grants for <username>;。
    • ACL
  1. 操作角色:项目Owner、Super_Administrator角色或Admin角色。
  2. 授权操作一般涉及到三个要素:主体(Subject,可以是用户也可以是角色),客体(Object)和操作(Action)。
  3. ACL授权需要逐条授权,逐条取消。
  4. 当一个用户被移除后,与该用户有关的 ACL授权 仍然会被保留。一旦该用户以后被再添加到该项目空间时,该用户的历史的 ACL授权 访问权限将被重新激活。
  5. 查看指定用户的权限: show grants for <username>;。
    • Policy
  1. 基于策略授权,
  2. Policy支持GRANT方式授权。
  3. Policy授权文件的格式是Json。
  4. Policy只支持授权给角色(Role),不支持授权给用户(User)。
  5. privilegeproperties中的{"policy" = "true"}表示当前为Policy授权。
  6. privilegeproperties中的{"allow"="[true|false]"}表示本次授权为白名单形式授权。黑名单形式授权为{"deny"="[true|false]"},当黑名单与白名单同时存在时,黑名单优先。
    • Package
  1. 包授权管理,操作角色:项目Owner或Super_Administrator角色。
  2. 如果开启ProjectProtection的项目没有在同一个互信项目组(TrustedProject Group),则必须使用Package方式赋权。
  3. 查看已创建和已安装的Package列表:show packages;。
  4. 查看Package详细信息: describe package <pkgname>;。
    • Label
  1. 标签授权管理,操作角色:项目Owner、Super_Administrator角色。
  2. Maxcompute的字段、表、Package分为0~4个等级,应根据用户实际需要,赋予对应的Label权限。
  3. 支持根据敏感级授权。
  4. 不支持对角色进行Label授权。
  5. 查看用户可以访问的敏感数据集:SHOW LABEL [<level>] GRANTS [FOR USER <username>];。
  6. 查看可以访问敏感数据表的用户:SHOW LABEL [<level>] GRANTS ON TABLE <tablename>;。 执行结果将显示指定Table上的Label授权。
  • 不支持在项目空间中彻底移除一个用户及其所有权限数据。

注意

  1. 连接MaxCompute的Endpoint是http://service.odps.aliyun.com/api,不是Endpoint官方文档中对应Region的Endpoint。tunnel Endpoit也同样不是,但现在还不知道是哪个。。。