hadoop中小文件的处理思路

1 小文件的出现原因

     hadoop存储数据是按block存储的,现在默认是128M问一个文件块,一个文件块对应一个maptask。但是,读取的文件如果是200M等非128的倍数的文件块,客户端切分数据必然会产生小的数据块。

2小文件造成的问题

     这些小的数据块的元数据信息(位置,大小,名称)等都要保存到namenode中,若大量的小文件快信息保存在namnode中会占用很大的服务器内存,如果服务器在此启动要重新加载这些元数据信息到内存中必然要花费很长时间。

    同时maptask要处理大量的小块文件,产生大量的task任务,严重影响集群运行效率,产生IO瓶颈。

3 解决方案

  hadoopArchive:hadoop合并小文件的一个工具,可以将小文件合并成一个HAR文件,减少namenode的内存占用。

  Sequence File:一个二进制的key/value文件,可以将小文件合并成一个大文件。

  CombineFileInputFormat

   Hadoop有一个专门的类CombineFileInputFormat 来处理小文件,它根据一定的规则,将HDFS上多个小文件合并到一个InputSplit中,同时启动适量的Map来处理这里面的文件,以减少MR整体作业的运行时间。CombineFileInputFormat类继承FileInputFormat,主要重写了List<InputSplit> getSplits(JobContext var1)方法,我们可以设置mapreduce.input.fileinputformat.split.minsize.per.node、mapreduce.input.fileinputformat.split.minsize.per.rack和mapreduce.input.fileinputformat.split.maxsize 参数的设置来合并小文件。其中mapreduce.input.fileinputformat.split.maxsize参数至关重要,如果没有设置这个参数(默认没设置),那么同一个机架上的所有小文件将组成一个InputSplit,最终由一个Map Task来处理。如果设置了这个参数,那么同一个节点(node)上的文件将会组成一个InputSplit。

InputSplit包含的HDFS块信息存储在CombineFileSplit 类中。该类包含了每个块文件的路径、起始偏移量、相对于原始偏移量的大小和这个文件的存储节点。CombineTextInputFormat告诉MR程序如何读取组合的InputSplit,具体如何解析CombineFileSplit中的文件主要在CombineFileRecordReader中实现。该类封装了TextInputFormat的RecordReader,并对CombineFileSplit中的多个文件循环遍历并读取其中的内容。

参考:https://blog.csdn.net/LINBE_blazers/article/details/82861981?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1.nonecase

猜你喜欢

转载自blog.csdn.net/u013963379/article/details/106556257