原文链接:http://click.aliyun.com/m/14004/

本文主要介绍一些ODPS表操作的优化技巧,通过这些技巧,可以有效节省ODPS存储空间和计算量。

合理设置分区表

ODPS支持分区表的概念,分区表指的是在创建表时指定的partition的分区空间,即指定表内的某几个字段作为分区列。在大多数情况下,用户可以将分区类比为文件系统下的目录。 ODPS将分区列的每个值作为一个分区(目录)。用户可以指定多级分区,即将表的多个字段作为表的分区,分区之间正如多级目录的关系。在使用数据时如果指定了需要访问的分区名称,则只会读取相应的分区,避免全表扫描,提高处理效率,降低费用。
比如:create table src (key string, value bigint) partitioned by (pt string);,使用select * from src where pt='20160901';指定正确的分区格式,ODPS在生成查询计划时只会将’20151201’分区的数据纳入输入中。如果没有指定分区,比如select * from src where key = ‘MaxCompute’;查询计划会扫描全表数据。
常见的分区设置方式有根据日期或者地区(国家),也可以根据业务需要自行设置。
ODPS支持多级分区,比如

create table if not exists sale_detail(
    shop_name     string,
    customer_id   string,
    total_price   double)
    partitioned by (sale_date string,region string);

创建一个二级分区表,第一级分区sale_date是日期,第二级分区region是地区。

设置合理的表生命周期

ODPS平台中存储资源是非常宝贵的。可以根据数据本身的使用情况,对表设置生命周期,ODPS会及时删除超过生命周期的数据,达到节省存储空间的目的。比如create table test3 (key boolean) partitioned by (pt string, ds string) lifecycle 100; 创建一张生命周期为100的表。如果这张表或者分区的最后修改时间超过了100天将会被删掉。需要注意的是生命周期是以分区为最小单位的,所以一个分区表,如果部分分区达到了生命周期的阀值,那么这些分区会被直接删掉,未达到生命周期阀值的分区不受影响。
另外可以通过命令 alter table table_name set lifecycle days;修改已经创建好的表的生命周期。

归档冷数据

有些数据需要永久或者较长时间保存下来,但是随着时间的推移,使用频率会越来越低。当数据使用频率降低到一定程度后,可以考虑将数据进行归档操作。归档功能将数据存为raid file,数据不再简单的存三份,而是采用Cauchy Reed Solomon算法,将数据存为6份数据+3份校验块的方式,这样有效的存储比约为从1:3提高到1:1.5。另外ODPS归档表的压缩算法采用了压缩率更高的bzip2算法。综合两种算法,存储空间可以节省70%以上。归档命令格式如下:ALTER TABLE table_name [PARTITION(partition_name='partition_value')] ARCHIVE; 示例:alter table my_log partition(ds='20140101') archive;

合并小文件

在reduce计算过程或者实时tunnel数据采集过程,会产生大量小文件。
小文件过多会带来以下问题:
1. 小文件越多,单个instance可以处理的文件数有限制,所以需要instance资源也越多。如此造成浪费资源,影响整体的执行性能。
2. 过多的小文件给文件系统带来压力,并且影响磁盘空间的利用率。
目前提供两种可供选择的小文件合并的方法:ALTER合并模式和SQL合并模式
1. ALTER合并模式 通过console命令行进行合并,命令格式如下:ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;
2. SQL合并模式
执行SQL结束之后,通过设置控制参数odps.task.merge.enabled=true;进行是否需要小文件合并的判断,如果需要小文件合并,则另外启动Fuxi Job进行小文件合并。
在合并小文件时,可以通过一系列参数配置达到最佳merge效果,具体可以参考http://help.aliyun-inc.com/internaldoc/detail/34527.html?spm=0.0.0.0.S6m4Rx

数据重新分布

ODPS表是数据的集合,也就是说不同的数据分布表对ODPS来说是等价的。但是在实际存储中,不同数据分布对压缩算法的友好度也很大差别。下图是我们对一张表针对不同列进行排序的结果,在不同的数据分布的情况下,压缩效果差距还是相当大的。
MaxCompute 存储优化技巧_第1张图片
一般说来,每个表中都有存在1个或几个对存储空间影响比较的字段,这些字段就是影响压缩效果的关键。目前看来,平均字段长度,唯一值个数是两个极其关键的参考值。