MaxCompute 基本概念与术语
项目空间
• 项目空间(Project)是MaxCompute的基本组织单元,类似于传统数据库的DataBase或Schema的概念,是进行多用户隔离和访问控制的主要边界。项目空间中包含多个对象,例如表(Table)、资源(Resource)、函数(Function)和实例(Instance)等。
• 一个用户可以同时拥有多个项目空间的权限。通过安全授权,可以跨项目空间访问对象。
• 通过在MaxCompute客户端中运行use
project命令进入一个项目空间。
表
• 表是MaxCompute的数据存储单元,逻辑上是二维结构,MaxCompute中不同类型计算任务的操作对象(输入、输出)都是表。
• MaxCompute的表分为内部表和外部表(2.0版本开始支持)。
• 对于内部表,所有的数据都被存储在MaxCompute中。
• 对于外部表,MaxCompute并不真正持有数据,表格的数据可以存放在OSS或OTS中,MaxCompute仅会记录表格的Meta信息,OSS上的信息可以是非结构化的,例如视频、音频等。
• MaxCompute与Oracle等数据库不同,系统并不会自动创建dual表。
分区
• 分区表是指在创建表时指定分区空间,即指定表内的一个或某几个字段作为分区列。分区表实际就是对应分布式文件系统上的独立文件夹,该文件夹下是该分区的所有数据文件。
• 分区表的意义在于优化查询。查询表时通过where子句查询指定分区,避免全表扫描。
• MaxCompute将分区列的每个值作为一个分区,同时也可以指定多级分区,即将表的多个字段作为表的分区,如多级目录的关系。
• MaxCompute
2.0支持字段类型为TINYINT、SMALLINT、INT、BIGINT、VARCHAR、STRING的分区,虽然可以指定分区类型为BIGINT,但是除了表的字段表示为BIGINT,任何其他情况实际都被处理为STRING。建议使用STRING。
分区使用限制
• 单表分区层级最多为6级。
• 单表分区数最多允许60000个分区。
• 单词查询允许查询的最多分区个数为10000个。
• STRING分区类型的分区值不支持使用中文。
错误的分区使用方式:
select * from src where pt=20170601;
在这样的使用方式下,MaxCompute并不能保障分区过滤机制的有效性。pt是STRING类型,当STRING类型与BIGINT(20170601)比较时,MaxCompute会将二者转换为DOUBLE类型,此时有可能会有精度损失。
生命周期
MaxCompute表的生命周期(Lifecycle),指表(分区)数据从最后一次更新的时间算起,在经过指定的时间后没有变动,则此表(分区)将被MaxCompute自动回收,这个指定的时间就是生命周期。
• 生命周期单位:Days(天),只接受正整数。
• 对于非分区表,如果表数据在生命周期内没有被修改,生命周期结束时,此表将会被MaxCompute自动回收(类似drop table),生命周期从最后一次表数据被修改的时间(LastDataModifiedTime)起进行计算。
• 对于分区表,每个分区可以分别被回收,在生命周期内数据未被修改的分区,经过指定的天数后,此分区将会被回收,否则会被保留。同理,生命周期是从最后一次分区数据被修改的时间起进行计算。不同于非分区表的是,分区表的最后一个分区被回收后,该表不会被删除。
• 生命周期回收为每天定时启动,扫描所有分区,只有被扫描时发现分区/表超过生命周期的指定时间,分区/表才会被回收。
• 生命周期只能设定到表级别,不能设定到分区级,创建表时即可指定生命周期。
资源
资源(Resource)是MaxCompute的特有概念,如果需要使用UDF、MapReduce,读取第三方库等,都需要依赖资源来完成,如下所示:
• SQL UDF:编写UDF时,需要将编译好的jar包或编写好的Python UDF脚本文件以资源的形式上传到MaxCompute,运行UDF时,MaxCompute会自动下载jar包或python脚本来运行UDF。
• MapReduce:编写MapReduce程序后,将编译好的jar包上传到MaxCompute,运行MapReduce作业时,MapReduce框架会自动下载这个资源从而获取代码。
• MaxCompute支持上传的单个资源大小上限为500MB,资源包括File类型、Table类型、Jar类型和Archive类型。
函数
MaxCompute提供了内建函数与自定义函数,自定义函数分为标量值函数(UDF)、自定义聚合函数(UDAF)和自定义表值函数(UDTF)。
• UDF
广义的UDF代表自定义标量函数、自定义聚合函数及自定义表函数三种类型的自定义函数的集合。狭义的UDF指用户自定义标量值函数,即读入一行数据,写出一条输出。
• UDAF
自定义聚合函数,即多条输入记录聚合成一条输出值,可以与SQL中的GROUP BY语句联用。
• UDTF
自定义表值函数,输入多个字段,返回多个字段,逐行记录进行处理。简单的说,UDF是特殊的UDTF。
任务
任务(Task)是MaxCompute的基本计算单元,对于计算型任务,例如SQL、MapReduce,MaxCompute会对其进行解析,得出任务的执行计划,执行计划由具有依赖关系的多个执行阶段(Stage)构成。
• 执行计划逻辑上可以被看做一个有向无环图,图中的点是执行阶段,各个执行阶段的依赖关系是图的边。MaxCompute会依照图(执行计划)中的依赖关系执行各个阶段。在同一个执行阶段内,会有多个进程,也称之为Worker,共同完成该执行阶段的计算工作。同一个执行阶段的不同Worker只是处理的数据不同,执行逻辑完全相同。计算型任务在执行时,会被实例化。
• 另一方面,部分MaxCompute任务并不是计算型的任务,例如SQL中的DDL语句,这些任务本质上仅需要读取、修改MaxCompute中的元数据信息,因此这些任务无法被解析出执行计划。
任务实例
在MaxCompute中,部分任务在执行时会被实例化,任务实例会经历运行(Running)和结束(Terminated)两个阶段。运行阶段的状态为Running,而结束阶段会有Success、Failed、Canceled三种状态。
ACID语义
相关术语
• 操作:指在MaxCompute上提交的单个作业。
• 数据对象:指持有实际数据的对象,例如非分区表、分区。
• INTO类作业:INSERT INTO、DYNAMIC INSERT INTO等。
• OVERWRITE类作业:INSERT OVERWRITE、DYNAMIC INSERT OVERWRITE等。
• Tunnel数据上传:可以归结为INTO类或OVERWRITE类作业。
ACID语义描述
• 原子性(Atomicity):一个操作或是全部完成,或是全部不完成,不会结束在中间某个环节。
• 一致性(Consistency):从操作开始至结束的期间,数据对象的完整性没有被破坏。
• 隔离性(Isolation):操作独立于其它并发操作完成。
• 持久性(Durabillity):操作处理结束后,对数据的修改将永久有效,即使出现系统故障,该修改也不会丢失。
MaxCompute的ACID具体情形
• 原子性(Atomicity)
• 任何时候MaxCompute会保证在冲突时只会有一个作业成功,其它冲突作业失败。
• 对于单个表/分区的CREATE/OVERWRITE/DROP操作,可以保证其原子性。
• 跨表操作时不支持原子性(例如MULTI-INSERT)。
• 在极端情况下,以下操作可能不保证原子性:
• DYNAMIC INSERT OVERWRITE多于一万个分区,不支持原子性。
• INTO类操作:事务回滚时会有数据清理失败。
• 一致性(Consistency)
• OVERWRITE类作业可保证一致性。
• INTO类作业在冲突失败后可能存在失败作业的数据残留。
• 隔离性(Isolation)
• 非INTO类操作保证读已提交。
• INTO类操作存在读未提交的场景。
• 持久性(Durability)
• MaxCompute保证数据的持久性。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
无法进入docker容器内排查总结
在进行处理服务器磁盘空间时,发现无法进入docker内部进行清理空间 在执行时,报下面错误 docker exec -it 容器ID bash 查看容器状态 docker ps 发现进程status 状态为up 启动状态,但是在进行进入容器操作时,却提示容器没有启动临时解决:重启了docker服务,正常进入容器但是具体原因得找到,所以就进行了排查之路排查过程:首先此容器服务正常运行,考虑可能原因点: 内存溢出,导致hang住 服务进程被人异常删除(例如,直接清理了pid文件,却没有常规杀进程,导致ps可以看到进程存在) 在client和容器连接中出来问题(可能client连接不到容器) 容器代码有问题(比如进程的处理过程,资源分配不当) 容器内部署了supervisor,会不会是服务不可用的时候,自己已经停止,然后supervisor强行拉起,但是仍然不可用 容器内部应用服务不可用 磁盘空间不足... 然后逐一分析可能性 1 内存 当时没有考虑到这点,所以重启之前忘了查看内存,也进不去容器,所以无法用free -m 查看当时容器的内存情况。后期在重启后有查看系统/var/log下的日志...
- 下一篇
课程发布 | 从入门到实践,彻底搞懂 Serverless!
众所周知,我们在开发应用程序并将其部署在服务器上的过程细节上往往要花费很多精力,有没有一种简单的架构模型能够帮助我们解决这个问题呢?答案就是今天软件架构世界中新鲜但是很热门的一个话题——Serverless(无服务器)架构。 Serverless 兴起于 2017 年,在最近两年伴随着云原生概念的推广愈发火爆,很多开发者非常看好,并认为它一定是未来云计算发展的方向。其实,虽然说是 Serverless,但 Server(服务器)是不可能真正消失的,Serverless 里这个 less 更确切的说是开发不用关心的意思。 Serverless 带来的技术红利众多,其中两个最大的贡献即是在一定程度上大大提高了研发交付的速度和降低了运营成本。 高速度研发交付:在无服务器时代,研发人眼无需对服务器进行监控、配置、更新等运维操作,只需要将代码上传
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程