在过去的两年内,MaxCompute进行了翻天覆地的重构,从1.0版本全面升级到了2.0版本。而大家或许对于MaxCompute 2.0的一些新特性并不了解,在本文中,MaxCompute技术专家秋鹏就为大家详细介绍MaxCompute 2.0的新特性。
本文主要围绕以下三个方面进行分享:
MaxCompute 2.0简介
MaxCompute 2.0 vs 1.0
MaxCompute 2.0 vs 竞品
一、MaxCompute 2.0简介
MaxCompute之所以要进行重构是因为MaxCompute 1.0上存在很多问题,在MaxCompute 2.0的概念提出前,MaxCompute就已经在线上服务内部和外部用户一段时间了,并且也获得了一些积极的反馈。但是MaxCompute 1.0中也存在一些问题需要解决,这些问题大概分为两个部分。首先,一些竞争对手比如Hive、Spark等用了很多MaxCompute还没有用上的新功能,他们能够达到比MaxCompute更加高效的性能,这就迫使MaxCompute尝试增加新的功能,并且优化自身引擎,解决已知的问题。在引入新功能的过程中,发现需要对于MaxCompute引擎进行重构,使得引擎能够支持新功能。此外,MaxCompute 1.0在用户开发体验上有待提升,相比于Hive以及MySQL存在一定差距,从原有系统向MaxCompute迁移存在一定的不兼容问题,这也制约了MaxCompute对于外部用户的吸引力。此外,在MaxCompute 1.0的开发过程中缺乏完善并且好用的集成开发环境,使得用户开发较为困难。
因此,基于1.0版本所存在的问题,MaxCompute就进行了一系列的改进,并提出了MaxCompute 2.0的概念。MaxCompute 2.0首先提出了三个重要的设计目标:强大的编译器,包容的生态以及高效的引擎。首先,编译器需要支持脚本式语言,能够让用户轻松编写复杂逻辑,还需要能够支持强大的IDE功能,比如实现错误实时提示以及代码填充等,从而提高用户开发体验。对于生态而言,需要使得MaxCompute的SQL支持标准SQL,还需要兼容开源生态,使得用户可以方便地将原有应用迁移到MaxCompute上。最后一点,还需要利用最新的分布式计算框架来优化执行引擎,从而使得执行的效率更高。
二、MaxCompute 2.0 vs 1.0
前面所讲的更多的是站在系统层面进行分享,接下来将围绕大家日常开发使用MaxCompute来进行分享,本部分主要将对比MaxCompute 2.0版本和1.0版本的区别所在。
编译器
MaxCompute 2.0在编译器上进行了完全重构,也进行了大量的优化,如图所示列举了部分关键点,比如所有编译错误都会行列号信息,这样的中括号格式能够方便IDE来实现各种各样的自动化处理;第二个就是全新的error key,相比于之前的error code具有更高的可读性;此外更重要的一点就是MaxCompute 2.0的编译结果更可能是包含warning的,warning是编译器在用户的SQL里面发现的有可能存在潜在问题的情况,而这些问题却并不会影响用户的SQL进一步编译和执行,但是编译器认为有必要将这些潜在问题提出来让用户改正。此外,MaxCompute 2.0编译器非常重要的一点新功能就是其支持错误恢复,这里的错误恢复指的是当碰到用户错误的时候会尝试去猜测用户SQL的实际意图,尝试去将错误恢复出来继续进行编译,这样的好处就是在同一次编译中的多次错误会一次性地报出来,方便用户修改。这一功能对于IDE而言是非常重要的,因为当用户使用IDE来做语法检查的时候会发现IDE能够将整个脚本中的所有错误同时标识出来。
数据类型
MaxCompute 2.0新增了很多数据类型,如下图所示。可以看出,MaxCompute 1.0只支持了几个有限的数据类型,这些数据类型其实在大多数场景下其实是够用的,但是将应用从已有的开源系统上移植过来的时候就会显得不足。而MaxCompute 2.0中更多的数据类型能够支持更丰富的表达能力。此外,MaxCompute 2.0还增加了很多常量的定义,比如TINYINT、SMALLINT、DATETIME以及TIMESTAMP等。当然了,这里也有两点需要注意,一点就是使用新类型需要使用新类型需要set odps.sql.type.system.odps2=true; 或者开Hive兼容。此外,还需要注意MaxCompute实际还支持CHAR类型和INTERVAL 类型,目前仅当打开Hive兼容模式下可用。
复杂类型
此外,MaxCompute 2.0还对于复杂类型进行了补充,支持了ARRAY、MAP以及STRUCT三种类型,并且这些复杂类型可以任意嵌套。MaxCompute 2.0对于复杂类型的定义、构造以及操作都进行了扩充,因此用户可以很轻松地使用这些复杂类型来实现复杂的逻辑。
语法结构
MaxCompute 2.0相比于1.0增加了如下图所示的很多语法结构。首先是Values表达式,其并不是MaxCompute原创的,在其他的SQL语言中也有,但是在MaxCompute 1.0中并没有支持,这就导致在MaxCompute 1.0里面构造一个简单的数据是非常困难的。在MaxCompute 2.0中,因为支持了Values表达式,因此用户可以直接在SQL里面通过Values表达式来构造一个简单的维表。此外,目前还可以在Select语句中省略from表达式,相当于Select一个一行的values。
第二个新增的语法叫做“Common Table Expression(CTE)”,简单而言CTE可以让用户通过使用WITH语句将子查询提前,而踢到前面的SubQuery可以被反复使用,即所谓的Common Table,而且Common Table之间可以相互引用。此外一个新增的语法及时“SEMI/ANTI JOIN”,这两个语法其实算是SQL标准的功能,SEMI JOIN的语义是当JOIN条件满足的时候返回满足条件的行,而ANTI JOIN与之前恰好相反,就是当JOIN条件满足的时候就过滤掉满足条件的行,保留不满足条件的行返回。
MaxCompute 2.0还支持了更加丰富的子查询表达式,在MaxCompute 1.0中只支持了IN的SubQuery表达式,而在MaxCompute 2.0则引入了两种新表达式,一种是EXISTS表达式,其含义是当后面的表达式有结果返回时为TRUE,否则为FALSE;另一种叫做SCALA SubQuery,也就是当后面的子查询能够确定是一行一列的时候,子查询可以当做标量使用,进而可以参与其他表达式的计算。此外,在MaxCompute 2.0子查询中支持了correlated,这使得子查询的结果不再是固定的值,而是会根据外部表的行进行改变。
MaxCompute 2.0提供的另外一个重要功能就是“SELECT TRANSFORM”,该语法完全与Hive兼容,其允许用户使用第三方脚本来处理数据。另外一个引入的新功能是“User Defined Type”,这是MaxCompute独有的功能,这个功能非常好用,其允许用户直接在SQL中嵌入第三方语言,目前只支持了Java。使用new就可以创建对象,可以直接调用对象公共方法和访问公共属性,而且整个JDK都可以直接使用,还可以通过设置odps.sql.session.resources引用第三方包。
MaxCompute 2.0还支持外表和非结构化存储,简单而言在MaxCompute 1.0里面,用户只能引用内部定义的表,比如创建表之后将数据上传上去才能够使用。而目前的过程完全可以利用外表来实现,用户可以定义和创建一个外表,可以直接从外部数据源读取数据,这样就省略了数据迁移的过程。而外部数据和内部数据的存储肯定不一致,因此MaxCompute 2.0还引入了对于非结构化数据进行处理的机制,比如通过定义StorageHandler来处理非结构化存储的序列化、反序列化以及读写过程。值得注意的是MaxCompute 2.0的外表在语法等方面完全兼容Hive,因此Hive用户可以非常轻松地向MaxCompute 2.0进行迁移。
MaxCompute 2.0还提供了“CLUSTERED BY”功能,我们可以在创建表的过程中指定表按照某一列进行CLUSTERED BY,这将会为表建立一个聚集索引,能够使用户在查询中利用索引进行优化,减少读入的数据量。还有一个新功能就是“User Defined Join”,借助此功能用户可以自定义表的连接过程,原本的内置JOIN过程都可能会产生笛卡尔积结果,可能做了过多的爆炸式展开,而通过User Defined Join将会大大减少中间结果的产生。
脚本模式
MaxCompute 2.0提供了脚本模式功能,在脚本模式下,用户所提交的脚本不再是以单条SQL为单位的,而是以整个脚本为单位提交查询,因此更适合复杂的查询。此外,脚本模式可以使用DDL语句,并且可以有多个不同的输出,可以有多次insert into以及多个insert override等,所以脚本模式能够最大限度地帮助用户编写复杂的逻辑。虽然脚本模式中,脚本是按照一整个脚本提交的,但是并不会逐条执行,而是将整个脚本作为一个完整作业执行,其优点就是对于一些重复操作可以合并到一起。
参数化视图
在MaxCompute 1.0版本的视图定义中,并不允许传递参数,但是在2.0版本中则引入了参数化视图功能,该功能允许用户在定义VIVIEW时候定义参数,根据参数的不同使得VIEW的逻辑会出现一系列变化,这样就能够大大提升VIEW代码的重用能力。如果能够设计得很好,那么用户的绝大部分逻辑都能通过VIEW基于过程的过程方式实现。
MaxCompute Studio
MaxCompute 2.0提供了对于IDE的强大支持,其在开始研发的过程中就伴随这MaxCompute Studio的设计和实现了。而MaxCompute Studio也提供了一些非常重要的功能,比如作业监控、作业分析、实时错误提示以及智能提示等。通过MaxCompute Studio,用户可以非常直观地监控作业的执行流程,帮助用户直观地掌控执行流程中的各个节点信息;此外,MaxCompute Studio还提供了一系列分析工具,帮助用户分析参与作业的各个节点的执行信息等;此外,还提供了很多对于SQL开发的支持功能,比如用户在MaxCompute Studio中做编辑的时候,就会把用户的脚本做本地编译,并发现其中存在的问题,然后以图形化方式报告给用户;另外一个就是实现了上下文提示,提示功能非常智能化,而这在开发脚本的过程中也是非常有帮助的。
即将上线的功能
除了上述功能之外,MaxCompute 2.0版本中还有如下图所示的很多即将上线的功能,比如GROUPING SETS和CUBE/ROLLUP、INTERSECT/EXCEPT、内存计算、Java Runtime与Local run、更完善的脚本语言支持以及Table API支持等。
三、MaxCompute 2.0 vs 竞品
Hive兼容模式
最后与大家简单介绍一下MaxCompute 2.0与其他竞品的区别。之所以介绍这一点,是因为一些用户期望从其他的产品上向MaxCompute 2.0进行迁移,希望能够对于MaxCompute所支持的功能以及难度有一个直观的了解。其实,MaxCompute 2.0对于Hive具有非常强的兼容能力,当用户通过设置“SET odps.sql.hive.compatible=true;”就可以打开Hive兼容模式。在兼容模式下,不仅能够兼容Hive的语法结构,还能够对于数据类型、语义以及UDF和StorageHandler进行兼容。当打开MaxCompute 2.0的兼容模式,那么在Hive上运行的应用就能够非常方便地迁移到MaxCompute 2.0平台上来。当然了,MaxCompute 2.0与Hive还存在一些在设计上的不兼容的地方,比如某些操作和MaxCompute概念不符合,比如database、schema等,因此没有支持;在权限管理上,某些方式和MaxCompute不符,如column的权限管理,没有支持。MaxCompute的resource是全局的,因此某些操作,如CREATEFUNCTION需要指定resource。而这些不兼容的地方,对于用户也没有太大影响,因此对于用户而言,从Hive向MaxCompute进行迁移是非常方便的。而在MaxCompute在未来也将会支持任何符合SQL标准的语法。
MaxCompute 2.0核心优势
MaxCompute 2.0除了在兼容方面做得比较好之外,还存在着很多的核心优势。首先,最大的优势就是MaxCompute是企业级服务,能够提供7*24小时不间断服务的系统级平台,会有专业人员对于问题进行支持。MaxCompute 2.0具有包容的生态圈,大家可以从各个平台上迁移过来,从而实现完整统一的计算系统。此外,MaxCompute 2.0所提供的更丰富的扩展能力能够让用户更方便地扩展SQL能力。脚本模式和参数化视图能够让用户用脚本方式开发复杂的逻辑,从而实现复杂的功能。MaxCompute Studio所提供的强大的开发调试的支持,也是企业竞品所没有的。在经过一系列的改进之后,MaxCompute 2.0的执行引擎、优化器都是用了最新的算法模型和框架,因此性能不会输给任何竞品,并且已经经过了内部无数次验证,因此用户可以放心使用。
原文链接
本文为云栖社区原创内容,未经允许不得转载。