MaxCompute(原ODPS)性能优化之合并小文件
背景
相信每个人都做过电脑磁盘整理,为什么要做?因为文件被分散保存到整个磁盘的不同地方,而不是连续地保存在磁盘连续的簇中形成的。硬盘在使用一段时间后,由于反复写入和删除文件,磁盘中的空闲扇区会分散到整个磁盘中不连续的物理位置上,从而使文件不能存在连续的扇区里。这样,再读写文件时就需要到不同的地方去读取,增加了磁头的来回移动,降低了磁盘的访问速度。
对于我们的大数据分析人员来讲,也同样的面临此类问题,分布式文件系统按块Block存放,文件大小比块大小小的文件,称之为小文件。小文件过多,将带来以下问题:
MaxCompute满足一定的条件
解决方案
通过元数据检测,我们认为分区中含有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/
---阿里大数据博文,问答,社群,实践,有朋自远方来,不亦说乎……
最后更新:2017-08-24 21:02:16