企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 简介 关于大量小文件的优化策略 默认情况下TextInputFormat对任务的切片机制是按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个maptask,这样如果有大量小文件,就会产生大量的maptask,处理效率极其低下 **方法** 1. 最好的办法,在数据处理系统的最前端(预处理/采集),将小文件先合并成大文件,再上传到HDFS做后续分析 2. 补救措施:如果已经是大量小文件在HDFS中了,可以使用另一种InputFormat来做切片(CombineTextInputFormat),他的切片逻辑跟TextFileInputFormat不同,他可以将多个小文件从逻辑规划到一个切片中.这样多个小文件可以交给一个maptask 3. 优先满足最小切片大小,不超过最大切片大小 ~~~ CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); //4m CombineTextInputFormat.setMinInputSplitSize(job, 2097152); //2m ~~~ 举例: 0.5m+1m+0.3m+5m=2m+4.8m=2m+4m+0.8m # 实现步骤 ~~~ Import org.apache.hadoop.mapreduce.lib.input ~~~ ~~~ //如果不设置InputFormat,他默认用的是TextInputFormat.class job.setInputFormatClass(CombineTextInputFormat.class); CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); //4m CombineTextInputFormat.setMinInputSplitSize(job, 2097152); //2m ~~~ 观察切片数 ![](https://box.kancloud.cn/9dca6dadc7f91a0bed4840d5de84abf7_648x18.png) # 分析 他这个输入还是按照文件来的,如果一个文件小于设置的最小值,他会累加文件,如果累加的文件大于设置的最大值就会切片