`

hadoop合并小文件的一些说说

 
阅读更多

 

 

 

0 一些背景说说:

小文件: 是那些size比HDFS的block size(默认64M)小的多的文件
因为: 任何一个文件,目录和block,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个object占用150 bytes的内存空间。
        如果有10million个文件,每一个文件对应一个block,那么就将要消耗namenode 3G的内存来保存这些block的信息。文件在大的话,对内存要求会更多。

 

1 合并小文件方式:

 

 

 a) 应用程序自己控制, 缺点是: 红墨水蓝墨水都混合在一起,以后无法区分

 

import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;


public class CopyOfApp1 {

	public static void main(String[] args) throws Exception {
		// 0 初始化filesystem客户端
		final Configuration conf = new Configuration();
		final FileSystem fileSystem = FileSystem.get(new URI("hdfs://chinadaas109:9000/"), conf);
	
		System.out.println(fileSystem);
		final Path path = new Path("/combinedfile");
		final FSDataOutputStream create = fileSystem.create(path); // hdfs创建目标文件 
		final File dir = new File("C:\\Windows\\System32\\drivers\\etc");  // 将此文件夹下的内容写到hdfs path中
		for(File fileName : dir.listFiles()) {
			System.out.println(fileName.getAbsolutePath());
			final FileInputStream fileInputStream = new FileInputStream(fileName.getAbsolutePath());
			final List<String> readLines = IOUtils.readLines(fileInputStream);
			for (String line : readLines) {
				create.write(line.getBytes());	
			}
			fileInputStream.close();
		}
		create.close();	

	}	

 

 

b) archive:

 

HAR文件是通过在HDFS上构建一个层次化的文件系统来工作。
一个HAR文件是通过hadoop的archive命令来创建,而这个命令实 际上也是运行了一个MapReduce任务来将小文件打包成HAR。
对于client端来说,使用HAR文件没有任何影响。所有的原始文件都 (using har://URL)。但在HDFS端它内部的文件数减少了。

过HAR来读取一个文件并不会比直接从HDFS中读取文件高效,
而且实际上可能还会稍微低效一点,因为对每一个HAR文件的访问都需要完成两层 index文件的读取和文件本身数据的读取。

并且尽管HAR文件可以被用来作为MapReduce job的input,但是并没有特殊的方法来使maps将HAR文件中打包的文件当作一个HDFS文件处理。

创建文件 hadoop archive -archiveName xxx.har -p  /src  /dest
查看内容 hadoop fs -lsr har:///dest/xxx.har

 

c) sequence file/map file

 

sequence file:

filename作为key,file contents作为value
比如10000个100KB的文件,可以写一个程序来将这些小文件写入到一个单独的 SequenceFile中。
可以在一个streaming fashion(directly or using mapreduce)中来使用这个sequenceFile。
并且,SequenceFiles也是splittable的,所以mapreduce 可以break them into chunks,并且分别的被独立的处理。
这种方式还支持压缩。

 

 

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.CompressionType;
import org.apache.hadoop.io.SequenceFile.Reader;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.Text;

public class TestSequenceFile {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		// // TODO Auto-generated method stub
		 Configuration conf = new Configuration();
		 Path seqFile = new Path("/test/seqFile2.seq");
		 // Writer内部类用于文件的写操作,假设Key和Value都为Text类型
		 SequenceFile.Writer writer = SequenceFile.createWriter(conf,
		 Writer.file(seqFile), Writer.keyClass(Text.class),
		 Writer.valueClass(Text.class),
		 Writer.compression(CompressionType.NONE));

		 // 通过writer向文档中写入记录
		 writer.append(new Text("key"), new Text("value"));
		
		 IOUtils.closeStream(writer);// 关闭write流
		 // 通过reader从文档中读取记录
		 SequenceFile.Reader reader = new SequenceFile.Reader(conf,
		 Reader.file(seqFile));
		 Text key = new Text();
		 Text value = new Text();
		 while (reader.next(key, value)) {
		 System.out.println(key);
		 System.out.println(value);
		 }
		 IOUtils.closeStream(reader);// 关闭read流

		
	}

}

 

 两个格式的参考文档: http://blog.csdn.net/javaman_chen/article/details/7241087

 

 

关于 sequencefile  textfile 源码写法上的区别和案例参考链接:

http://tangjj.blog.51cto.com/1848040/1535555/

 

d) combinefileinputformat

 

 

分享到:
评论

相关推荐

    Hadoop示例程序合并文件

    - Map阶段:在Map任务中,每个节点上的Mapper进程对分配给它的数据块进行处理,例如,可以将多个小文件合并为一个大文件。 - Shuffle和Sort:Mapper的输出被排序并分组,准备传递给Reducer。 - Reduce阶段:...

    hadoop处理海小文件的改进方法

    本文提出了一种通过文件合并和索引优化来提高Hadoop处理海量小文件效率的方法。实验结果表明,该方法能够有效减少Namenode的元数据负担,提高系统的I/O性能。未来的研究方向可以进一步探索更智能的文件合并策略以及...

    hadoop的dll文件 hadoop.zip

    安装或使用Hadoop的dll文件时,可能会遇到一些常见问题,如版本不兼容、路径配置错误或缺失依赖。解决这些问题通常需要检查以下几点: 1. 确保dll文件与Hadoop版本兼容。 2. 检查Java环境是否正确配置,包括JDK版本...

    (orc + snappy / zlib ) 多线程并行合并小文件工具类 (出自:flink自定义合并orc小文件处)

    为了解决这个问题,我们可以采用各种合并策略,其中一种是通过多线程并行合并小文件。本项目提供的工具类就基于orc格式,利用了snappy或zlib压缩,用于在Flink中自定义合并orc小文件。 orc是一种高效的列式存储格式...

    Hive内部表合并小文件Java程序

    3. **创建SequenceFile**:Hadoop的SequenceFile是一种高效的数据存储格式,适合用于合并小文件。创建一个新的SequenceFile,作为合并后的大文件的目标。 4. **读取和写入数据**:遍历获取的文件列表,使用`...

    hadoop.dll 文件,解决报错所需文件

    报错:java.lang.Exception: java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 所需文件

    Hadoop3.1.3 配置文件

    除了这些核心配置文件,还有一些特定场景下的配置,例如`slaves`文件列出集群中的所有工作节点,以及`masters`文件列出NameNode和ResourceManager的角色节点。此外,还可以通过`hadoop-env.sh`和`yarn-env.sh`来设置...

    hadoop.dll 文件

    首先,`hadoop.dll`是Hadoop针对Windows平台编译的本地动态链接库文件,它包含了Hadoop的一些核心本地方法,主要用于处理文件系统操作、网络通信等底层功能。在Hadoop的源代码中,这些本地方法通常由C或C++编写,并...

    Hadoop 2.2.0 配置文件

    在这个配置文件中,我们将会探讨Hadoop 2.2.0 在4台CentOS 6.4系统上运行所需的配置细节。 首先,Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce,它们都需要通过一系列的配置文件来定制...

    windows安装需要的Hadoop库文件

    然而,通过一些额外的配置和库文件,我们可以在Windows上运行Hadoop。以下是一些关于在Windows上安装Hadoop库文件的关键知识点: 1. **Java开发工具**:Hadoop依赖于Java环境,因此首先需要安装Java Development ...

    windows连接Hadoop需要的文件winutils和hadoop_dll

    Winutils是Apache Hadoop项目的一个组件,主要功能是在Windows系统上模拟Hadoop的一些核心功能,比如设置HDFS的访问权限、管理HDFS文件以及启动Hadoop守护进程等。在Linux上,这些功能由`bin/hadoop`脚本完成,但在...

    HadoopHA集群配置文件

    本文将深入探讨Hadoop HA(高可用性)集群的配置文件,包括`core-site.xml`、`hdfs-site.xml`、`mapred-site.xml`、`yarn-site.xml`以及`slaves`文件,这些都是确保Hadoop集群稳定运行的基础。 1. `core-site.xml`:...

    基于虚拟机集群hadoop2.7.1配置文件

    5. `core-site.xml`:核心配置文件,它包含了Hadoop的一些通用设置,如HDFS的默认文件系统、I/O缓冲区大小等。 6. `yarn-site.xml`:YARN(资源调度器)的配置文件。这里可以设置ResourceManager和NodeManager的...

    hadoop2.8 window支持bin文件

    Hadoop是大数据处理领域的重要工具,它是一个分布式文件系统,为大规模数据集提供了高吞吐量的数据访问。本文将详细讲解如何在Windows环境下使用Hadoop 2.8,并重点介绍"bin"目录及其作用。 首先,Hadoop 2.8是在...

    hadoop配置文件详解

    - io.seqfile.local.dir:用于合并序列化文件的中间文件存储路径。当使用多个目录时,使用逗号隔开。 - fs.defaultFS:定义了Hadoop文件系统的默认名称节点RPC交互端口。通常设置为***,使用端口9000。 - io.file....

    hadoop/bin目录文件,含hadoop.dll + winutils.exe

    标题中的“hadoop/bin目录文件,含hadoop.dll + winutils.exe”指的是在Apache Hadoop 2.6.3版本中,位于bin目录下的两个关键文件:hadoop.dll和winutils.exe。这两个文件对于Windows用户来说是至关重要的,因为...

    hadoop2.7.2依赖文件

    在Hadoop 2.7.2版本中,为了在Windows操作系统上顺利运行,用户需要配置一些特定的依赖文件,其中包括`winutils.exe`和`hadoop.dll`。这两个文件是Hadoop在Windows环境下正常工作所必需的,因为它们提供了与本地操作...

    hadoop3.1.1native文件含zstd

    标题中的“hadoop3.1.1native文件含zstd”指的是Hadoop 3.1.1版本在CentOS 7 64位系统上编译的本地库(native库)包含了对Zstandard(简称zstd)压缩算法的支持。Zstandard是一种高效的压缩和解压缩算法,设计用于...

    linux-结构化成行成列-小文件循环合并成大文件--方便上传hadoop

    这篇内容主要探讨了如何在Linux环境下,通过Shell脚本将大量小文件结构化地合并成一个大文件,以便更高效地上传到Hadoop分布式文件系统(HDFS)。 首先,我们来理解一下“小文件问题”。在Hadoop环境中,由于每个...

    基于Hadoop的小文件分布式存储技术研究.pdf

    根据提供的文件内容,本文主要研究了基于Hadoop的分布式存储技术,特别是针对海量小文件存储问题的解决方案。文章分别从Hadoop框架的介绍、小文件存储问题的分析以及具体的优化策略等方面展开。下面将详细介绍这些...

Global site tag (gtag.js) - Google Analytics