MaxCompute 存储优化技巧-程序员宅基地

文章转自duzhuan

本文主要介绍一些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来说是等价的。但是在实际存储中,不同数据分布对压缩算法的友好度也很大差别。下图是我们对一张表针对不同列进行排序的结果,在不同的数据分布的情况下,压缩效果差距还是相当大的。
_2016_09_14_10_15_24
一般说来,每个表中都有存在1个或几个对存储空间影响比较的字段,这些字段就是影响压缩效果的关键。目前看来,平均字段长度,唯一值个数是两个极其关键的参考值。


欢迎加入MaxCompute钉钉群讨论

03ea92a4c1fbb04d443ff8f015c957815055111e


原文链接:

http://click.aliyun.com/m/14004/


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bengsa2291/article/details/62215986

智能推荐

linux如何新建一个beego项目,CentOS7部署beego项目-程序员宅基地

文章浏览阅读208次。前言《beego入门篇——上、中、下》三篇文章中,记录了beego的基本用法。假设已经完成了beego项目的代码,此时我们需要把项目部署到服务器上,本文就研究一下怎样在CentOS7环境里部署beego服务。环境安装golang2、安装golangwget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz3、解压至/usr/local目录ta..._linux centos部署beego

有了这个开源项目,再也不怕去BAT和字节跳动面试考算法了-程序员宅基地

文章浏览阅读1.1k次。热文导读|点击标题阅读互联网寒冬下,程序员如何突围提升自己?已有 Android 项目集成 Flutter 寻坑记“37岁,年薪50万,一夜被裁”:伪上班,毁掉了多..._字节跳动java开源项目

SQL语句中on 、where 和 having的区别_having on语句-程序员宅基地

文章浏览阅读2k次,点赞2次,收藏8次。关键字: on数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left jion时,on和where条件的区别如下:1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的..._having on语句

格林公式计算多边形的面积_格林公式求多边形面积-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏27次。算法导论第31章第一节第8题。只要是边不相交的简单多边形,也就是说,不仅凸多边形,还有各种奇形怪状的凹多边形,都可以用格林公式求出面积。格林公式:若函数P(x,y), Q(x,y)在由一条或几条光滑曲线所围成的闭区域D上连续,且有连续的一阶偏导数,则有L为区域D的边界曲线,并取正方向。边不相交的简单多边形正好是由数条线段围成的闭区域,所以可以使用格林公式。令P=0, Q=x,则面积S = 设第i个..._格林公式求多边形面积

什么是nvm,nvm详解-程序员宅基地

文章浏览阅读9.5k次,点赞3次,收藏3次。nvm1. 概念详情点击nvm全名node.js version management,是一个node的版本管理工具首先最重要的是:一定要卸载已安装的 NodeJS,否则会发生冲突。然后下载 nvm-windows 最新安装包,直接安装即可。_nvm

软件测试影响最深的bug,软件测试面试题-那些让我印象深刻的bug-程序员宅基地

文章浏览阅读7.7k次。相信大家在工作中面试过程中经常被问到,让你印象最深刻的一个bug是什么,这是一个开放性的题目,并没有标准答案,每个人接触过的系统都不一样,遇到过的问题也不一样,可能面试官只是想看一下你的表达能力,以及平常在工作中是否会进行总结。这类问题可以挑选容易被人忽略的场景,难以想到的场景,特殊机型的兼容性或者特殊操作下才会出现的问题等。接下来为大家分享一个我今天遇到的一个问题:由于缓存中key的设置不合理导..._面试过程中遇到你印象最深刻的bug 是什么

随便推点

支持向量机SVM_支持向量机 r2-程序员宅基地

文章浏览阅读322次。支持向量机SVM(Support Vector Machine)【关键词】支持向量,最大几何间隔,拉格朗日乘子法一、支持向量机的原理Support Vector Machine。支持向量机,其含义是通过支持向量运算的分类器。其中“机”的意思是机器,可以理解为分类器。那么什么是支持向量呢?在求解的过程中,会发现只根据部分数据就可以确定分类器,这些数据称为支持向量。见下图,在一个二维环境中,..._支持向量机 r2

序列流--Object_object那些属性不能序列化-程序员宅基地

文章浏览阅读265次。序列流 序列化 --> 用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的数据等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。 反序列化 --> 该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。 序列化两个条件:..._object那些属性不能序列化

java 迭代器失效_迭代器失效的几种情况-程序员宅基地

文章浏览阅读793次。关于迭代器失效,,今天做一个总结。迭代器失效分三种情况考虑,也是三种数据结构考虑,分别为数组型,链表型,树型数据结构。1、对于序列式容器,比如vector,删除当前的iterator会使后面所有元素的iterator都失效。举例如下:void vectorTest(){vector v;for (int i = 0; i < 10; i++){v.push_back(i);}vector::..._java 容器的迭代器什么时候失效

Mysql安装教程_[mysqld] bind-address = 0.0.0.0 default-storage-en-程序员宅基地

文章浏览阅读581次,点赞3次,收藏6次。在这里插入代码片@TOC欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设..._[mysqld] bind-address = 0.0.0.0 default-storage-engine = innodb innodb_file_

【ubuntu】16.04搭建DNS服务器_ubuntu16.04搭建dns内网服务器-程序员宅基地

文章浏览阅读482次。1.更新环境apt-get update2.安装bind9apt install bind93.配置/etc/bind/named.conf 文件(服务器域解析文件),其中Router.com、TestIpsec.com是需要解析的域名zone "Router.com"{ type master;file "db.Router.com";};zone "TestIpsec.com"{ type master;file "db.TestIpsec.com";};4._ubuntu16.04搭建dns内网服务器

创建数组对象_ets定义数组-程序员宅基地

文章浏览阅读1.8k次。开发工具与关键技术:VS、创建数组对象作者:陆桂超撰写时间:2019年7月27日1、 如下图所示是一个动态添加的table表格,这里显示有三条数据。那么如何把这三条数据传到控制器呢?我们可以把这三条数据封装到一个数组里面,然后把数组传到控制器。2、首先在for循环外面声明一个数组,记住不能在for循环里面声明数组,因为如果在for循环里面声明数组,这样就每循环一次都会创建一个数组,而我们..._ets定义数组