`
tenght
  • 浏览: 50368 次
社区版块
存档分类
最新评论

[hadoop2.7.1]I/O之SequenceFile最新API编程实例(写入、读取)

 
阅读更多


写操作


根据上一篇的介绍,在hadoop2.x之后,hadoop中的SequenceFile.Writer将会逐渐摒弃大量的createWriter()重载方法,而整合为更为简洁的createWriter()方法,除了配置参数外,其他的参数统统使用SequenceFile.Writer.Option来替代,具体有:


新的API里提供的option参数:


FileOption
FileSystemOption
StreamOption
BufferSizeOption
BlockSizeOption
ReplicationOption
KeyClassOption
ValueClassOption
MetadataOption
ProgressableOption
CompressionOption

这些参数能够满足各种不同的需要,参数之间不存在顺序关系,这样减少了代码编写工作量,更为直观,便于理解,下面先来看看这个方法,后边将给出一个具体实例。

  • createWriter

    public staticorg.apache.hadoop.io.SequenceFile.WritercreateWriter(Configurationconf,
                                                        org.apache.hadoop.io.SequenceFile.Writer.Option...opts)
                                                                 throws IOException
    Create a new Writer with the given options.
    Parameters:
    conf - the configuration to use
    opts - the options to create the file with
    Returns:
    a new Writer
    Throws:
    IOException

权威指南第四版中提供了一个SequenceFileWriteDemo实例:

// cc SequenceFileWriteDemo Writing a SequenceFile
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;

// vv SequenceFileWriteDemo
public class SequenceFileWriteDemo {
  
  private static final String[] DATA = {
    "One, two, buckle my shoe",
    "Three, four, shut the door",
    "Five, six, pick up sticks",
    "Seven, eight, lay them straight",
    "Nine, ten, a big fat hen"
  };
  
  public static void main(String[] args) throws IOException {
    String uri = args[0];
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(URI.create(uri), conf);
    Path path = new Path(uri);

    IntWritable key = new IntWritable();
    Text value = new Text();
    SequenceFile.Writer writer = null;
    try {
      writer = SequenceFile.createWriter(fs, conf, path,
          key.getClass(), value.getClass());
      
      for (int i = 0; i < 100; i++) {
        key.set(100 - i);
        value.set(DATA[i % DATA.length]);
        System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key, value);
        writer.append(key, value);
      }
    } finally {
      IOUtils.closeStream(writer);
    }
  }
}
// ^^ SequenceFileWriteDemo

对于上面实例中的createWriter()方法用整合之后的最新的方法来改写一下,代码如下:

package org.apache.hadoop.io;

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.IntWritable;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.SequenceFile.Writer.FileOption;
import org.apache.hadoop.io.SequenceFile.Writer.KeyClassOption;
import org.apache.hadoop.io.SequenceFile.Writer.ValueClassOption;
import org.apache.hadoop.io.Text;

public class THT_testSequenceFile2 {

	private static final String[] DATA = { "One, two, buckle my shoe",
			"Three, four, shut the door", "Five, six, pick up sticks",
			"Seven, eight, lay them straight", "Nine, ten, a big fat hen" };

	public static void main(String[] args) throws IOException {
		// String uri = args[0];
		String uri = "file:///D://B.txt";
		Configuration conf = new Configuration();
		Path path = new Path(uri);

		IntWritable key = new IntWritable();
		Text value = new Text();
		SequenceFile.Writer writer = null;
		SequenceFile.Writer.FileOption option1 = (FileOption) Writer.file(path);
		SequenceFile.Writer.KeyClassOption option2 = (KeyClassOption) Writer.keyClass(key.getClass());
		SequenceFile.Writer.ValueClassOption option3 = (ValueClassOption) Writer.valueClass(value.getClass());
		
		try {
			
			writer = SequenceFile.createWriter( conf, option1,option2,option3,Writer.compression(CompressionType.RECORD));
			
			for (int i = 0; i < 10; i++) {
				key.set(1 + i);
				value.set(DATA[i % DATA.length]);
				System.out.printf("[%s]\t%s\t%s\n", writer.getLength(), key,
						value);
				writer.append(key, value);
			}
		} finally {
			IOUtils.closeStream(writer);
		}
	}
}

运行结果如下:


2015-11-06 22:15:05,027 INFO  compress.CodecPool (CodecPool.java:getCompressor(153)) - Got brand-new compressor [.deflate]
[128]	1	One, two, buckle my shoe
[173]	2	Three, four, shut the door
[220]	3	Five, six, pick up sticks
[264]	4	Seven, eight, lay them straight
[314]	5	Nine, ten, a big fat hen
[359]	6	One, two, buckle my shoe
[404]	7	Three, four, shut the door
[451]	8	Five, six, pick up sticks
[495]	9	Seven, eight, lay them straight
[545]	10	Nine, ten, a big fat hen

生成的文件:




读操作


新的API里提供的option参数:


FileOption -表示读哪个文件
InputStreamOption
StartOption
LengthOption -按照设置的长度变量来决定读取的字节
BufferSizeOption
OnlyHeaderOption


根据最新的API直接上源码:


package org.apache.hadoop.io;

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.Reader;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.util.ReflectionUtils;

public class THT_testSequenceFile3 {

	public static void main(String[] args) throws IOException {
		//String uri = args[0];
		String uri = "file:///D://B.txt";
		Configuration conf = new Configuration();
		Path path = new Path(uri);
		SequenceFile.Reader.Option option1 = Reader.file(path);
		SequenceFile.Reader.Option option2 = Reader.length(174);//这个参数表示读取的长度
		
		SequenceFile.Reader reader = null;
		try {
			reader = new SequenceFile.Reader(conf,option1,option2);
			Writable key = (Writable) ReflectionUtils.newInstance(
					reader.getKeyClass(), conf);
			Writable value = (Writable) ReflectionUtils.newInstance(
					reader.getValueClass(), conf);
			long position = reader.getPosition();
			while (reader.next(key, value)) {
				String syncSeen = reader.syncSeen() ? "*" : "";
				System.out.printf("[%s%s]\t%s\t%s\n", position, syncSeen, key,
						value);
				position = reader.getPosition(); // beginning of next record
			}
		} finally {
			IOUtils.closeStream(reader);
		}
	}
}

我这儿设置了一个读取长度的参数,只读到第174个字节那,所以运行结果如下:


2015-11-06 22:53:00,602 INFO  compress.CodecPool (CodecPool.java:getDecompressor(181)) - Got brand-new decompressor [.deflate]
[128]	1	One, two, buckle my shoe
[173]	2	Three, four, shut the door







分享到:
评论

相关推荐

    hadoop2.7.1 windows缺少的文件winutils.exe,hadoop.dll

    下载winutils.exe,hadoop.dll放到hadoop环境的bin目录,建议尽量使用版本匹配的,必然hadoop-2.6就使用2.6版本的。2.7版本就使用2.7.。理论上2.7版本可以使用在2.6版本上

    hadoop-2.7.1.zip

    HDFS的设计理念是“一次写入,多次读取”,这使得它非常适合处理那些一次性写入、然后多次读取的大数据。在Hadoop 2.7.1中,HDFS可能包含了如下的优化: 1. 提升了NameNode的性能,通过引入HA(High Availability)...

    Hadoop安装教程_单机/伪分布式配置_Hadoop2.7.1/Ubuntu 16.04

    Hadoop安装教程_单机/伪分布式配置_Hadoop2.7.1/Ubuntu 16.04 本教程主要讲述了在 Ubuntu 16.04 环境下安装 Hadoop 2.7.1 的步骤,包括单机模式、伪分布式模式和分布式模式三种安装方式。以下是本教程的知识点总结...

    hadoop-2.7.1

    1. **HDFS(Hadoop Distributed File System)**:Hadoop的核心组件之一,是一个分布式文件系统,旨在跨多台机器提供高容错性和高吞吐量的数据访问。HDFS通过将大文件分割成块并在集群中的多个节点上存储来实现这...

    hadoop2.7.1 eclipse插件

    hadoop2.7.1的eclipse插件,编译环境,eclipse 4.4(luna) ,jdk1.7,ant1.9.6,maven3.3,hadoop2.7.1,centos6.7,jdk1.7 要注意的是开发黄金下jdk版本必须是jdk1.7及以上,否则无法使用

    Hadoop2.7.1中文文档

    Hadoop2.7.1是Hadoop发展中的一个重要版本,它在前一个版本的基础上进行了一系列的优化和改进,增强了系统的稳定性和性能。这个压缩包文件包含的是Hadoop2.7.1的中文文档,对于学习和理解Hadoop的运作机制、配置以及...

    hadoop 2.7.1

    在使用Hadoop时,需要注意数据的分块策略,合理设置Block Size以优化I/O效率。同时,为了保证数据安全,定期进行NameNode的快照备份是必要的。此外,监控系统性能,如磁盘使用率、CPU和内存使用情况,以及网络带宽,...

    hadoop.zip hadoop2.7.1安装包

    在Hadoop2.7.1安装包中,`hadoop-2.7.1.tar.gz`是主要的发布文件,包含了Hadoop的所有组件和依赖库。这个tarball文件通常在Linux环境下使用,通过解压缩可以得到Hadoop的源代码和二进制文件。用户需要配置环境变量、...

    hadoop2.7.1.rar

    标题中的"hadoop2.7.1.rar"表明这是一个关于Apache Hadoop的压缩文件,具体版本为2.7.1。Hadoop是一个开源框架,主要用于分布式存储和计算,它由Apache软件基金会开发,广泛应用于大数据处理领域。这个压缩包可能是...

    eclipse hadoop2.7.1 plugin 配置

    `eclipse hadoop2.7.1 plugin`是为了方便开发者在Eclipse中进行Hadoop项目开发而设计的插件。本文将详细介绍如何配置Eclipse以支持Hadoop 2.7.1,并讨论相关的知识点。 首先,配置Eclipse Hadoop插件的步骤如下: ...

    hadoop2.7.1的Windows版本

    Hadoop 2.7.1是其一个重要的版本,提供了许多性能优化和功能增强。然而,Hadoop最初设计的目标是在Linux环境下运行,因此,直接在Windows系统上运行可能会遇到兼容性问题。为了在Windows上成功部署并运行Hadoop ...

    hadoop2.7.1平台搭建

    hadoop2.7.1平台搭建

    Spark所需的hadoop2.7.1相关资源

    1. 存储:Hadoop的HDFS(Hadoop Distributed File System)为Spark提供了分布式存储的基础,Spark可以通过HDFS读取和写入大量数据,实现数据的高效访问。 2. 计算:Hadoop的MapReduce框架是Spark早期版本的一个重要...

    hadoop2.7.1-win32.zip

    标题 "hadoop2.7.1-win32.zip" 指示了这是一个适用于Windows 32位操作系统的Hadoop版本,具体为2.7.1。Hadoop是Apache软件基金会开发的一个开源分布式计算框架,它允许在大量计算机节点上处理和存储海量数据。这个...

    hadoop-2.7.1.rar

    Hadoop 2.7.1 是 Apache 基金会发布的一个开源分布式计算框架,它在大数据处理领域扮演着至关重要的角色。这个版本是Hadoop发展中的一个重要里程碑,提供了许多性能优化和新特性,旨在提高数据处理的效率和可靠性。 ...

    winutils.exe_hadoop-2.7.1

    《Hadoop Winutils.exe在2.7.1版本中的应用与配置详解》 Hadoop作为一个分布式计算框架,广泛应用于大数据处理领域。在Windows环境中,Winutils.exe和hadoop.dll是Hadoop的重要组成部分,它们为Hadoop在Windows上的...

    hadoop2.7.1版本的hadoop.dll,winutils.exe

    Hadoop 2.7.1是这个框架的一个重要版本,它包含了各种优化和改进,以提高数据处理的效率和稳定性。在这个版本中,有两个关键的组件是hadoop.dll和winutils.exe,它们在Windows环境下运行Hadoop时扮演着至关重要的...

    使用Maven编译Hadoop(2.7.1)

    http://archive.apache.org/dist/hadoop/core/hadoop-2.7.1/hadoop-2.7.1-src.tar.gz ``` - **解压操作**: ``` # tar -zxvf hadoop-2.7.1-src.tar.gz -C /opt ``` 解压完成后,进入到 `/opt/hadoop-2.7.1-...

    hadoop-2.7.1 64位编译包 part1

    本人用7个多小时成功编译 hadoop 2.7.1 64位编译包(JDK1.8 64),由于文件太大,分3卷压缩。 hadoop 2.7.1 相对于2.7.0修复了上百个Bug,是可用于生产环境的版本了。

Global site tag (gtag.js) - Google Analytics