压缩方案
说明:压缩前后请务必进行数据测试对比,确保数据压缩前后一致。
对比工具:https://datacompare.alibaba-inc.com/#/home
原理说明
在默认情况夏,数据是按照写入时间顺序存储的,这样物理上相邻的数据其实相似性并不高。在当前列存储当道的大背景下,如果让某个人/设备的数据在物理上相邻,就能够用20%的代价达到80%的数据存储优化效果。【desc extended <table_name>;】
实现步骤
重分布需要针对已有的表,重新创建一个任务,对历史数据进行压缩处理,以保障不影响当前任务产出。建议当天进行重分布的分区统一设置5天前,通过日调度每天实现对之前任务的重分布写入。历史分区的数据,可以通过补数据实现。
压缩任务一定要设置在下午或者晚上运行,避免需要使用动态分区对生产任务产出造成影响。
动态分区会影响重分布的效果,尽量使用静态分区,如果需要用动态分区可以增加如下操作:
set odps.sql.reshuffle.dynamicpt=false
distribute by <动态分区key> <reorder key>
sort by <动态分区key> <reorder key>
set odps.sql.joiner.memory=4096;
set odps.sql.mapper.split.size=2048;
set odps.sql.reducer.memor=4096;
set odps.sql.allow.adaptive.data.distribution=true;
set odps.adaptive.shuffle.desired.partition.size=2048;
重分布逻辑
distribute by col1
sort by col1,col2,col3
经过以上操作可在原表进行压缩,并通过重跑历史数据将历史数据进行压缩
如果需要直接压缩,只需要设置参数运行一次即可:
ALTER TABLE table_name SET TBLPROPERTIES("storagestrategy"="archive")