$王大少

导航

hdfs小文件合并

  由于hadoop擅长存储大文件因为大文件的元数据信息比较少,如果hadoop集群当中有大量的小文件,那么每小文件都需要维护一份元数据信息,会大大的增加集群管理元数据的内存压力,所以在实际工作当中,如果有必要一定要将小文件合并成大文件进行一起处理。

 

在我们hdfs 的shell命令模式下,可以通过命令行将很多的hdfs文件合并成一个大文件下载到本地,命令如下:

例如合并文件存放到/export/servers下

 

cd /export/servers

hdfs dfs -getmerge /config/*.xml  ./bigfile.xml

 

既然可以下载的时候这些小文件合并成一个大文件一起下载,那么肯定就可以上传的时候将小文件合并到一个大文件里面去,一般采用两种策略

1.在文件上传到hdfs之前进行小文件的合并(适用于同一类数据的情况)

2.在hdfs上通过mpareduce进行小文件的合并

代码如下:

 

/**
 * 将多个本地系统文件,上传到hdfs,并合并成一个大的文件
 * @throws Exception
 */
@Test
public void mergeFile() throws  Exception{
    //获取分布式文件系统
    FileSystem fileSystem = FileSystem.get(new URI("hdfs://192.168.52.100:8020"), new Configuration(),"root");
    FSDataOutputStream outputStream = fileSystem.create(new Path("/bigfile.xml"));
    //获取本地文件系统
    LocalFileSystem local = FileSystem.getLocal(new Configuration());
    //通过本地文件系统获取文件列表,为一个集合
    FileStatus[] fileStatuses = local.listStatus(new Path("file:///F:\\上传小文件合并"));
    for (FileStatus fileStatus : fileStatuses) {
        FSDataInputStream inputStream = local.open(fileStatus.getPath());
       IOUtils.copy(inputStream,outputStream);
        IOUtils.closeQuietly(inputStream);
    }
    IOUtils.closeQuietly(outputStream);
    local.close();
    fileSystem.close();
}

 

posted on 2020-03-27 11:28  $王大少  阅读(2995)  评论(0编辑  收藏  举报