
方案概述方案一:优化现有MySQL数据库。优点:不影响现有业务,源程序不需要修改代码,成本最低。缺点:有优化瓶颈,数据量过亿就玩完了。方案二:升级数据库类型,换一种100%兼容MySQL的数据库。优点:不影响现有业务,源程序不需要修改代码,你几乎不需要做任何操作就能提升数据库性能,缺点:多花钱。方案三:一步到位,大数据解决方案,更换newSQL/noSQL数据库。优点:没有数据容量瓶颈,缺点:需要修改源程序代码,影响业务,总成本最高。优化现有MySQL数据库数据库设计表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(这样数值容量会扩大一倍),当然能使用TINYINT、SMALLINT、MEDIUM_INT更好。使用枚举或整数代替字符串类型。尽量使用TIMESTAMP而非DATETIME。单表不要有太多字段,建议在20以内。用整型来存IP。索引设计索引并不是越多越好,要根据查询有针对性的创建,考虑在WHERE和ORDER BY命令上涉及的列建立索引,可根据EXPLAIN来查看是否用了索引还是全表扫描。应尽量避免在WHERE子句中对字段进行NULL值判断,否则将导致引擎放弃使用索引而进行全表扫描。值分布很稀少的字段不适合建索引,例如"性别"这种只有两三个值的字段。字符字段只建前缀索引。字符字段最好不要做主键。不用外键,由程序保证约束。尽量不用UNIQUE,由程序保证约束。使用多列索引时注意顺序和查询条件保持一致,同时删除不必要的单列索引。使用可存下数据的最小的数据类型,整型 < date,time < char,varchar < blob*使用简单的数据类型,整型比字符处理开销更小,因为字符串的比较更复杂。如,int类型存储时间类型,bigint类型转ip函数。使用合理的字段属性长度,固定长度的表会更快。使用enum、char而不是varchar。尽可能使用not null定义字段。尽量少用text,非用不可最好分表。查询频繁的列,在where,group by,order by,on从句中出现的列。where条件中<,<=,=,>,>=,between,in,以及like 字符串+通配符(%)出现的列。长度小的列,索引字段越小越好,因为数据库的存储单位是页,一页中能存下的数据越多越好。离散度大(不同的值多)的列,放在联合索引前面。查看离散度,通过统计不同的列值来实现,count越大,离散程度越高。SQL编写使用limit对查询结果的记录进行限定。避免select *,将需要查找的字段列出来。使用连接(join)来代替子查询。拆分大的delete或insert语句。可通过开启慢查询日志来找出较慢的SQL。不做列运算:SELECT id WHERE age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等等,查询时要尽可能将操作移至等号右边。SQL语句尽可能简单:一条SQL只能在一个cpu运算;大语句拆小语句,减少锁时间;一条大SQL可以堵死整个库。OR改写成IN:OR的效率是n级别,IN的效率是log(n)级别,in的个数建议控制在200以内。不用函数和触发器,在应用程序实现。避免%xxx式查询。少用JOIN。使用同类型进行比较,比如用'123'和'123'比,123和123比。尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。对于连续数值,使用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5。列表数据不要拿全表,要使用LIMIT来分页,每页数量也不要太大。分区可以让单表存储更多的数据。分区表的数据更容易维护,可以通过清楚整个分区批量删除大量数据,也可以增加新的分区来支持新插入的数据。另外,还可以对一个独立分区进行优化、检查、修复等操作。部分查询能够从查询条件确定只落在少数分区上,速度会很快。分区表的数据还可以分布在不同的物理设备上,从而搞笑利用多个硬件设备。可以使用分区表赖避免某些特殊瓶颈,例如InnoDB单个索引的互斥访问、ext3文件系统的inode锁竞争。可以备份和恢复单个分区。一个表最多只能有1024个分区。如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。分区表无法使用外键约束。NULL值会使分区过滤无效。所有分区必须使用相同的存储引擎。分表分表就是把一张大表,按照如上过程都优化了,还是查询卡死,那就把这个表分成多张表,把一次查询分成多次查询,然后把结果组合返回给用户。分表分为垂直拆分和水平拆分,通常以某个字段做拆分项。比如以id字段拆分为100张表:表名为 tableName_id%100。但:分表需要修改源程序代码,会给开发带来大量工作,极大的增加了开发成本,故:只适合在开发初期就考虑到了大量数据存在,做好了分表处理,不适合应用上线了再做修改,成本太高!!!而且选择这个方案,都不如选择我提供的第二第三个方案的成本低!故不建议采用。分库把一个数据库分成多个,建议做个读写分离就行了,真正的做分库也会带来大量的开发成本,得不偿失!不推荐使用。升级数据库开源数据库会带来大量的运维成本且其工业品质和MySQL尚有差距,有很多坑要踩,如果你公司要求必须自建数据库,那么选择该类型产品。如tiDB pingcap/tidb,Cubrid Open Source Database With Enterprise Features。阿里云POLARDB,POLARDB 是阿里云自研的下一代关系型分布式云原生数据库,100%兼容MySQL,存储容量最高可达 100T,性能最高提升至 MySQL 的 6 倍。POLARDB 既融合了商业数据库稳定、可靠、高性能的特征,又具有开源数据库简单、可扩展、持续迭代的优势,而成本只需商用数据库的 1/10。阿里云OcenanBase,淘宝使用的,扛得住双十一,性能卓著,但是在公测中,我无法尝试,但值得期待。阿里云HybridDB for MySQL (原PetaData),云数据库HybridDB for MySQL (原名PetaData)是同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP(Hybrid Transaction/Analytical Processing)关系型数据库。腾讯云DCDB,DCDB又名TDSQL,一种兼容MySQL协议和语法,支持自动水平拆分的高性能分布式数据库——即业务显示为完整的逻辑表,数据却均匀的拆分到多个分片中;每个分片默认采用主备架构,提供灾备、恢复、监控、不停机扩容等全套解决方案,适用于TB或PB级的海量数据场景。换大数据引擎hadoop家族。hbase/hive怼上就是了。但是有很高的运维成本,一般公司是玩不起的,没十万投入是不会有很好的产出的!我选择了阿里云的MaxCompute配合DataWorks,使用超级舒服,按量付费,成本极低。MaxCompute可以理解为开源的Hive,提供SQL/mapreduce/ai算法/python脚本/shell脚本等方式操作数据,数据以表格的形式展现,以分布式方式存储,采用定时任务和批处理的方式处理数据。DataWorks提供了一种工作流的方式管理你的数据处理任务和调度监控。当然你也可以选择阿里云hbase等其他产品,我这里主要是离线处理,故选择MaxCompute,基本都是图形界面操作,大概写了300行SQL,费用不超过100块钱就解决了数据处理问题。原作者:赵客缦胡缨v吴钩霜雪明来源:https://www.jianshu.com/p/336f682e4b91更多关于大数据计算、云数仓技术交流,可扫码加入 “MaxCompute开发者社区” 钉钉群
本篇内容分享人: 慕明 阿里云智能 技术专家视频地址:https://yqh.aliyun.com/live/detail/21708本篇主要通过五个部分介绍MaxCompute Tunnel MaxCompute Tunnel技术原理 MaxCompute Tunnel丰富的生态 Tunnel功能简介 SDK的使用方式 最佳实践 一、MaxCompute Tunnel技术原理上图是架构图,可以看到对外的服务提供了一个统一的SDK,然后集成到所有的外部服务里。在服务端,提供的服务可以大概分为API层和执行层。API层有两个集群 Frontend集群会负责控制流的介入,Tunnel集群负责数据。在执行层分为控制集群和计算集群,控制集群会负责资源管控,meta的管理,和权限管理这些功能,计算集群就负责实际的计算和存储。 可以看到,Tunnel是属于API层的一个组件,专门负责数据的上传和下载。为什么这么做, 是因为这是一个大数据的系统,所以在MaxCompute上跑一个SQL其实就发了一条控制指令。由于目标的场景是一个大数据量的查询,比如说十亿条这种量级的,这是一个规模比较大的操作,如果在这个场景下想做数据的同步,就不能像MySQL传统输入一样通过insert into,因为insert into走控制集群这个链路是非常浪费资源的,同时也会有一些限制。一次一行的效率特别低,因此设计了分开的控制流和数据流。 Tunnel集群负责的功能是在SDK层提供了Tunnel的API,让用户可以通过一个结构化的方式去访问数据。另外,Tunnel是对外放出来的唯一的数据接口,会对用户写进来的数据做格式检查和权限校验,控制数据安全。同时会保证用户通过Tunnel写出来的数据用SQL可读,不用担心比如SQL读不了写进来的数据,或者写的数据和SQL读出来的值有差异。 另外一点,Tunnel是直接访问存储层的,MaxCompute在底层的存储是一个分布式文件系统,Tunnel是直接访问这个文件系统的,这样在性能上就有了保证。也就是说,Tunnel在理想情况下是可以保证单并发达到10兆每秒的吞吐能力,通过假并发也是可以水平扩展整个吞吐能力。 二、MaxCompute Tunnel丰富的生态MaxCompute有非常丰富的生态,推荐首先要看一下有什么工具,或者有哪些服务可以做,建议优先使用一些成熟的服务,尽量不要自己先写代码。官方的SDK有Java SDK和Python SDK。另外,官方还提供了三种工具。MaxCompute客户端是一个命令行工具,在数据同步这方面支持用户把一个本地文件上传到MaxCompute里面,也可以通过下载一张表到一个本地文件上。MaxCompute Studio是一个idea插件,它也支持文件上传下载这样的方式。MMA2.0迁移工具是最近推出的一个工具,可以帮助用户把数据从现有的大数据系统里迁移到MaxCompute上,这些工具都是基于SDK开发的,都是通过SDK传输。 除了工具以外,MaxCompute在第三方服务上也是集成的,比如云上的数据通道图,SLS(阿里云的日志服务),DataHub(数据通道),他们都是原生就支持MaxCompute投递的,Kafka也是有官方的插件。 流计算方面,Blink,Spark也都是有MaxCompute同步插件的。数据同步服务方面,DataWorks的数据同步,实时同步和离线同步,都是支持MaxCompute同步的。 总结一下,如果有数据同步的需求,最好先看一下现有的服务是不是可以满足需求。如果觉得都满足不了,想要自己开发的话,可以看一下SDK是可以有哪些功能,和使用上的一些注意事项。 三、Tunnel功能简介上图是Tunnel总体功能的表格。现在有两套API,分批量数据通道和流式数据通道。批量数据通道目标的场景单并发的吞吐量很大,这种理想的场景是传量大的数据,一次一批,QPS和并发都不能特别高,但是单并发的吞吐量可以做得很大,这个在API上也有一些优化。 流式数据通道是新提供的一种服务,因为现在的上游服务大多数都是一些流式服务灌进来的,也就是说单并发可能流量没有那么大,但是都是比较细碎的数据,这种情况如果用批量数据通道会遇到很多限制。最明显的就是小文件问题,用批量数据通道写特别碎的数据进来会产生大量的碎片文件,跑SQL查询就会非常慢,用Tunnel下载也会非常慢。针对这种场景平台提供了流式数据通道服务,通过流式数据上来可以写得特别碎,一行写一次也可以,不需要担心小文件的问题,也不用担心并发的问题,并发可以无限多。流式数据通道是不限并发的,但是批量是限并发的。 从表格中可以看到,通过Tunnel是可以访问这几种资源的:普通表,Hash Clustered表,Range Clustered表和Transactional表,最后是查询结果,这些都是可以下载的;普通表两种上传都支持;Hash Clustered表和Range Clustered表并不适合Tunnel去写,因为数据在存储上需要做一个系统,而且会排序,而Tunnel集群规模没有计算机集群那么大,没有这个能力去做排序。因此,这种表一般经典的用法就是先写一张普通表,然后通过SQL做一个insert overwrite,生成一张Hash Clustered表或者Range Clustered表。 流式上传在架构上做了升级,有一个异步处理的机制,会把用户写进来的数据在后台进行加工,所以后面会支持Hash Clustered表。 Transactional表是说,MaxCompute的普通表是不支持update或者delete的,系统最近在SQL上支持了这个语法,就是用户可以update,也可以delete,也可以支持transaction。批量上传的API现在是支持Transactional表,但是只支持append,也称为insert into,它是不能从Tunnel的API上去update的。流式的也正在规划中,后续可能会连update也一起完成。批量的可能不会做update这个功能,但是批量的现在就可以append这种Transactional表。 查询结果就是说,如果跑一个SQL,在odpscmd客户端或者DataWorks上对查询结果有1万条的限制。但是这个查询结果可以通过Tunnel下载,就不受条数限制,可以下载完整的查询结果到本地。 总而言之,如果使用SDK的话,就可以做到表格里的这些功能。 四、SDK的使用方式1)基本配置如果想开发的话有哪些东西需要配置,不管上传、下载,还是流式上传,这些配置都是一样的。首先需要创建一个ODPS对象和一个Table Tunnel对象。如果想用SDK跑SQL,要创建ODPS;TableTunnel是Tunnel入口的一个类,所有的功能都是从这个类发起的。 然后看具体的配置项,图中左侧列举的是比较关键的几个。Access ID和Access Key就是账号信息,阿里云通过这个来表示一个账号。 ODPS Endpoint是服务的一个入口,现在在公共云上应该有21个region,包括金融云和政务云,中国有7个,海外有14个。每个region的endpoint是不一样的,使用时需要找到自己购买的region服务,并正确填写endpoint进去。 Tunnel Endpoint是可选的,如果不填,系统会通过所填的ODPS endpoint自动路由到对应的Tunnel endpoint上。在公共云上的网络环境比较复杂,分公网域名和内网域名,内网域名还分经典网络和VBC,也许会有路由的endpoint网络不通这种场景,这个时候平台提供了一个接口,用户可以把能访问的Tunnel endpoint填进来,这样就会优先用所填的Tunnel endpoint而不会用路由的,但99%的情况下是不用填。 Default project这个参数是在弹内经常用的。 MaxCompute的权限管理非常丰富,比如如果在公共云上有多个project,想要控制数据在跨project流动的话,就可以通过这个参数来配置。ODPS里设置的Default Project可以理解为是原project,下面的create Stream Session里面又有一个project,即要访问数据所在的project。如果这两个project不一样,系统会检查这个权限,用户是否可以访问目标project的数据。如果跑SQL,它也会根据原project来控制资源的使用。如果只有一个,这两个填成一样的就可以。 一般来说,Access ID,Access Key, 和ODPS Endpoint是必选的,Tunnel Endpoint可选,Default project如果只有一个只填一个就行了。 2)具体的上传接口接下来展示具体的上传接口。首先看批量上传。 【批量上传】上图中可以看到,批量上传的流程是先创建一个upload session (第31行),然后open writer,用writer去写数据,然后close,再upload session加commit。 Upload session可以理解为是一个会话的对象,类似于transaction的概念。这次上传是以upload session为单位的,即最终upload session commit成功了这些数据才是可见的。在一个upload session内部可以open多个writer,并且多个writer可以并发上传,但是writer是有状态的,需要给它指定一个不重复的block ID,避免产生覆盖。Upload session也是有状态的,没有commit就不可见; 如果commit成功了,这个session就结束了,暂时就不能再去open writer。Writer的实现原理是open一个writer请求,系统会发一个HTP请求到服务端,然后保持这个长链接,写数据时平台会实时地把数据写到服务端,writer是写一个临时目录。根据这个机制可以看到,如果writer或者close失败了,就相当于这个长连接断了。所以writer和close这两个接口是不能重试的,如果writer中间有任何阶段失败了,就需要重新写。 除了正常的commit之外,MaxCompute还支持让用户检查数据正确性。比如用户open了五个writer,commit的时候可以把这五个ID当成例子上传确认。如果检查到服务端与这个例子不一致,commit就会报错。 总结一下,基本的功能点有:批量上传是有状态并发;commit成功后数据才可见; 支持insertOverwrite, 也支持InsertInto语义。Insert overwrite指commit的时候支持使用某个upload session的数据直接overwrite掉一整个分区或者一张表,类似SQL的Insert和Overwrite的功能。这个功能也有使用限制。第一,一个upload session不能超过2万个Block。第二,Block ID会导致数据覆盖。第三,upload session 24小时过期,因为writer数据是写在存储的临时目录的,临时数据有回收周期,超过24小时, writer写过的数据就有可能被回收掉,这个就限制了upload session的生命周期。第四,如果open了一个writer但是不写数据,就相当于占了一个空闲链接,服务端会把这个链接直接断掉。 【流式上传】接下来看一下流式上传的接口。前文中有提到,流式上传是在API上做了简化,还去掉了并发的限制和时间的限制。图中可以看到,接口是CreateStreamUploadSession,写数据的从writer改成了RecordPack。所谓的pack其实相当于一个内存里的buffer,可以用pack.append(record),比如判断size只需要判断这个buffer足够大或者条数足够多,然后再flush就可以了(42到44行)。Pack并不是写网络的,而是写内存的。因此,不同于writer,flush是可以重试的,因为数据都在内存里。并且Pack也没有状态,不需要关心writer的Block ID等等。另外,因为flush成功后数据就可见了,所以session也没有commit这种状态。因此,如果要开发分布式服务,这个相比批量上传就简化很多,没有太多的限制,只需要确保本机内存是否够大就好了。 同时系统还支持了内存的复用,即flush过以后的pack是可以复用的。系统会把上次写满的内存留住,避免产生GC。流式上传只支持InsertInto,因为在API上没有另外的接口,所以InsertOverwrite语义现在是不支持的。另外,流式服务是支持异步数据处理的,也就是除了保证用户通过流式写上来的数据可读之外,服务端还有一个机制能识别出来新写进来的数据和存量数据,可以对新写出来的数据做一些异步的处理,比如zorder by排序和墨纸。 ZorderBy排序是指一种数据的组织方式,可以把存在MaxCompute的数据按某些规则重新组织一遍,这样查询的时候效率会非常高。墨纸是指支持把数据在后端重新写一遍,把一些很碎的数据重新组织成存储数据存储效率较高的数据文件。在这个基础上还可以做一些排序和其他的处理,后续会再加更多的功能。 流式上传也会有一些限制。首先在写的时候,系统会对这个表加锁,流式写的时候其他的操作是不能写的,比如InsertInto和Insert Overwrite是会失败的,要把流式停掉之后才能正常写。另外,DDL有一些延迟,如果要drop table或者rename table的话,可能drop完还能成功写几条数据,会有最多60秒的延迟。如果有这种场景,建议先把流式停掉再去drop或者rename。 【批量下载】接下来介绍批量下载的接口。图中可以看到,TableTunnel创建了一个叫downloadSession的对象。可以得到record Count,指一个分区或者一张表的总行数。下面是open reader,可以和批量上传对应起来: reader和writer; uploadSession和downloadSession。Openreader是按record来区分的,比如有1000行,可以分十个100行并发下载。Download支持列裁剪,也就是可以下载其中几列。下载查询结果就把TableTunnel入口类改成InstanceTunnel,odps也是一样,53行就不是project, table了,是一个InstanceID。 使用限制方面,和批量上传类似,DownloadSession限制也是24小时,因为它也有临时文件。同样空闲链接120秒超时,另外还有Project级别并发限流,性能受碎片文件影响。 五、最佳实践从图中可以看到,如果并发很高,不推荐走批量接口,因为并发限流是project级别的,如果上传或者下载的限额打满,整个project的批量上传都会失败。 这种接口推荐把并发降下来,然后充分利用并发约10兆每秒的吞吐能力。流式因为架构上的原因,是不受并发限制的。QPS不建议批量上传,因为碎片文件的问题,不建议用特别高的QPS来用批量的接口写数据。 如果QPS和并发都不高,使用这三种方式都不会很受限制。 另外有几个场景,transaction现在支持批量上传,流式上传后续会跟进。目前流式上传不支持Insert Overwrite,可能后面也不一定会开发,因为这个场景明显是一个批量的语义。 以上就是关于MaxCompute Tunnel技术原理及开发实践的介绍。更多关于大数据计算产品技术交流,可扫码加入 “MaxCompute开发者社区” 钉钉群进行咨询。
本篇内容 分享人: 哈白 阿里云智能 技术专家视频地址:https://yqh.aliyun.com/live/detail/21707本篇主要通过3个部分介绍如何控制MaxCompute 的资源使用和消费。 MaxCompute的计费模式 消费预警 消费控制 一、MaxCompute的计费模式MaxCompute分为三种资源,分别是计算、存储和下载流量,其中计算占费用的主要部分,其次是下载流量,最后是存储。MaxCompute为计算和下载流量的计费都提供了预警和控制的能力,对于这几种资源MaxCompute也都提供了三种计费模式。1)包年包月这种方式需要预先购买一定的资源,使用时就在这部分资源内进行使用,如果对资源的需求过多,就可能会出现排队等资源的问题。2)按量计费这种计费方式,不需要预先购买一定的资源,只需在完成作业后根据使用的资源量来进行计算费用。3)同时使用包年包月和按量计费这是一种是比较新的方式,也就是在包年包月的基础上开通一个项目的按量计费能力。 二、消费预警为什么要进行消费预警和控制? 对于包年包月的套餐模式经常会遇到一些问题,比如,资源使用过满、资源被某一个特别大的作业占满、提交的作业太多,其他人把自己的Quota组占满了,这个时候就需要及时知道发生的状况并做处理,否则就会无法执行。 对于按量付费计费模式也是如此。比如,某些用户提交了全表扫描、一些定时跑的任务输入数据表的数据量突然增大、某些用户突然提交了大量的作业,有可能是操作失误,也有可能是提交作业的逻辑程序有bug,在按量付费的情况下,会造成更加严重的问题。 所以在面对这些情况的时候,必须有一种机制帮助用户提前预警消费资源使用。并且这种按量的付费,还能帮助用户去控制消费的额度。 从消费预警来讲起,MaxCompute是通过云监控来实现消费预警的。上图是一个云监控的页面,在上面可以配置一些报警的阈值,还有一些资源使用,资源占用的阈值。包年包月主要是对资源使用量进行报警。还可以对按量付费进行创建报警规则(如上图)。这个时候单位就可以选择人民币了。包年包月还有用户级的,方法也是一样,都是对于一个用户下所有的Quota组进行报警。另外还可以对下载流量进行预警。在产品部分选择MaxCompute通用,而不是包年包月或按量计费。再选择资源范围和地域,规则按照图中的配置,报警的阈值单位是兆,也就是当下载量超过一定MB的时候,就会按照配置的联系人去通知进行报警。只有公网的下载会收费,vpc等内部的网络下载都不会收费。最后还有一个,对产品整体进行消费预警。比如MaxCompute的服务,各种各样的消费加在一起进行预警,总共的阈值不能超过一定量。这个不是通过云监控完成的,是阿里云支持的。 除此之外,还可以利用MaxCompute提供的一系列分析服务进行自己分析消费和自定义告警。比如说有下面几个问题:如何分析一个详单数据?如何找到topN的消费用户?如何找到topN的耗时任务?如何定时推送分析报告?如何统计个人账号的资源使用情况?举其中一个例子,比如可以通过information schema这种机制来找到topN的消费用户,或者是找到topN的耗时任务,在阿里云的官网文档上可以找到。后面可以通过钉钉机器人推送到钉群的方法来实现对分析报告或者是报警的推送。相关文章参考:MaxCompute账号费用及任务耗时TOPN统计:https://developer.aliyun.com/article/778447MaxCompute消费监控最佳实践:https://developer.aliyun.com/article/781312三、消费控制如果报警没有被看到,或者消费增长的速度特别的快,就需要一种更严格的机制——消费控制。当消费超过设置或者期望的数量时,就会直接拒绝用户再提交作业。消费控制主要是针对按量付费来说的,因为按量付费资源使用过多就会直接涉及到更多的消费。 MaxCompute目前提供了对于SQL的消费按量控制,需要使用odps的客户端。下载客户端之后先把环境准备好,配置上project owner或者super admin的ak, 也可以由project owner或者super admin登录DataWorks上的临时查询来设置。首先,对于单条SQL,执行之前设置一个预期的消费阈值,提交SQL的时候系统会自动地分析这条SQL可能会消费多少,如果超过了这个消费的值就会直接报错。图中的右上图是一个例子。阈值单位不是人民币,是SQL读取量(GB)x SQL的复杂度,直接把价格放进去会影响准确度。当执行一条SQL的时候,在没有用任何资源的时候,系统评估花费输入数据量可能是0.12037908GB,复杂度是1.0,这就超过了预设的值,无法执行这条SQL。另外还能设置项目级,和session级不同,通过setproject这个命令把第三行中的flag设置成一个值,这一次设置就是永久生效的。退出客户端,或者DateWorks上的定时任务,或是其他用户在其他设备上重启这个客户端,都会看到这样的一个阈值,他们提交作业的时候同样也会受到这个阈值的限制。当然,有单条SQL的控制是不够的,所以平台还提供了累计的消费控制。目前实现的是按日累计的消费控制,可以通过在项目级设置。上图是一个例子,目前用户可以改的是SQL:后面的数值,这个单位是人民币,比如说可以设置0.5元。这时执行一句SQL并不会受到控制,因为花费没有超过,再次执行一个SQL时,累计的消费就超过0.5了。一天之内所有的SQL会累计起来,直到消费超过了设置的累计预值就不能再提交SQL了。系统会预估当前消费,和累计的消费求和,来判断预估的消费加累计的消费是否超过设的上限。这种方式就是一个实时的控制,但是实时性并不是很强,可能会产生5~10秒的延迟。它的单位是扫描的数据量(GB)乘以复杂度再乘以0.3,其中0.3是预设上去的一个单价,是可以修改的。最后说明一点,可能有些用户会使用limit这个关键字去控制自己的消费。其实这样的控制方法是错误的,因为很多情况下limit其实都不能控制费用,比如图中的两种情况。如果想费用控制,使用前文提到的方法为好,不要使用Limit。以上就是对MaxCompute消费预警和控制方法的基本介绍。更多关于大数据计算产品技术交流,可扫码加入 “MaxCompute开发者社区” 钉钉群进行咨询。
一. MaxCompute Spark 介绍MaxCompute Spark是MaxCompute提供的兼容开源的Spark计算服务。它在统一的计算资源和数据集权限体系之上,提供Spark计算框架,支持用户以熟悉的开发使用方式提交运行Spark作业,以满足更丰富的数据处理分析场景。1.1 关键特性支持原生多版本Spark作业社区原生Spark运行在MaxCompute里,完全兼容Spark的API,支持多个Spark版本同时运行统一的计算资源像MaxCompute SQL/MR等任务类型一样,运行在MaxCompute项目开通的统一计算资源中统一的数据和权限管理遵循MaxCompute项目的权限体系,在访问用户权限范围内安全地查询数据与开源系统相同的使用体验提供原生的开源实时Spark UI和查询历史日志的功能1.2 系统结构 原生Spark通过MaxCompute Cupid平台能够在MaxCompute中运行 1.3 约束与限制 目前MaxCompute Spark支持以下适用场景:离线计算场景:GraphX、Mllib、RDD、Spark-SQL、PySpark等Streaming场景读写MaxCompute Table引用MaxCompute中的文件资源读写VPC环境下的服务,如RDS、Redis、HBase、ECS上部署的服务等读写OSS非结构化存储使用限制不支持交互式类需求Spark-Shell、Spark-SQL-Shell、PySpark-Shell等不支持访问MaxCompute外部表,函数和UDF只支持Local模式和Yarn-cluster模式运行二. 开发环境搭建2.1 运行模式通过Spark客户端提交Yarn-Cluster模式,提交任务到MaxCompute集群中Local模式通过Dataworks提交本质上也是Yarn-Cluster模式,提交任务到MaxCompute集群中2.2 通过客户端提交2.2.1 Yarn-Cluster模式下载MC Spark客户端Spark 1.6.3Spark 2.3.0环境变量配置## JAVA_HOME配置 # 推荐使用JDK 1.8 export JAVA_HOME=/path/to/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH ## SPARK_HOME设置 # 下载上文提到的MaxCompute Spark客户端并解压到本地任意路径 # 请不要直接设置SPARK_HOME等于以下路径下述路径仅做展示用途 # 请指向正确的路径 export SPARK_HOME=/path/to/spark_extracted_package export PATH=$SPARK_HOME/bin:$PATH ## PySpark配置Python版本 export PATH=/path/to/python/bin/:$PATH参数配置将$SPARK_HOME/conf/spark-defaults.conf.template 重命名为 spark-defaults.conf参数配置参考下文准备项目工程git clone https://github.com/aliyun/MaxCompute-Spark.git cd spark-2.x mvn clean package任务提交// bash环境 cd $SPARK_HOME bin/spark-submit --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi \ /path/to/MaxCompute-Spark/spark-2.x/target/spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar // 在windows环境提交的命令 cd $SPARK_HOME/bin spark-submit.cmd --master yarn-cluster --class com.aliyun.odps.spark.examples.SparkPi \path\to\MaxCompute-Spark\spark-2.x\target\spark-examples_2.11-1.0.0-SNAPSHOT-shaded.jar 2.2.2 Local模式与Yarn Cluster模式类似,用户首先需要做以上准备工作任务提交## Java/Scala cd $SPARK_HOME ./bin/spark-submit --master local[4] --class com.aliyun.odps.spark.examples.SparkPi \ /path/to/odps-spark-examples/spark-examples/target/spark-examples-2.0.0-SNAPSHOT-shaded.jar ## PySpark cd $SPARK_HOME ./bin/spark-submit --master local[4] \ /path/to/odps-spark-examples/spark-examples/src/main/python/odps_table_rw.pyIDEA调试注意IDEA运行Local模式是不能直接引用spark-defaults.conf里的配置,需要手动在代码里指定相关配置一定要注意需要在IDEA里手动添加MaxCompute Spark客户端的相关依赖(jars目录),否则会出现以下报错:the value of spark.sql.catalogimplementation should be one of hive in-memory but was odps参考文档2.3 通过DataWorks提交2.3.1 资源上传本质上MC Spark节点的配置对应于spark-submit命令的参数和选项ODPS SPARK节点spark-submit主Java、Python资源app jar or python file配置项--conf PROP=VALUEMain Class--class CLASS_NAME参数[app arguments]选择JAR资源--jars JARS选择Python资源--py-files PY_FILES选择File资源--files FILES选择Archives资源--archives上传资源:0~50MB:可以直接在DataWorks界面创建资源并上传50MB~500MB:可以先利用MaxCompute客户端(CMD)上传,然后在DataWorks界面添加到数据开发,参考文档资源引用:资源提交后,可以在DataWorks Spark节点界面选择需要的资源(jar/python/file/archive)任务运行时:资源文件默认会上传到Driver和Executor的当前工作目录2.3.2 参数和配置Spark 配置项:对应于spark-submit命令的--conf选项accessid,accesskey,projectname,endpoint,runtime.end.point,task.major.version无需配置除此之外,需要将spark-default.conf中的配置逐条加到dataworks的配置项中给主类传参数(如bizdate)首先在调度->参数中添加参数,然后在Spark节点“参数”栏引用该参数。多个参数用空格分隔该参数会传给用户主类,用户在代码中解析该参数即可参考文档三. 配置介绍3.1 配置的位置3.1.1 Spark配置的位置用户使用Maxcompute Spark通常会有几个位置可以添加Spark配置,主要包括:位置1:spark-defaults.conf,用户通过客户端提交时在spark-defaults.conf文件中添加的Spark配置位置2:dataworks的配置项,用户通过dataworks提交时在配置项添加的Spark配置,这部分配置最终会在位置3中被添加位置3:配置在启动脚本spark-submit --conf选项中位置4:配置在用户代码中,用户在初始化SparkContext时设置的Spark配置Spark配置的优先级用户代码 > spark-submit --选项 > spark-defaults.conf配置 > spark-env.sh配置 > 默认值3.1.2 需要区分的两种配置一种是必须要配置在spark-defaults.conf或者dataworks的配置项中才能生效(在任务提交之前需要),而不能配置在用户代码中,这类配置主要的特征是:与Maxcompute/Cupid平台相关:一般参数名中都会带odps或者cupid,通常这些参数与任务提交/资源申请都关系:显而易见,一些资源获取(如driver的内存,core,diskdriver,maxcompute资源),在任务执行之前就会用到,如果这些参数设置在代码中,很明显平台没有办法读到,所以这些参数一定不要配置在代码中其中一些参数即使配置在代码中,也不会造成任务失败,但是不会生效其中一些参数配置在代码中,可能会造成副作用:如在yarn-cluster模式下设置spark.master为local访问VPC的参数:这类参数也与平台相关,打通网络是在提交任务时就进行的一种是在以上三种位置配置都可以生效,但是在代码配置的优先级最高推荐把任务运行与优化相关的参数配置在代码中,而与资源平台相关的配置都配置在spark-defaults.conf或者dataworks的配置项中。3.2 资源相关的参数spark.executor.instances总共申请的executor数目普通任务十几个或者几十个足够了,若是处理大量数据时可以申请多一些,100—2000+spark.executor.cores每个executor的核数Job的最大并行度是executor数目*executor core数spark.executor.memory代表申请executor的内存spark.yarn.executor.memoryOverhead申请executor的堆外内存,默认单位是MB主要用于JVM自身,字符串, NIO Buffer等开销单个executor的总内存是:spark.executor.memory+spark.yarn.executor.memoryOverheadspark.driver.cores类似executorspark.driver.memory类似executorspark.yarn.driver.memoryOverhead类似executorspark.driver.maxResultSize默认1g,控制worker送回driver的数据大小,一旦超过该限制,driver会终止执行spark.hadoop.odps.cupid.disk.driver.device_size代表本地网盘大小,默认值为20g当出现No space left on device时可适当调大该值,最大支持100g设置该参数需要包含单位‘g’3.3 平台相关的参数spark.hadoop.odps.project.nameSpark任务运行所在的projectspark.hadoop.odps.access.id提交spark任务的accessIdspark.hadoop.odps.access.key提交spark任务的accessKeyspark.hadoop.odps.end.point用于任务提交中国公共云一般设置为http://service.cn.maxcompute.aliyun.com/apispark.hadoop.odps.runtime.end.point用于任务运行中国公共云一般设置为http://service.cn.maxcompute.aliyun-inc.com/apispark.hadoop.odps.task.major.version代表当前使用的平台版本公共云设置为cupid_v2即可spark.sql.catalogImplementationSpark 2.3版本需要设置为odpsSpark 2.4以后版本会改为hive为了便于作业迁移,建议不要将该配置写在代码中spark.hadoop.odps.cupid.resources该配置项指定了程序运行所需要的Maxcompute资源,格式为<projectname>.<resourcename>,可指定多个,用逗号分隔。指定的资源将被下载到driver和executor的工作目录,经常使用该参数来引用较大的文件。资源下载到目录后默认的名字是<projectname>.<resourcename>如果需要重新命名,需要在配置时通过<projectname>.<resourcename>:<new resource name>进行重命名spark.hadoop.odps.cupid.vectorization.enable是否开启向量化读写,默认为truespark.hadoop.odps.input.split.size用于调节读Maxcompute表的并发度默认每个分区为256MB,该参数单位为MBspark.hadoop.odps.cupid.vpc.domain.listvpc访问依赖的参数,传统的访问vpc的方式spark.hadoop.odps.cupid.smartnat.enablevpc访问依赖的参数如果region是北京或者上海,将该参数设置为truespark.hadoop.odps.cupid.eni.enable如果用户已开通专线,则需要配置为truespark.hadoop.odps.cupid.eni.info 如果用户已开通专线,则需要设置该参数该参数代表用户打通的vpcspark.hadoop.odps.cupid.engine.running.type普通作业3天没跑完就会被强制回收,流式作业需要设置此值为longtimespark.hadoop.odps.cupid.job.capability.duration.hours流式作业权限文件expired时间,单位小时spark.hadoop.odps.moye.trackurl.dutation流式作业jobview expired时间,单位小时四. 作业诊断4.1 Logview4.1.1 Logview 介绍在任务提交时会打印日志: 日志中含有logview链接 (关键字 logview url)Master以及Worker的StdErr打印的是spark引擎输出的日志,StdOut中打印用户作业输出到控制台的内容4.1.2 利用Logview 排查问题拿到Logview,一般首先看Driver的报错,Driver会包含一些关键性的错误如果Driver中出现类或者方法找不到的问题,一般是jar包打包的问题如果Driver中出现连接外部VPC或者OSS出现Time out,这种情况一般要去排查一下参数配置如果Driver中出现连接不到Executor,或者找不到Chunk等错误,通常是Executor已经提前退出,需要进一步查看Executor的报错,可能存在OOM根据End Time做排序,结束时间越早,越容易是发生问题的Executor节点根据Latency做排序,Latency代表了Executor的存活的时间,存活时间越短的,越有可能是根因所在 4.2 Spark UI和HistoryServerSpark UI与社区版一致,在logivew的summary模块下找到Spark UI链接: Spark UI的使用与社区原生版是一致的,可以参考文档注意Spark UI需要鉴权,只有提交任务的Owner才能打开Spark UI仅在作业运行时才能打开,如果任务已经结束,那么Spark UI是无法打开的,这时候需要查看Spark History Server UI五. 常见问题1. local模式运行的问题问题一:the value of spark.sql.catalogimplementation should be one of hive in-memory but was odps原因在于用户没有正确地按照文档将Maxcompute Spark的jars目录添加到类路径,导致加载了社区版的spark包,需要按照文档将jars目录添加到类路径问题二:IDEA Local模式是不能直接引用spark-defaults.conf里的配置,必须要把Spark配置项写在代码中问题三:访问OSS和VPC:Local模式是处于用户本机环境,网络没有隔离。而Yarn-Cluster模式是处于Maxcompute的网络隔离环境中,必须要要配置vpc访问的相关参数Local模式下访问oss的endpoint通常是外网endpoint,而Yarn-cluster模式下访问vpc的endpoint是经典网络endpoint2. jar包打包的问题java/scala程序经常会遇到Java类找不到/类冲突问题:类冲突:用户Jar包与Spark或平台依赖的Jar包冲突类没有找到:用户Jar包没有打成Fat Jar或者由于类冲突引起打包需要注意:依赖为provided和compile的区别:provided:代码依赖该jar包,但是只在编译的时候需要用,而运行时不需要,运行时会去集群中去寻找的相应的jar包compile:代码依赖该jar包,在编译、运行时候都需要,在集群中不存在这些jar包,需要用户打到自己的jar包中。这种类型的jar包一般是一些三方库,且与spark运行无关,与用户代码逻辑有关用户提交的jar包必须是Fat jar:必须要把compile类型的依赖都打到用户jar包中,保证代码运行时能加载到这些依赖的类需要设置为provided的jar包groupId为org.apache.spark的Jar包平台相关的Jar包cupid-sdkhadoop-yarn-clientodps-sdk需要设置为compile的jar包oss相关的jar包hadoop-fs-oss用户访问其他服务用到的jar包:如mysql,hbase用户代码需要引用的第三方库3. 需要引入Python包很多时候用户需要用到外部Python依赖首先推荐用户使用我们打包的公共资源,包含了常用的一些数据处理,计算,以及连接外部服务(mysql,redis,hbase)的三方库## 公共资源python2.7.13 spark.hadoop.odps.cupid.resources = public.python-2.7.13-ucs4.tar.gz spark.pyspark.python = ./public.python-2.7.13-ucs4.tar.gz/python-2.7.13-ucs4/bin/python ## 公共资源python3.7.9 spark.hadoop.odps.cupid.resources = public.python-3.7.9-ucs4.tar.gz spark.pyspark.python = ./public.python-3.7.9-ucs4.tar.gz/python-3.7.9-ucs4/bin/python3如果不能满足用户需要,用户可以在该公共资源的基础上上传wheel包如果wheel包依赖链较为复杂,可以通过Docker容器进行打包使用Docker容器打包:为了保证与线上环境一致,避免运行时so包找不到的问题,需要使用Docker容器进行打包Docker容器本质只是提供了兼容性较好的os环境,用户需要在容器中进行打包,并将整个Python目录压缩后上传到MaxCompute Resource中,最后在Spark任务中直接引用即可参见文档4. 需要引入外部文件需要引用到外部文件的场景用户作业需要读取一些配置文件用户作业需要额外的jar包/Python库可以通过两种方式上传资源:通过Spark参数上传文件通过MaxCompute Resource上传文件通过Spark参数上传文件MaxCompute Spark支持Spark社区版原生的--jars,--py-files等参数,可以在作业提交时通过这些参数将文件上传,这些文件在任务运行时会被上传到用户的工作目录下通过DataWorks添加任务需要的资源,参见上文MaxCompute Resourcespark.hadoop.odps.cupid.resources参数,可以直接引用MaxCompute中的资源,这些资源在任务运行时也会被上传到用户的工作目录下使用方式(1)通过MaxCompute客户端将文件上传(单个文件最大支持500MB)(2)在Spark作业配置中添加spark.hadoop.odps.cupid.resources参数:格式为<projectname>.<resourcename>,如果需要引用多个文件,需要用逗号隔开(3)如果需要重命名,格式为<projectname>.<resourcename>:<new resource name>如何读取上传的文件:如果需要读取上传的文件资源,文件路径如下:val dir = new File(".") val targetFile = "file://" + dir.getCanonicalPath + "/" +文件名或者直接通过类加载器获取文件路径,然后再读取参考文档5. VPC访问的问题Maxcompute Spark是独立运行在Maxcompute集群的,网络与外界隔离,因此无法直接访问vpc和公网,需要添加以下配置。北京和上海Region使用smartnat需要配置spark.hadoop.odps.cupid.vpc.domain.listspark.hadoop.odps.cupid.smartnat.enable=true访问公网:假如要访问google.com:443,需要做以下两步:提工单设置 project 级别白名单,把 google.com:443 加到odps.security.outbound.internetlist配置作业级别的公网访问白名单:spark.hadoop.odps.cupid.internet.access.list=google.com:443其他Region:只需要配置spark.hadoop.odps.cupid.vpc.domain.list无法访问公网注意事项:vpc.domain.list 需要压缩成一行,不能包含空格支持同时访问同一个Region下的多个VPC,需要配置所有要访问的ip:port的白名单需要在要访问的服务中添加ip白名单,允许100.104.0.0/16网段的访问用户要保证所有可能访问到的IP都已经加到vpc.domain.list,例如如果用户要访问位于hdfs,hbase这种多个节点的服务,一定要把所有的节点都添加进来,不然可能会遇到Time out6. OOM的问题可能出现OOM的情况:错误1: 在某些Executor中出现Cannot allocate memory,一般是系统内存不足,此时可以调整spark.yarn.executor.memoryOverhead参数,注意该参数是会计算到总内存数的,也不需要一次性增加太多,小心调整即可错误2:Executor抛出java.lang.OutOfMemoryError: Java heap space错误3:GC overhead limit exceeded错误4:No route to host: workerd*********/Could not find CoarseGrainedScheduler,这类错误一般是一些Executor提前退出。如果一个task处理的数据非常大,容易发生OOMDriver OOM:Driver OOM的可能性比较小,但是也是有可能出现的如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。SparkContext,DAGScheduler都是运行在Driver端的。Stage切分也是在Driver端运行,如果用户程序有过多的步骤,切分出过多的Stage,这部分信息消耗的是Driver的内存,这个时候就需要调大Driver的内存。有时候如果stage过多,Driver端可能会有栈溢出的问题一些解决方法:限制executor 并行度,将cores 调小:多个同时运行的 Task 会共享一个Executor 的内存,使得单个 Task 可使用的内存减少,调小并行度能缓解内存压力增加单个Executor内存增加分区数量,减少每个executor负载考虑数据倾斜问题,因为数据倾斜导致某个 task 内存不足,其它 task 内存足够7. No space left on device这个错误意味这本地磁盘不足,通常这个报错会在executor上出现,并导致executor挂掉解决方案直接增加更多的磁盘空间:默认driver和executor都各提供20g的本地磁盘,当磁盘空间不足时可以调整spark.hadoop.odps.cupid.disk.driver.device_size如果调整本地磁盘大小到100g后,仍然报该错误,说明单个executor写的shuffle数据已经超过上限,可能是遇到了数据倾斜,这种情况下可以对数据重分区。或者增加executor的数量8. 申请资源的问题申请不到资源的几种现象:(1)在driver端一般会打以下日志WARN YarnClusterScheduler: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources(2)在logview中只能看到driver,而worker数量为0(3)在spark ui中只能看到driver,而worker数量为0解决方案:调整任务资源:调整用户申请的executor总数或者单个executor的资源数量(一般是内存),如果单个executor请求的内存过多可能不太容易申请到合理安排任务执行时间其他注意事项:必须配置spark.master=yarn-cluster才会正确的申请资源9. 其他问题如何切换Spark版本版本号规则介绍:示例spark-2.3.0-odps0.32.5spark-2.3.0是社区版本的spark版本号,Maxcompute Spark基于该社区版本进行适配odps0.32.5是Maxcompute Spark的小版本号,随着小版本号的升级,可能进行一些bug修复和sdk的升级用户提交作业的的Spark版本可能有以下几种情况:情况1:直接通过本地客户端提交任务,spark版本就是用户本地客户端的版本情况2:用户通过dataworks提交任务,取决于dataworks gateway的默认spark版本,当前公共云dataworks 公共资源组gateway的默认版本是spark-2.3.0-odps0.32.1情况3:用户通过dataworks提交任务,配置参数spark.hadoop.odps.spark.version,则会按照配置的版本号来寻找对应的spark客户端,用户可以配置spark.hadoop.odps.spark.version=spark-2.3.0-odps0.32.5手动切换版本情况4:该情况优先级最高,用户可以在本地客户端或者是dataworks提交任务时配置以下参数,则类加载的优先级最高,因此会在spark任务启动时优先使用该版本的sparkspark.hadoop.odps.cupid.resources = public.__spark_libs__2.3.0odps0.32.5.zip spark.driver.extraClassPath = ./public.__spark_libs__2.3.0odps0.32.5.zip/* spark.executor.extraClassPath = ./public.__spark_libs__2.3.0odps0.32.5.zip/* 需要在代码中访问配置项:spark开头的参数直接通过SparkConf类提供的接口直接读取即可Spark History Server渲染速度慢可以添加压缩配置:spark.eventLog.compress=true如何正确地Kill一个运行中的Spark任务通常通过两种方式kill正在运行的Spark任务(1)通过odps cmd 执行 kill + instanceId; (2)通过dataworks界面执行stop注意,直接在spark客户端或者dataworks的任务提交界面执行Ctrl + C是无法kill一个Spark任务的日志中文乱码,添加以下配置spark.executor.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8spark.driver.extraJavaOptions=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8如果是pyspark作业需要设置下如下两个参数:spark.yarn.appMasterEnv.PYTHONIOENCODING=utf8spark.executorEnv.PYTHONIOENCODING=utf8另外在python脚本的最前面加上如下的代码:# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8')六. 相关文档MC Spark github wiki:https://github.com/aliyun/MaxCompute-Spark/wikiSpark UI:https://spark.apache.org/docs/latest/web-ui.htmlSpark 配置:https://spark.apache.org/docs/2.4.5/configuration.html
2021年01月
2020年12月
substr 是对字符串截取 (),该函数里面的 两个参数 是 下标和截取个数,代码截的是 string类型,外面的 cast 函数是对类型进行转换,如果里面截出来的例如:abc,根本无法转换成 bigint,如果截出来是数字 123 是可以的 转成 bigint的。 例如:select cast(substr("1234",1,1) as BIGINT );
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
Dataworks上默认未开启Instance Tunnel,即instance.open_reader默认使用Result接口,最多可以获取一万条记录。开启Instance Tunnel后,可以通过reader.count获取记录数。
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
有两个方法:1、拆分字段。2、使用独享资源组,再提工单绑定可以解决大于8MB问题。
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以,授权就可以。可以参考一下文档:https://help.aliyun.com/document_detail/27935.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以,参考一下Tunnel 命令说明文档:https://help.aliyun.com/document_detail/27833.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以执行一下explian,参考官方文档: https://help.aliyun.com/document_detail/73787.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
select *from table where dt='1'; 可以参考文档: https://help.aliyun.com/document_detail/73777.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
substr 是对字符串截取 (),该函数里面的 两个参数 是 下标和截取个数,代码截的是 string类型,外面的 cast 函数是对类型进行转换,如果里面截出来的例如:abc,根本无法转换成 bigint,如果截出来是数字 123 是可以的 转成 bigint的。 例如:select cast(substr("1234",1,1) as BIGINT );
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
Dataworks上默认未开启Instance Tunnel,即instance.open_reader默认使用Result接口,最多可以获取一万条记录。开启Instance Tunnel后,可以通过reader.count获取记录数。
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
有两个方法:1、拆分字段。2、使用独享资源组,再提工单绑定可以解决大于8MB问题。
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以,授权就可以。可以参考一下文档:https://help.aliyun.com/document_detail/27935.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以,参考一下Tunnel 命令说明文档:https://help.aliyun.com/document_detail/27833.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以执行一下explian,参考官方文档: https://help.aliyun.com/document_detail/73787.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
select *from table where dt='1'; 可以参考文档: https://help.aliyun.com/document_detail/73777.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
insert overwrite 不支持指定插入列的功能,可以用insert into或者设计一张拉链表。可以参考这篇文章: https://developer.aliyun.com/article/542146
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接
可以使用DDL语句ALTER TABLE 修改。可以参考文档: https://help.aliyun.com/document_detail/73771.html
如有更多疑问咨询可以加入MaxCompute开发者社区钉群点击链接