mapreduce中FileInputFormat与TextInputFormat解析以及HDFS小文件优化

一、FileInputFormat与TextInputFormat

在map阶段,文件先被切分成split块,而后每一个split切片对应一个Mapper任务

  1. FileInputFormat这个类先对输入文件进行逻辑上的划分,以128M为单位,将原始数据从逻辑上分割成若干个split,每个split切片对应一个Mapper任务
  2. TextInputFormat这个类随后将每个split块中的每行记录解析成一个一个的键值对,即<k1,v1>

mapreduce中FileInputFormat与TextInputFormat解析以及HDFS小文件优化

二、HDFS小文件的优化

hdfs大量的小文件势必影响NameNode的寿命,因为文件元数据存储在NameNode的内存中,影响计算引擎的任务数量,比如每个小的文件都会生成一个Map任务

解决小文件过多的问题有以下几种方法

  1. 对小文件进行归档(Har),将众多的小文件打包成一个har 文件,但由于har是目录,其只能减轻namenode压力,无法在mapreduce中起作用
  2. 采用ConbinFileInputFormat来作为输入,解决输入端大量小文件场景。ConbinFileInputFormat可以将多个小文件合并到一个inputsplit里面,用一个map来处理
  3. 启用jvm重用,多个顺序执行的task之间jvm不会关闭,可以避免频繁启动jvm的资源消耗。