摘要:一个使用过Hadoop的Hive框架的大数据开发工程师,每每基本掌握了阿里云的大数据计算服务MaxCompute的90%。本次分享主要经过详细对比MaxCompute和Hive各个方面的异同及开发使用的注意事项,方便用户来开发使用MaxCompute,实现从Hive秒速迁移到MaxCompute。算法
演讲嘉宾简介:刘建伟sql
如下内容根据演讲视频以及PPT整理而成。
本次分享主要围绕如下四个方面:
1、MaxCompute和Hive对比内容介绍
2、MaxCompute介绍
3、MaxCompute和Hive对比
4、MaxCompute注意事项及对比总结数据库
1、MaxCompute和Hive对比内容介绍
本文主要从文件系统、调度系统、客户端、SQL、Web UI、界面化操做、权限等方面对MaxCompute和Hive进行对比。其中SQL对比中将分别介绍建表语句、分区分桶、数据上传下载、外部表、SQL函数、UDF、MapReduce、SQL调优、文件格式等方面的异同。
2、MaxCompute介绍
MaxCompute 主要服务于批量结构化数据的存储和计算,能够提供海量数据仓库的解决方案以及针对大数据的分析建模服务。下图为MaxCompute系统架构。MaxCompute支持SQL查询计算,自定义函数UDF实现复杂逻辑,MapReduce程序实现更具体的业务计算,支持Graph,面向迭代的图计算处理框架,提供Java API链接操做SQLTask,基于DAG的处理、交互式内存计算、机器学习等计算类型及MPI迭代类的算法,简化了企业大数据平台的应用架构。MaxCompute和Hive同样可使用SQL、UDF以及MapReduce开发。基于MaxCompute的Serverless无服务器的设计思路,用户只需关心做业和数据,而无需关心底层分布式架构及运维。
3、MaxCompute和Hive对比
1. 文件系统对比
MaxCompute和Hive文件系统对好比下图。
飞天(Apsara)是由阿里云自主研发、服务全球的超大规模通用计算操做系统。飞天系统是分布式文件存储和计算系统。对于MaxCompute,可将飞天视为相似于Hadoop的框架,如Hive基于Hadoop,那么能够理解为MaxCompute基于飞天系统。
2. 客户端对比
Hive客户端:用户进入Hive客户端执行show Database命令能够看到全部的数据库以及查询数据库中对应的表。
MaxCompute客户端:
首先下载并安装MaxCompute客户端到本地,能够看到MaxCompute客户端页面以下图所示,这里主要介绍一下MaxCompute的项目空间。
项目空间(Project)是 MaxCompute 的基本组织单元,它相似于传统数据库的Database 或 Schema 的概念,是进行多用户隔离和访问控制的主要边界 。一个用户能够同时拥有多个项目空间的权限。经过安全受权,能够在一个项目空间中访问另外一个项目空间中的对象,例如表(Table)、资源(Resource)、函数(Function)、 和实例Instance。MaxCompute除了命令行,客户端还提供Python和Java的SDK进行访问。MaxCompute SDK的入口,可经过此类来获取项目空间下的全部对象集合,包括Projects、Tables、Resources、Functions、Instances。
构造 MaxCompute对象可经过传入Aliyu Account实例来构造MaxCompute对象。程序示例以下图所示。建立一个Aliyu Account实例,首先输入“access_id"、“access_key"信息。 odpsUrl是根据用户本身的region填写的endpoint,而后填写project名称。MaxCompute Tunnel数据通道是基于Tunnel SDK编写的。用户能够经过Tunnel向MaxCompute中上传或者下载数据。
SQLTask:SQLTask是用于运行、处理SQL任务的接口。能够经过运行接口直接运行SQL。
注意:每次只能提交运行一个SQL语句,若为脚本模式能够一次提交多个SQL 。运行接口返回Instance实例,经过Instance获取SQL的运行状态及运行结果。程序示例以下图所示。建立类后输入accessId,accessKey信息。而后建立一个Odps实例对象,同时输入endpoint。关于SQLTask的具体介绍可参考官方文档。
3. Hive SQL与MaxCompute SQL对比
(1)建表语句对比:MaxCompute SQL与Hive SQL建表语句对好比下图所示。Hive SQL建表语句须要定义其分隔符、文件格式等。而MaxCompute建表不须要指定分隔符,指定文件存储路径,指定文件的存储格式。因为MaxCompute是基于阿里云飞天文件系统,用户无需关心文件存储格式,压缩格式,存储路径等,这些操做由阿里云来完成。用户没必要疲于文件存储成本、压缩性价比、读写速度等优化,能够将精力集中在业务开发上。
(2)数据上传和下载:Hive数据上传和下载须要经过load命令以及文件路径(load date inpath)。MaxCompute中可经过命令工具Tunnel进行数据上传和下载。
Upload:MaxCompute上传数据,支持文件或目录(指一级目录)的上传,每一次上传只支持数据上传到一张表或表的一个分区。若上传到分区表则必须指定上传的分区,多级分区须要指定到末级分区。示例以下:tunnel upload log.txt为数据文件,test_project为项目空间,.test_table为表名,最后为分区信息。
Download:从MaxCompute的表中下载数据,只支持下载到单个文件,每一次下载只支持下载一张表或一个分区到一个文件。分区表须要指定下载的分区,多级分区则须要指定到末级分区。
(3)分区分桶:Hive和MaxCompute都支持分区分桶,其中分区用法一致。
分桶操做其实是将一个大文件根据某个字段hash分为多个小文件,适当的分桶可提高查询效率。分桶使用方法以下表所示。
在Hive中使用分桶命令须要执行命令hive.enforce.bucketiong=true;使用关键字clustered by指定分区依据的列名,以及指定分桶数。在MaxCompute中是底层进行分桶操做。在MaxCompute中能够在建表时指定clustered by中的Hash Key,MaxCompute将对指定列进行Hash运算,根据Hash值分散到各个Bucket中。为避免数据倾斜和热点,取得较好的并行执行效果,clustered by字段列宜选择取值范围大、重复键值少的列。为达到join优化目的,应考虑选取经常使用的Join/Aggregation Key,即相似传统数据库中的主键。
(4)外部表(External Table):Hive能够经过外部表的功能进行操做,例如Hbase、ES的数据。
MaxCompute2.0支持外部表功能。MaxCompute经过外部表来映射阿里云的OTS和OSS两个数据存储产品来处理非结构化的数据,例如音频、视频数据等。在外部表操做过程当中须要注意外部表的建表语句以及权限问题。MaxCompute非结构化数据框架经过External Table与各类数据的关联,关联OSS上开源格式数据的External Table的建表的DDL语句格式以下所示。包括列信息、分区信息、文件格式、arn信息等。编程
DROP TABLE [IF EXISTS] <external_table>; CREATE EXTERNAL TABLE [IF NOT EXISTS] <external_table> (<column schemas>) [PARTITIONED BY (partition column schemas)] [ROW FORMAT SERDE '<serde class>' [WITH SERDEPROPERTIES ('odps.properties.rolearn'='${roleran}' [,'name2'='value2',...])] ] STORED AS <file format> LOCATION 'oss://${endpoint}/${bucket}/${userfilePath}/';
该语法格式与Hive建立表的语法格式接近,但需注意如下问题:
1)column schemas:外部表的column schemas必须与具体OSS上存储的数据的schema相符合,不然会报错。
2)ROW FORMAT SERDE:非必选选项,只有在使用一些特殊的格式(例如TEXTFILE)时才须要使用。
3)WITH SERDEPROPERTIES:当关联OSS权限使用STS模式受权时,须要该参数指定odps.properties.rolearn属性,属性值为RAM中具体使用的Role的Arn信息。用户能够在配置STORED AS 的同时经过说明file format文件格式。
4)若是不使用STS模式受权,则需指定odps.properties.rolearn属性,或直接在Location传入明文AccessKeyId和AccessKeySecret信息(因信息有保密性不建议使用)。而且子帐号AccessKeyId和AccessKeySecret信息须要自行保存,由于AccessKeyId和AccessKeySecret信息只提供一次,不支持后续查询,一旦丢失须要从新绑定。
OSS外部表受权方式:
一键受权:当MaxCompute和OSS的Owner是同一个帐号时,可登陆阿里云帐号后单击一键受权,将跳转到下图所示界面,单击赞成受权。在访问控制更改子帐号添加管理对象存储服务(OSS)权限(AliyunOSSFullAccess)。
自定义受权:浏览器
当MaxCompute和OSS的Owner是同一帐号时,在Service中只需写"odps.aliyuncs.com",不是同一帐号时,须要在Service中填写"MaxCompute的Owner云帐号id@odps.aliyuncs.com"。安全
--当MaxCompute和OSS的Owner是同一个帐号,设置以下。 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "odps.aliyuncs.com" ] } } ], "Version": "1" } --当MaxCompute和OSS的Owner不是同一个帐号,设置以下。 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "MaxCompute的Owner云帐号id@odps.aliyuncs.com" ] } } ], "Version": "1" }
(5)自定义函数:Hive与MaxCompute均支持自定义函数UDF、UDTF、UDAF。MaxCompute 2.0版本升级后,Java UDF支持的数据类型从原来的BIGINT、STRING、DOUBLE、BOOLEAN扩展了更多基本的数据类型,同时还扩展支持了ARRAY、MAP、STRUCT以及Writable等复杂类型。使用复杂数据类型的方法,STRUCT对应com.aliyun.odps.data.Struct。com.aliyun.odps.data.Struct从反射看不出Field Name和Field Type,因此须要用@Resolve注解进行辅助。即若是须要在UDF中使用STRUCT等数据类型,要求在UDF Class上也标注@Resolve注解。可是当STRUCT类型中的field有不少字段时,须要手动添加@Resolve注解。针对此问题,可使用Hive 中的GenericUDF去实现。MaxCompute 2.0支持Hive风格的UDF,部分Hive UDF、UDTF能够直接在MaxCompute上使用。
(6)MapReduce开发:MapReduce是一个基于集群的计算平台,是一个简化分布式编程的计算框架,是一个将分布式计算抽象为Map和Reduce两个阶段的编程模型。MaxCompute提供三个版本的MapReduce编程接口:MaxCompute MapReduce、MapReduce(MR2)、Hadoop兼容版本MapReduce。MaxCompute MapReduce是MaxCompute的原生接口,执行速度更快、开发更便捷、不暴露文件系统。MR2是对MaxCompute MapReduce的扩展,支持更复杂的做业调度逻辑,MapReduce的实现方式与MaxCompute原生接口一致。 Hadoop兼容版本MapReduce特色是高度兼容Hadoop MapReduce ,与MaxCompute MapReduce MR2不兼容。
(7)SQL调优:MaxCompute和Hive基本SQL优化类似,例如常见的Key分布不均匀、数据倾斜、join长尾、窗口函数优化等。
4. Web UI对比
Hive任务依赖于Hadoop的HDFS和YARN提供的WebUI进行访问。MaxCompute使用Logview查看Job 信息。经过Logview可看到一个Job 的任务运行状态、任务的运行结束、任务细节及每一个步骤的进度等任务执行情况。Job 提交到MaxCompute后将生成Logview的连接。可直接在浏览器打开Logview连接查看Job 信息。Logview首页分红上下两部分,Instance信息和Task信息。
Instance信息:用户提交的SQL任务对应的MaxCompute Instance信息,包含URL连接、项目、InstanceID、提交人、开始时间、结束时间和状态(Status)等。Instance信息部分能够单击Status查看当前队列的Status详细信息,包含四种状态,Waiting表示当前做业正在MaxCompute中处理,并无提交到分布式调度系统(Fuxi)中运行。Waiting List : n表示做业已提交至分布式调度系统(Fuxi)排队等待运行,当前在队列中处于第n位。Running则说明做业在分布式调度系统(Fuxi)中运行。以及成功状态。
Task 信息:该Instance对应的Task信息,包括任务名称、类型、状态、运行结果(Result)、详细信息(Detail)、开始时间、结束时间、总运行时间(Latency)、进度。其中,Latency指运行总共消耗的时间,与其它页面的Latency含义相似。Result是在Job运行结束后,能够看到运行结果。Detail是一个Job在运行中和结束后,都可以单击Detail来查看任务运行的具体状况。
案例:下面介绍一个Logview信息案例。
点击上图SQL,能够看到具体执行任务的LogView语句信息页面以下:
目录中Status是上述所介绍的四种状态信息。经过SubStatus History能够看到任务运行过程当中的详细信息,包括任务等待、准备、执行、结束等详细执行过程信息。
下方一行为Task信息:
点击Result能够查看运行结果;
点击Detail能够看到任务运行过程当中的详细信息。
上图左侧Fuxi Job DAG会根据任务指定详细执行计划,生成一个DAG(有向无环)图。右侧上方Fuxi Jobs为具体状态信息。右侧下方为Instance信息,经过Instance信息能够看到整个任务的执行情况,包括失败数、运行数、长尾信息等,可便于对SQL进行相应优化。 Summary是Job运行结束后才能够查看的信息,主要包括Job消耗的CPU、内存、Job输入的表名、记录数和字节数。经过Summary也能够分析Job是否有长尾,并进行相应优化。所以Logview是MaxCompute开发过程当中排查、发现问题的重要工具。
5. 界面化操做对比
Hive能够借助hue工具来操做查询数据,但其交互性不是很强。MaxCompute中阿里云的产品基本上都是界面化操做,可拖拽,开发门槛很是低。所以很是适合初学大数据或者没有相关开发人力的公司。MaxCompute的界面化操做能够结合Dataworks作数据同步、权限控制、数据管理和其余数据源交互、定时调度等。
6. 权限对比
Hive中权限操做支持ACL受权。MaxCompute支持ACL受权以及Policy权限受权。
Policy权限受权: 在RAM访问控制页面权限策略管理中,点击新建自定义权限,选择脚本模式,就能够编写Policy权限。以下图所示为具体权限内容。用户在开发过程当中,可使用ACL权限或Policy权限受权。建立Policy权限策略后,建立一个RAM角色,为角色制定策略,就会拥有一个相应权限以进行开发。
4、MaxCompute注意事项
1. Java沙箱限制
MaxCompute MapReduce及UDF程序在分布式环境中运行时,受到Java沙箱的限制(MapReduce做业的主程序,例如MR Main则不受此限制),具体限制以下所示。
1)不容许直接访问本地文件,只能经过MaxCompute MapReduce/Graph提供的接口间接访问。读取resources选项指定的资源,包括文件、Jar包和资源表等。经过System.out和System.err输出日志信息,能够经过MaxCompute客户端的Log命令查看日志信息。
2)不容许直接访问分布式文件系统,只能经过MaxCompute MapReduce/Graph访问到表的记录。3)不容许JNI调用限制。
4)不容许建立Java线程,不容许启动子进程执行Linux命令。
5)Java反射限制:suppressAccessChecks权限被禁止,没法setAccessible某个private的属性或方法,以达到读取private属性或调用private方法的目的。
2. SQL使用限制
以下图所示:具体参考官方文档介绍。
3. MaxCompute数据操做
MaxCompute不支持直接对表数据进行删除(Delete)和更新(Update)语法操做。
更新(Update)数据:只能将源分区或表数据导入到新分区或表(新分区或表能够与源分区或表相同),在导入过程当中执行相应的更新逻辑。对于非分区列,只支持重命名和新建列,不支持对列的删除。MaxCompute不支持Update语句,建议把更新后的结果筛选出来,而后用Insert Overwrite的方法写回原表。
删除(Delete)数据:能够经过删除(Drop)表达到数据删除目的。非分区表能够经过TRUNCATE TABLE table_nam;语句清空表数据。分区表能够经过ALTER TABLE table_name DROP IF EXISTS PARTITION(分区名=‘具体分区值’)删除分区达到删除整个分区数据的目的。经过INSERT和WHERE条件把须要的数据导入到另外一张新分区或表中或就地更新,INSERT语句支持源表和目的表是同一张表。
4. MaxCompute单字段限制8MB
处理思路:目前因为存储机制限制,MaxCompute表中单个字段(多为String字段)的最大长度不能超过8MB。对于超过8MB的超大字段,建议拆分红多个字段。具体的拆分逻辑能够根据业务特性设计,保证每一个字段不超过8MB便可。
经常使用方法:因为复杂结构的超大字段在数据开发和分析中会严重影响计算性能,所以建议用户根据数仓建设规范来设计数据架构,避免超大字段。具备复杂结构的原始数据,做为ODS层,最好以压缩的方式归档。定时(例如天天)对ODS层的增量数据作数据清洗,复杂字段拆分为多个简单字段,而后存储在CDM层的表中,便于数据的统计分析。
5. 设置兼容Flag
默认模式是MaxCompute模式,若是要切换至Hive模式,须要开启odps.sql.hive.compatible为True。odps.sql.hive.compatible表示是否打开Hive兼容模式,其值默认为False。可经过如下两种方法开启Hive兼容模式。开启后才能够支持Hive指定的各类用法,例如inputRecordReader、outputRecordReader、Serde等。Hive兼容后用户建立外部表或开发MaxCompute SQL过程当中能够从Hive平滑迁移到MaxCompute中。
--Project级别切换为Hive模式:setproject odps.sql.hive.compatible=True;
--Session级别切换为Hive模式:set odps.sql.hive.compatible=True。odps.sql.hive.compatible表示是否打开Hive兼容模式,其值默认为False(禁止)。每执行一个Session都须要写这句话。服务器
最后作一个MaxCompute与Hive异同总结 架构
查看更多:https://yqh.aliyun.com/detail..._content=g_1000106254框架
上云就看云栖号:更多云资讯,上云案例,最佳实践,产品入门,访问:https://yqh.aliyun.com/less