hadoop存储数据是按block存储的现在默认昰128M问一个文件块,一个文件块对应一个maptask但是,读取的文件如果是200M等非128的倍数的文件块客户端切分数据必然会产生小的数据块。
这些小嘚数据块的元数据信息(位置大小,名称)等都要保存到namenode中若大量的小文件快信息保存在namnode中会占用很大的服务器内存,如果服务器在此启动要重新加载这些元数据信息到内存中必然要花费很长时间
同时maptask要处理大量的小块文件,产生大量的task任务严重影响集群运行效率,产生IO瓶颈
参数的设置来合并小文件。其中mapreduce.input.fileinputformat.split.maxsize参数至关重要如果没有设置这个参数(默认没设置),那么同一个机架上的所有小文件将組成一个InputSplit最终由一个Map Task来处理。如果设置了这个参数那么同一个节点(node)上的文件将会组成一个InputSplit。