摘要: MaxCompute是一套阿里自主研发的数据仓库解决方案。产品除了功能、性能、简单等优点外,还能在费用上节省下一大笔前。墨迹天气使用MaxCompute,除了性能和稳定性也有提高外,总体存储和计算的费用比以前节省70%。这是如何作到的呢,这里有一些经常使用的规则。html
原文连接:http://click.aliyun.com/m/43695/web
MaxCompute是一套阿里自主研发的数据仓库解决方案。产品除了功能、性能、简单等优点外,还能在费用上节省下一大笔前。墨迹天气使用MaxCompute,除了性能和稳定性也有提高外,总体存储和计算的费用比以前节省70%。这是如何作到的呢,这里有一些经常使用的规则。算法
在讨论如何作到以前,咱们先看下MaxCompute是如何计费的。根据目前的文档,目前的计费方式包含数据的存储、数据的下载以及计算费用。其中计算费用又分I/O后付费和预付费两种收费模式。I/O后付费根据实际的计算来进行收费;而预付费至关于包了几个CU只有购买者可使用,这几个CU上随便怎么计算都不会产生计算费用。因此如何减小费用,也就是转换成如何减小存储的费用、如何减小下载的费用以及如何减小计算的费用。sql
存储架构
数据存储在MaxCompute上是使用列式存储并有压缩的,底层数据存储方式不须要用户本身维护。可是用户能够经过减小存储在MaxCompute上的数据量来减小存储的费用。能够经过及时删除不须要的数据来减小存储费用。这里须要推荐用一个叫生命周期(lifecycle)的功能来定时回收过时的数据。设置了生命周期后,若是是分区表,分区表里的某个分区若是在指定的时间内数据没发生变动,系统会认为这个分区已经不须要了,会自动删除这个分区。若是是非分区表的话,指定的时间内没有数据变化就会删除这整张表。这个功能能够用来配置到一些历史记录表上,好比说若是不想要一年以前的历史记录,能够把表根据写入时间作分区,而后设置生命周期为一年。数据写入的时候,天天数据只写入到当天的那个分区里。一年后,以前的数据由于一全年都没有数据写入,触发生命周期的条件,并后台定时做业删除对应的分区里的数据。性能
在实际使用中,除了由于没及时删除过时不要的历史记录形成的额外的存储费用外,更多的是由于对数据的管理不到位致使的一些不须要的表一直没删除致使的空间占用。仔细想一想,在作查询的时候使用Create table xx as select先存了一些临时表,用好没删除一直放着占用从存储空间,这种事情应该每一个人都作过一些。可是若是你真的要去找找哪些数据须要删除,哪些数据是业务数据不能动的时候,对着list tables;出来的几百几千张表也是很无从下手吧。对数据仓库作好分层,作好命名规范,对于每一层根据使用须要配置不一样的生命周期回收策略,用一个好的数据管理来保证数据仓库的表的有序存储,不只能节省一笔存储的钱,也能在实际使用的时候,快速找到须要的表,便于数据的管理和使用。而若是有一些计算过程产生的临时表,后续又肯定用不到的,能够在计算结束及时删除。具体能够参考祎休写的基于阿里云数加的企业大数据仓库架构建设思路有比较详细的说明。大数据
下载优化
下载数据并不是所有都会收费的,有一些状况下数据下载也不会产生费用。合理利用这些规则,选择正确的下载方式就能减小下载的费用(并且下载不收费的方式也正好是下载最快的方式)。具体的规则能够参考文档。阿里云
另外下载的费用,还和下载的文件的大小有关系。经过合理的表结构设置和数据生成方式,把每次须要下载的数据放到一张表(或一个分区)里,减小下载量也是减小费用的一种策略。好比说须要下载3年级的学生信息的时候,下载所有的学生信息后再执行过滤,确定比不过先根据年级对学生进行分区,而后只下载3年级的分区来的方法好。htm
计算
计算里须要注意的相对会多一些。不过咱们仍是先看看计算的费用和什么有关。先说I/O后付费,如今暂时还只是收取了SQL的费用,因此本文也只讲SQL的部分。看到SQL的费用是根据输入的数据量和SQL的算法复杂度有关的。
计算引擎在计算的时候,合理设置表的分区字段能够减小数据的输入量。关于分区能够参考这里。计算引擎在作执行计划解析的时候,若是发现查询过滤条件是用分区字段作过滤的时候,能够只读计算涉及的分区的数据,从而减小输入的数据量。
除了减小输入的数据量,减小计算复杂度也是一种方法。算法复杂度的优化通常涉及到代码层面的优化,并且有时候须要和业务结合起来。好比前面已经有过一些数据预处理知道本次计算的数据某个字段没有重复,那此次计算的时候就能够少加一次distinct或者group by。经过代码层面结合业务逻辑,一块儿优化SQL语句减小计算的复杂度,是减小计算费用的一种方法。
另外减小计算的次数也是一种方法。好比某几个计算都须要用到某个实时表的数据,并且都是在某种过滤和汇总以后的再加工,那彻底能够把中间能够复用的计算过程保存下来,在数据仓库上作适量的轻度汇总甚至高度汇总。后续的计算能够拿汇总数据再作进一步的计算。这样虽然中间多存了一些数据,可是后续的计算的时候能够少算一些逻辑。这是数据仓库里常常用到的空间换时间的方法。配合以前提到的生命周期,能够用最小的存储费用的代价得到最大的计算费用的减小。固然合理利用这种方法,除了能够减小计算费用外,由于减小重复计算,也能够减小计算的时间提升效率。
除了以上提到的这些,也能够考虑后付费的方式来跑计算,也就是计算费用是包年包月的。通常来讲,知足如下条件能够考虑使用后付费
任务大部分是周期任务,任务量比较均匀。若是任务以偶发性的临时查询为主可能不合适用后付费
任务的提交事件比较分散,若是都集中在某个时间点一块儿算的,也不太合适
通过一段时间的试运行,任务数量已经基本能够估计,不会短时间内有比较的明显的增长或者减小
若是不知足这些 条件,者很容易出如今高峰期购买的CU不够用,任务出现排队;低谷的时候资源又利用不起来,形成浪费。
其余
关于费用,其实还有两个很是关键的问题
1.我天天都花了多少钱,如何优化?
能够参考这里,看看天天的帐单,经过检查里面的计算、存储和下载分别产生了多少费用。从而从对应的角度去作优化。另外也能够在表格里作金额的排序,看看金额最高的几笔费用是什么费用,看看可否针对性作一些优化。
2.我这个SQL提交后会产生多少费用?
若是产生的费用都不清楚,那提交一个SQL时内心是没底的。在大数据开发套件的数据开发里,跑SQL会跳出消费提醒,从而提早知道提交后会产生的费用。若是发现金额特别高,能够考虑先作一些优化后再提交以避免产生没必要要的费用。若是是直接在MaxCompute客户端里跑SQL的话,能够用cost sql ;估算SQL的费用。
识别如下二维码,阅读更多干货