阅读783 返回首页    go 阿里云 go 技术社区[云栖]


MaxCompute(原ODPS)性能优化之合并小文件

背景

相信每个人都做过电脑磁盘整理,为什么要做?因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的。硬盘在使用一段时间后,由于反复写入和删除文件,磁盘中的空闲扇区会分散到整个磁盘中不连续的物理位置上,从而使文件不能存在连续的扇区里。这样,再读写文件时就需要到不同的地方去读取,增加了磁头的来回移动,降低了磁盘的访问速度。

对于我们的大数据分析人员来讲,也同样的面临此类问题,分布式文件系统按块Block存放,文件大小比块大小小的文件,称之为小文件。小文件过多,将带来以下问题:



MaxCompute满足一定的条件

3c3a3e538a040a0b5adf0ee354ae022338a05436

解决方案

通过元数据检测,我们认为分区中含有1000个以上的文件且平均文件大小小于128M的都可以进行小文件合并。即时合并:

ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;

其中,PARTITION仅支持一级分区,另外涉及的其他系统参数如下:

(1) set odps.merge.cross.paths=true|false
设置是否跨路径合并,对于表下面有多个分区的情况,合并过程会将多个分区生成独立的MergeAction进行合并,所以对于odps.merge.cross.paths设置为true,并不会改变路径个数,只是分别去合并每个路径下的小文件而已;


(2) set odps.merge.smallfile.filesize.threshold = 128
设置合并文件的小文件大小阀值,文件大小超过该阀值,则不进行合并,单位为M,可以不设,不设时,则使用全局变量odps_g_merge_filesize_threshold,该值默认为32M,设置时必须大于32M。

(3) set odps.merge.maxmerged.filesize.threshold = 256

设置合并输出文件量的大小,输出文件大于该阀值,则创建新的输出文件,单位为M,可以不设,不设时,则使用全局变odps_g_max_merged_filesize_threshold,该值默认为256M,设置时必须大于256M。

(4) set odps.merge.max.filenumber.per.instance = 2000
设置合并Fuxi Job的单个Instance允许合并的小文件个数,控制合并并行的Fuxi_inst个数,可以不设,不设时,则使用全局变量odps_g_merge_files_per_instance,该值默认为100个;在一个Merge任务中,需要的Fuxi_inst个数至少为该目录下面的总文件个数除以该限制。
(5) set odps.merge.max.filenumber.per.job = 50000
设置合并最大的小文件个数,小文件数量超过该限制,则超过限制部分的文件忽略,不进行合并,可以不设,不设时,则使用全局变量odps_g_max_merge_files,该值默认为10000个;


相关参数的设置如下:


set odps.merge.cross.paths=true;

set odps.merge.smallfile.filesize.threshold=128;

set odps.merge.max.filenumber.per.instance = 2000;

set odps.merge.max.filenumber.per.job=50000;



阿里巴巴大数据-玩家社区 https://yq.aliyun.com/teams/6/

---阿里大数据博文,问答,社群,实践,有朋自远方来,不亦说乎……

bba01b493e1c5d904e882b1c380673c6ebe49a98

最后更新:2017-08-24 21:02:16

  上一篇:go  区块链未来会发展成什么模样?
  下一篇:go  站点中如何应用OSS资源