将存储在本地的大量分散的小文件,合并并保存在hdfs文件系统中

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
 
public class PutMerge {
 
    private InputStream in = null;
    private OutputStream out = null;
    private String localPath;
    private String hdfsPath;
 
    public PutMerge(String localPath, String hdfsPath) {
        this.localPath = localPath;
        this.hdfsPath = hdfsPath;
    }
 
    public void start() throws Exception {
        File file = new File(localPath);
        Configuration conf = new Configuration();
 
        FileSystem fs = FileSystem.get(URI.create(hdfsPath), conf);
        out = fs.create(new Path(hdfsPath));
 
        work(file);
 
        close();
    }
 
    /*
     * 1.根据用户定义的参数设置本地目录和HDFS的目标文件
     * 
     * 2.创建一个输出流写入到HDFS文件
     * 
     * 3.遍历本地目录中的每个文件,打开文件,并读取文件内容,将文件的内容写到HDFS文件中。
     */
    private void work(File file) throws Exception {
        if (file.isFile()) {
            int byteRead = 0;
            byte[] buffer = new byte[256];
            while ((byteRead = in.read(buffer)) > 0) {
                out.write(buffer, 0, byteRead);
            }
        } else if (file.isDirectory()) {
            File[] files = file.listFiles();
            for (int i = 0; i < files.length; i++) {
                if (files[i].isFile()) {
                    in = new BufferedInputStream(new FileInputStream(files[i]));
                    int byteRead = 0;
                    byte[] buffer = new byte[256];
                    while ((byteRead = in.read(buffer)) > 0) {
                        out.write(buffer, 0, byteRead);
                    }
                } else {
                    work(files[i]);
                }
            }
        }
    }
 
    private void close() throws IOException {
        if (in != null) {
            in.close();
        }
 
        if (out != null) {
            out.close();
        }
    }
 
    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception {
        if (args.length < 2) {
            System.out.println("Usage:\n\t " + PutMerge.class.getName()
                    + " [LocalPath] [HDFSPath]");
            System.exit(1);
        }
        new PutMerge(args[0], args[1]).start();
    }
}

hdfs小文件合并 阅读详情

相关推荐

hudi系列-小文件优化

hudi使用mvcc来实现数据的读写一致性和发控制,基于timeline实现对事务和表服务的管理,会产生大量比较小的数据文件和元数据文件大量小文件会对存储和查询性能产生不利影响,包括增加文件系统的开销、文件管理的复杂性以及查询性能的下降。对于namenode而言,当整个集群中文件数到了几千万,就已经会变得很不稳定了。

1032851561的博客 2265

hdfs小文件合并hdfs高可用方案

由于HDFS会在NameNode中存储元数据,而元数据是存在于内存中,所以HDFS是不适合用来存储小文件的。针对存在的问题,在HDFS可以进行小文件合并的操作。

qq_36800511的博客 2728

多个小文件合并成一个文件

描述了如何将多个小文件合并为一个文件进行索引的过程

合并HDFS本地文件系统中的小文件

  众所周知,HDFS中过多的小文件,会给NameNode造成很大的压力,所谓的小文件,是指远远小于文件块大小的文件。 在使用HDFS的过程中,应尽量避免生成过多的小文件。   本文以TextFile为例,介绍一下从本地–&gt;HDFSHDFS–&gt;本地、以及HDFS–&gt;HDFS文件上传下载移动过程中,对小文件合并方法 将本地小文件合并,上传到HDFS 假设存放...

sungang1120的专栏 1495

合并本地文件HDFS文件

下面的MergeTest 程序,用于合并本地多个文件合并后的新文件放入HDFS,这个程序在实际工作中会经常用到。 第一步:开发java程序 packagecom.hadoop.hdfs.test; importjava.io.IOException; importorg.apache.hadoop.conf.Configuration; importor

桃花惜春风 3824

本地文件合并后传至HDFS文件

代码如下: package hdfs; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.Fi

沐雨金鳞 751

