HDFS 实际应用场景合并小文件

合并小文件,存放到HDFS上, 采取在向HDFS复制上传的过程中将小文件进行合并,效果会更好

package org.xueruan.hadoop.hdfs;

import java.nio.file.Path;

import sun.management.FileSystem;

/*
 * function: merge file while copying and uploading files into HDFS
 */

public class PutMerge {

    public static void put(String localDir,String hdfsFile){

        /*
         * @param localDir: local file directory
         *
         * @param hdfsFile:    HDFS file path
         */
        Configuration conf = new Configuration();

        Path localPath = new Path(localDir);
        Path hdfsPath = new Path(hdfsFile);

        try{

            FileSystem localFs = FileSystem.getLocal(conf);
            FileSystem hdfs = FileSystem.get(conf);

            FileStatus[] status = localFs.listStatus(localPath);

            FSDataOutputStream fsDataOutputStream = hdfs.create(hdfsPath);

            for(FileStatus fileStatus:status){

                Path path = fileStatus.getPath();
                System.out.println("File is :"+path.getName());

                //open file input stream
                FSDdataInputStream fsDataInputStream = localFs.open(path);

                byte[] buffer= new byte[1024];
                int len =0;
                while(len = fsDataInputStream.read(buffer)>0){

                    fsDataOutputStream.write(buffer,0,len);

                }
                fsDataInputStrea.close();
            }

            fsDataOutputStream.close();
        }catch(Exception e){
            e.printStackTrace();

        }

    }

}

时间: 2024-10-10 08:55:50

HDFS 实际应用场景合并小文件的相关文章

Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)

不多说,直接上代码.  代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataInputStream;import org.apa

[转载]mapreduce合并小文件成sequencefile

mapreduce合并小文件成sequencefile http://blog.csdn.net/xiao_jun_0820/article/details/42747537

Hadoop合并小文件的几种方法

1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支持追加操作,还不支持文档压缩,当有新文件进来以后,需要重新打包. 2.SequeuesFile 适用于非文体格式,可作小文件容器,并可压缩: 3.CombineFileInputFormat 将多个文件合并成一个split作为输入,减少map输入与HDFS块的耦合: 4.Java代码实现,使用HDF

WholeFileInputFormat 和WholeFileRecordReader合并小文件

如果不希望文件被切分,例如判断文件中记录是否有序,可以让minimumSize值大于最大文件的大小,但是文件的大小不能超过blockSize,或者重写FileInputFormat方法isSplitable()返回为false.下面介绍将多个小文件合成一个大的序列文件的例子: 1)自定义完整文件输入处理类如下: Public class WholeFileInputFormat extends FileInputFormat<NullWritable, ByteWritable> { @ove

HDFS小文件合并问题的优化:copyMerge的改进

1.问题分析 用fsck命令统计 查看HDFS上在某一天日志的大小,分块情况以及平均的块大小,即 [[email protected] jar]$ hadoop fsck /wcc/da/kafka/report/2015-01-11 DEPRECATED: Use of this script to execute hdfs command is deprecated. Instead use the hdfs command for it. 15/01/13 18:57:23 WARN ut

HDFS操作及小文件合并

小文件合并是针对文件上传到HDFS之前 这些文件夹里面都是小文件 参考代码 package com.gong.hadoop2; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import or

hive小文件合并设置参数

Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小.而且这些表通常会按日期进行分区,随着时间的推移,HDFS的文件数目就会逐渐增加. 小文件带来的问题 关于这个问题的阐述可以读一读Cloudera的这篇文章.简单来说,HDFS的文件元信息,包括位置.大小.分块信息等,都是保存在NameNode的内存中的.每个对象大约占用150个字节,因此一千万个文件及分块就

Hive merge(小文件合并)

当Hive的输入由很多个小文件组成时,如果不涉及文件合并的话,那么每个小文件都会启动一个map task. 如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费,甚至发生OutOfMemoryError错误. 因此,当我们启动一个任务时,如果发现输入数据量小但任务数量多时,需要注意在Map前端进行输入小文件合并操作. 同理,向一个表写数据时,注意观察reduce数量,注意输出文件大小. 1. Map输入小文件合并 #每个Map处理的最大输入文件大小(256MB) s

hive压缩之小文件合并

Hive压缩之二 小文件合并 调研背景 当Hive输入由很多个小文件组成,由于每个小文件都会启动一个map任务,如果文件过小,以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费,甚至OOM.为此,当我们启动一个任务,发现输入数据量小但任务数量多时,需要注意在Map前端进行输入合并.当然,在我们向一个表写数据时,也需要注意输出文件大小. 输入合并 合并输入小文件,减少map数? 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小. 举例: a)