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); } }
相关推荐
在Hadoop生态系统中,为了高效地存储和处理数据,有多种文件格式被设计出来,如SequenceFile、MapFile、ORCFile和ParquetFile。这些文件格式各有特点,适合不同的场景需求。 1. **SequenceFile** SequenceFile是...
在 Spark 中,我们可以使用 SequenceFile 和 MapFile 来解决小文件处理效率低下的问题,提供高效的数据存储和检索方式。 四、总结 本文详细介绍了 Spark-SequenceFile 及 MapFile 的概念、特点和应用。...
总的来说,将SequenceFile转换为MapFile是一种优化数据访问性能的策略,具体使用哪种格式取决于应用的需求和数据特性。理解这两种文件格式及其相互转换的过程,可以帮助我们更好地设计和优化Hadoop集群上的大数据...
在Hadoop生态系统中,SequenceFile和MapFile是两种常见的数据存储格式,它们为大数据处理提供了高效、可扩展的解决方案。这两个文件格式都是Hadoop原生支持的,用于存储大规模数据集,尤其适用于分布式环境。接下来...
1.1 SequenceFile概述 1.2 SequenceFile压缩 1.4 SequenceFile读取文件 1.5 SequenceFile总结
本篇文章将详细探讨MapReduce如何使用Gzip、Snappy和Lzo这三种压缩算法来写入和读取文件。 1. Gzip压缩 Gzip是一种广泛使用的压缩算法,其压缩率较高,但压缩和解压缩速度相对较慢。在MapReduce中,通过设置`...
在Hadoop中,SequenceFile可以使用MapFile来排序和索引,这样可以提高SequenceFile的读取效率。MapFile是一种特殊的SequenceFile,用于对SequenceFile进行排序和索引。 在给定的程序中,我们可以看到 SequenceFile ...
基于Hadoop的MapReduce作业集合 项目简介 本项目是一个基于Hadoop的MapReduce作业集合,涵盖了... 读取和写入SequenceFile和MapFile。 5. 序列化 使用Hadoop的序列化机制进行数据序列化和反序列化。 6. 设计模式
例如,Text用于纯文本数据,SequenceFile和MapFile用于键值对数据,AvroFile支持行式存储,而RCFile、ORCFile、Parquet和CarbonData等则用于列式存储,其中CarbonData具备索引功能,优化了查询性能。 总之,Hadoop...
即数据的输入输出处理,包括数据完整性的保障、各种本地文件系统和HDFS中数据完整性的实现、压缩技术及编解码器、MapReduce中压缩的使用、序列化和可写接口的使用,以及Avro、SequenceFile和MapFile等基于文件的数据...
他不仅专注于Hadoop本身的优化,还致力于使Hadoop更加易于使用和理解。Tom在Hadoop上的专业技能涵盖了多种技术领域,尤其擅长使Hadoop变得更加用户友好。 《Hadoop: The Definitive Guide, Third Edition》是Tom ...
SequenceFile和MapFile是Hadoop中用于存储序列化数据的文件格式。 MapReduce的输入输出格式主要通过InputFormat和OutputFormat接口来定义。InputFormat负责定义数据的输入方式和解析方式,而OutputFormat定义了输出...
对于小文件处理,可以通过归档策略如SequenceFile、MapFile、Har等方式提高效率。 12. Client在HDFS上写文件时,Namenode提供DataNode信息,Client将文件分割并按顺序写入每个DataNode。在上传文件过程中,数据副本...
Hadoop分布式存储层主要由HDFS(Hadoop Distributed File System)组成,支持多种数据存储格式,如文本、KV格式(如SequenceFile和MapFile)、行式存储(如AvroFile)和列式存储(如RCFile、ORCFile、Parquet和...
Hadoop I/O是Hadoop处理数据的核心,包括数据压缩、序列化框架、自定义Writable实现以及基于文件的数据结构如SequenceFile和MapFile。数据压缩可以减少存储空间和网络传输的数据量,提高Hadoop处理数据的效率。序列...
- **文件结构**: 除了传统的文件系统外,Hadoop还支持一些特殊的数据结构,如SequenceFile和MapFile,这些结构可以更高效地存储和检索数据。 #### 五、MapReduce应用程序开发 - **配置API**: MapReduce应用程序...
通常对小文件的处理是使用sequenceFile文件或MapFile文件。这里选择使用sequenceFile文件处理栅格数据。在sequenceFile文件中,key值存放的为文件的路径,value的值存放的为图片的字节数组文件。栅格数据存放在的...