存储本地大量分散小文件合并保存hdfs文件系统中。

import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apach

TH_lsq的博客 320

java本地文件合并传人hdfs_将存储本地大量分散小文件合并保存hdfs文件系统中...

import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URI;import org.a...

weixin_34517745的博客 309

分布式文件系统HDFS

Hadoop-HDFS 存储模型:字节 文件线性切割成块(Block):偏移量 offset (byte) Block分散存储在集群节点中 单一文件Block大小一致,文件文件可以不一致 Block可以设置副本数,副本分散在不同节点中 副本数不要超过节点数量 文件上传可以设置Block大小和副本数 已上传的文件Block副本数可以调整,大小不变 只支持一次写入多次读取,同一时刻只有一个写入者 ...

qq_20174285的博客 368

0455-如何在Hadoop中处理小文件-续

Fayson的github: https://github.com/fayson/cdhproject 推荐关注微信公众号:“Hadoop实操”,ID:gh_c4c535955d0f,或者扫描文末二维码。 Fayson在前面的文章《0403-如何在Hadoop中处理小文件》和《0405-如何使用Impala合并小文件》中介绍了什么是Hadoop中的小文件,以及常见的处理方法。这里Fayson...

Hadoop_SC的博客 535

如何在hive中处理小文件

转:https://mp.weixin.qq.com/s/xw6MjNvpI97m0aygyW1HaA

weibokong789的博客 500

如何在Hadoop中处理小文件-续

Fayson在前面的文章《如何在Hadoop中处理小文件》和《如何使用Impala合并小文件》中介绍了什么是Hadoop中的小文件,以及常见的处理方法。这里Fayson再补充一篇文章进行说明。   HDFS中太多的小文件往往会带来性能下降以及扩展性受限问题,为了避免这个问题,我们一般需要控制每个文件尽可能的接近HDFS block大小比如256MB,或者是block size的几倍。   ...

hongtaq156136的专栏 353

Hadoop 教程 - Hadoop调优之HDFS存储优化

HDFS(Hadoop Distributed File System)作为Hadoop的核心组件之一,负责存储海量数据。优化HDFS存储不仅可以提升存储效率,还能增强数据的可靠性和访问速度。

qq_33240556的博客 903

从零开始学习Hadoop--第3章 HDFS分布式文件系统

1.文件系统从头说 文件系统的作用就是永久存储数据。计算机可以存储数据的地方是内存,硬盘,优盘,SD卡等等。如果计算机断电关机,存放在内存里的数据就没有了,而存放在硬盘优盘SD卡这些上的数据会仍然存在。硬盘优盘SD卡上的数据是以文件的形式存在,文件系统就是文件的组织和处理。总之,凡是断电之后不会消失的数据,就必须由文件系统存储和管理。 从用户的角度来说,文件系统需要提供文件的创建,删除

大数据和机器学习研究 3051

HDFS基础使用

主要介绍hadoop中HDFS的架构,以及常用shell命令。

Sven119的博客 655

HDFS存储与架构

HDFS存储模型 以字节形式存储 文件线性切割成块(Block):偏移量 offset (byte) Block分散存储在集群节点中 单一文件Block大小一致,文件文件可以不一致 Block可以设置副本数,副本无序分散在不同节点中 副本数不要超过节点数量 文件上传可以设置Block大小和副本数(资源不够开辟的进程) 已上传的文件Block副本数可以调整,大小不变(2.x 128MB 3 bl...

weixin_30644369的博客 199

海量小文件问题综述和解决攻略(一)

衡量存储系统性能主要有两个关键指标,即IOPS和数据吞吐量。IOPS (Input/Output Per Second) 即每秒的输入输出量 (或读写次数) ,是衡量存储系统性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求数量为单位,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(OnlineTransaction Processing),IOPS是关键衡量指标。

智海观潮的博客 982
上一篇: Spark读取HDFS文件,文件格式为GB2312,实现WordCount示例
下一篇: 循环列表的Java实现,解决约瑟夫环问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值