`

SequenceFile和MapFile使用

 
阅读更多

 

Hadoop的HDFS和MapReduce子框架主要是针对大数据文件来设计的,在小文件的处理上不但效率低下,

而且十分消耗磁盘空间(每一个小文件占用一个Block,HDFS默认block大小为64M)。解决办法通常是选择一个容器,

将这些小文件组织起来统一存储。HDFS提供了两种类型的容器,分别是SequenceFile和MapFile。

 

 

 1 SequenceFile使用

package org.tony.file;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;

public class SequenceFileWriter {
	public static String uri = "hdfs://192.168.142.128:9000";
	public static String[] data = { "one,two", "three,four", "five,six",
			"seven,eight", "night,ten" };

	public static void main(String[] args) throws IOException {
		write();
		read();
		
	}
	
	/**
	* @Title: write 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)调用SequenceFile.createWriter得到SequenceFile.Writer对象;
					(5)调用SequenceFile.Writer.append追加写入文件;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void write() throws IOException {

		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);

		Path path = new Path("/tmp.seq");
		// Path path = new Path("/tmp1.seq"); 采用压缩
		IntWritable key = new IntWritable();
		Text value = new Text();

		SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, path,
				key.getClass(), value.getClass());
		// SequenceFile.Writer writer =
		// SequenceFile.createWriter(fs,conf,path,key.getClass(),value.getClass(),CompressionType.RECORD,new
		// BZip2Codec()); 采用压缩,用BZip2压缩算法
		for (int i = 0; i < 100; i++) { // 写入100次
			key.set(100 - i);
			value.set(data[i % data.length]);
			writer.append(key, value);
		}
		IOUtils.closeStream(writer);
		
	}
	
	/**
	* @Title: read 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个SequenceFile Reader进行读取;(5)得到keyClass和valueClass;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void read() throws IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		Path path = new Path("/tmp.seq");
		// Path path = new Path("/tmp1.seq"); 读取压缩文件
		SequenceFile.Reader reader = new SequenceFile.Reader(fs, path, conf);
		Writable key = (Writable) ReflectionUtils.newInstance(
				reader.getKeyClass(), conf);
		Writable value = (Writable) ReflectionUtils.newInstance(
				reader.getValueClass(), conf);
		while (reader.next(key, value)) {
			System.out.println("key = " + key);
			System.out.println("value = " + value);
			System.out.println("position = " + reader.getPosition());
		}
		IOUtils.closeStream(reader);

	}
}

 2 MapFile使用 

 

package org.tony.file;

import java.io.IOException;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.MapFile;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.util.ReflectionUtils;

public class MapFileTest {
	public static String uri = "hdfs://192.168.142.128:9000"; //访问hdfs 的uri 
	public static String[] data = { "one,two", "three,four", "five,six",
			"seven,eight", "night,ten" };

	public static void main(String[] args) throws Exception {
//		write(); 
		read();
//		seqToMapFile();
	}
	
	/**用Mapfile写文件
	* @Title: write 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个MapFile.Writer对象;(5)调用MapFile.Writer.append追加写入文件;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void write() throws IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path path = new Path("/tmpdata.map");
		IntWritable key = new IntWritable();
		Text value = new Text();
		
		MapFile.Writer writer = new MapFile.Writer(conf, fs, path.toString(),
				key.getClass(), value.getClass());
		
		for (int i = 0; i < 100; i++) {
			key.set(i + 1);
			value.set(data[i % data.length]);
			writer.append(key, value);
		}
		IOUtils.closeStream(writer);

	}
	/**用Mapfile读文件
	* @Title: read 
	* @Description: (1)创建Configuration;(2)获取FileSystem;(3)创建文件输出路径Path;
					(4)new一个MapFile.Reader对象;(5)得到keyClass和valueClass;(6)关闭流; 
	* @return void    返回类型 
	* @throws
	 */
	public static void read() throws IOException {
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path path = new Path("/tmpdata.map");
		MapFile.Reader reader = new MapFile.Reader(fs, path.toString(), conf);
		
		WritableComparable key = (WritableComparable) ReflectionUtils
				.newInstance(reader.getKeyClass(), conf);
		Writable value = (Writable) ReflectionUtils.newInstance(
				reader.getValueClass(), conf);
		
		while (reader.next(key, value)) {
			System.out.println("key = " + key);
			System.out.println("value = " + value);
		}
		IOUtils.closeStream(reader);
	}
	
	/**将sequence文件转换为MapFile文件 
	* @Title: seqToMapFile 
	* @Description: TODO 
	* @return void    返回类型 
	* @throws
	* 1 创建tmp1.map文件夹 
	* 2 复制tmp1.seq  SequenceFile文件到tmp1.map文件夹下面,并重命名data $./hadoop fs -mv /tmp1.seq /tmp1.map/data
	* 3 运行程序 
	 */
	public static void seqToMapFile() throws Exception{
		Configuration conf = new Configuration();
		FileSystem fs = FileSystem.get(URI.create(uri), conf);
		
		Path map = new Path("/tmp1.map"); //文件夹位置
		
		//MapFile.DATA_FILE_NAME 为seq文件移动到tmp1.map文件夹下面的文件名称 
		Path mapData = new Path(map,MapFile.DATA_FILE_NAME);
		SequenceFile.Reader reader = new SequenceFile.Reader(fs,mapData,conf);
		Class key = reader.getKeyClass();
		Class value = reader.getValueClass();
		reader.close();
		
		long entries = MapFile.fix(fs, map, key, value, false, conf);
		System.out.printf("Created MapFile %s with %d entries\n",map,entries);
	}
}

 

分享到:
评论

相关推荐

    21、MapReduce读写SequenceFile、MapFile、ORCFile和ParquetFile文件

    在Hadoop生态系统中,为了高效地存储和处理数据,有多种文件格式被设计出来,如SequenceFile、MapFile、ORCFile和ParquetFile。这些文件格式各有特点,适合不同的场景需求。 1. **SequenceFile** SequenceFile是...

    spark-SequenceFile及MapFile讲解

    在 Spark 中,我们可以使用 SequenceFile 和 MapFile 来解决小文件处理效率低下的问题,提供高效的数据存储和检索方式。 四、总结 本文详细介绍了 Spark-SequenceFile 及 MapFile 的概念、特点和应用。...

    SequenceFile转换成MapFile

    总的来说,将SequenceFile转换为MapFile是一种优化数据访问性能的策略,具体使用哪种格式取决于应用的需求和数据特性。理解这两种文件格式及其相互转换的过程,可以帮助我们更好地设计和优化Hadoop集群上的大数据...

    sequencefile&mapfile代码

    在Hadoop生态系统中,SequenceFile和MapFile是两种常见的数据存储格式,它们为大数据处理提供了高效、可扩展的解决方案。这两个文件格式都是Hadoop原生支持的,用于存储大规模数据集,尤其适用于分布式环境。接下来...

    Ghostfyx#big_data_notes#SequenceFile和MapFile1

    1.1 SequenceFile概述 1.2 SequenceFile压缩 1.4 SequenceFile读取文件 1.5 SequenceFile总结

    22、MapReduce使用Gzip压缩、Snappy压缩和Lzo压缩算法写文件和读取相应的文件

    本篇文章将详细探讨MapReduce如何使用Gzip、Snappy和Lzo这三种压缩算法来写入和读取文件。 1. Gzip压缩 Gzip是一种广泛使用的压缩算法,其压缩率较高,但压缩和解压缩速度相对较慢。在MapReduce中,通过设置`...

    sequenceFile打包多个小文件

    在Hadoop中,SequenceFile可以使用MapFile来排序和索引,这样可以提高SequenceFile的读取效率。MapFile是一种特殊的SequenceFile,用于对SequenceFile进行排序和索引。 在给定的程序中,我们可以看到 SequenceFile ...

    基于Hadoop的MapReduce作业集合.zip

    基于Hadoop的MapReduce作业集合 项目简介 本项目是一个基于Hadoop的MapReduce作业集合,涵盖了... 读取和写入SequenceFile和MapFile。 5. 序列化 使用Hadoop的序列化机制进行数据序列化和反序列化。 6. 设计模式

    把Hadoop大数据系统架构讲明白了.pdf

    例如,Text用于纯文本数据,SequenceFile和MapFile用于键值对数据,AvroFile支持行式存储,而RCFile、ORCFile、Parquet和CarbonData等则用于列式存储,其中CarbonData具备索引功能,优化了查询性能。 总之,Hadoop...

    hadoop 权威指南(第三版)英文版

    即数据的输入输出处理,包括数据完整性的保障、各种本地文件系统和HDFS中数据完整性的实现、压缩技术及编解码器、MapReduce中压缩的使用、序列化和可写接口的使用,以及Avro、SequenceFile和MapFile等基于文件的数据...

    Hadoop: The Definitive Guide 3rd_edition

    他不仅专注于Hadoop本身的优化,还致力于使Hadoop更加易于使用和理解。Tom在Hadoop上的专业技能涵盖了多种技术领域,尤其擅长使Hadoop变得更加用户友好。 《Hadoop: The Definitive Guide, Third Edition》是Tom ...

    MapReduceV2笔记

    SequenceFile和MapFile是Hadoop中用于存储序列化数据的文件格式。 MapReduce的输入输出格式主要通过InputFormat和OutputFormat接口来定义。InputFormat负责定义数据的输入方式和解析方式,而OutputFormat定义了输出...

    hadoop相关知识习题

    对于小文件处理,可以通过归档策略如SequenceFile、MapFile、Har等方式提高效率。 12. Client在HDFS上写文件时,Namenode提供DataNode信息,Client将文件分割并按顺序写入每个DataNode。在上传文件过程中,数据副本...

    把Hadoop大数据系统架构讲明白了.docx

    Hadoop分布式存储层主要由HDFS(Hadoop Distributed File System)组成,支持多种数据存储格式,如文本、KV格式(如SequenceFile和MapFile)、行式存储(如AvroFile)和列式存储(如RCFile、ORCFile、Parquet和...

    hadoop the definitive guide 3nd edition

    Hadoop I/O是Hadoop处理数据的核心,包括数据压缩、序列化框架、自定义Writable实现以及基于文件的数据结构如SequenceFile和MapFile。数据压缩可以减少存储空间和网络传输的数据量,提高Hadoop处理数据的效率。序列...

    Hadoop权威指南第三版

    - **文件结构**: 除了传统的文件系统外,Hadoop还支持一些特殊的数据结构,如SequenceFile和MapFile,这些结构可以更高效地存储和检索数据。 #### 五、MapReduce应用程序开发 - **配置API**: MapReduce应用程序...

    HBase存储海量图片

    通常对小文件的处理是使用sequenceFile文件或MapFile文件。这里选择使用sequenceFile文件处理栅格数据。在sequenceFile文件中,key值存放的为文件的路径,value的值存放的为图片的字节数组文件。栅格数据存放在的...

Global site tag (gtag.js) - Google Analytics