基于文件的数据结构:关于SequenceFile

纯文本不适合记录二进制类型的数据,在这种情况看下,Hadoop的SequenceFile类非常合适,为二进制键值对提供了一种持久的数据结构

1.SequenceFile的写操作

通过createWriter()静态方法可以创建SequenceFile对象,并返回SequenceFile.Writer实例

该静态方法需要指定待写入的数据流(FSDataOutputStream或FileSystem对象和Path对象),Configuration对象,以及键和值得类型

一旦拥有SequenceFile.Writer实例,就可以通过append()方法在文件末尾附加键值对

写入SequenceFile对象,程序如下:

package com.lcy.hadoop.io;

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;

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 Exception{
        // TODO Auto-generated method stub
        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);
        }
    }
}

运行程序:

运行结果:

......

2.SequenceFile的读操作

从头到尾读取顺序文件就是创建SequenceFile.Reader实例后反复调用next()方法迭代读取记录

如果next()方法返回的是非null对象,则可以从该数据流中读取键值对

程序如下:

package com.lcy.hadoop.io;

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

public class SequenceFileReadDemo {

    public static void main(String[] args) throws Exception{
        // TODO Auto-generated method stub
        String uri=args[0];
        Configuration conf=new Configuration();
        FileSystem fs=FileSystem.get(URI.create(uri),conf);
        Path path=new     Path(uri);
        SequenceFile.Reader reader=null;
        try{
            reader=new SequenceFile.Reader(fs, path, conf);
            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();
            }
        }finally{
            IOUtils.closeStream(reader);
        }
    }
}

运行程序:

运行结果:

......

该程序的一个特性是能够显示顺序文件中同步点的位置信息

同步点:指数据读取的实例出错后能够再一次与记录边界同步的数据流中的一个位置  [2026*]

3.通过命令行接口显示SequenceFile

hadoop fs 命令有一个 -text 选项可以以文本形式显示顺序文件

 

时间: 2024-07-30 18:28:04

基于文件的数据结构:关于SequenceFile的相关文章

Hadoop基于文件的数据结构及实例

基于文件的数据结构 两种文件格式: 1.SequenceFile 2.MapFile SequenceFile 1.SequenceFile文件是Hadoop用来存储二进制形式的<key,value>对而设计的一种平面文件(Flat File). 2.能够把SequenceFile当做一个容器,把全部文件打包到SequenceFile类中能够高效的对小文件进行存储和处理. 3.SequenceFile文件并不依照其存储的key进行排序存储.SequenceFile的内部类Writer**提供了

基于文件的数据结构:关于MapFile

MapFile是已经排过序的SequenceFile,它有索引,所以可以按键查找 1.MapFile的写操作 MapFile的写操作类似于SequenceFile的写操作.新建一个MapFile.Writer实例,然后调用append()方法顺序写入文件内容.如果不按顺序写入,就抛出一个IOException异常.键必须是WritableComparable类型的实例,值必须是Writable类型的实例. 写入MapFile,程序如下: package com.lcy.hadoop.io; im

基于文件描述符的文件操作(非缓冲)

1.1. 文件描述符:内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0-1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作.常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcnt

五、基于文件描述符的文件操作(非缓冲)

1文件描述符 内核为每个进程维护一个已打开文件的记录表,文件描述符是一个较小的正整数(0—1023),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权限).flock(加锁).fcntl(控

一起talk C栗子吧( 第一百四十回:C语言实例--文件操作:基于文件描述符三)

各位看官们,大家好,上一回中咱们说的是基于文件描述符进行文件操作的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中详细地介绍了文件操作相关的系统调用.不过,没有举具体的例子.我们的主要内容就是举例子,因此,今天我们将通过具体的例子来说明如果使用系统调用来操作文件. 对文件的操作,还是使用我总结的文件操作三步曲比较好: fd = open(file_name,flags_read); //打开文件 fd = open(file_name,fl

基于文件形式的聊天工具

前因 由于在甲方公司领导要求,在上班时禁止一切的聊天工具的出现.各种封IM软件或者端口.但是开发人员和测试人员相隔半天街,所以,一直想整个简单且不用网络的聊天的工具. 思索半天,遇到以下问题: 我们方的IP地址和甲方人员的不是同网段的 每次交流,除了邮件,就是靠吼 几个人用的系统有几种:xp,win8, win7, mac 网段不一样,某些内网,我们外部不能访问 有以下共同点: 都可以访问某个服务器(因为得时不时看下测试日志) 都会基础的Linux命令 简单,又不用网络的,到底可以做神马呢? 就

.net缓存——基于文件的缓存

一,.Net中的缓存基础知识 .net中支持的两种依赖: CacheDependency SqlDependency 表示对于文件或者目录的依赖 表示对于SQL数据库的依赖 过期时间 绝对过期时间 滑动过期时间 一个特定的时间点,类型为DateTime 一个时间间隔,类型为TimeSpan 优先级  :   CacheItemPriority 由于我们需要缓存大量的数据,在内存有限的情况下,就必须对缓存的数据进行优先级分类,以便在需要的时候,将不重要的数据从缓存中移除.优先级用来指定缓存数据的重

基于文件的离线数据同步方案

产品此前的数据备份方案,存在不少问题,所以需要设计一个新的方案.本文总结一下新旧方案的优劣 首先APP是一个支持离线的应用.本地数据保存在sqlite,在离线环境下,在本地数据库里读写记录,在有网络的时候,再将数据备份到服务器:同时,也可以随时将数据从服务器恢复到本地 旧方案 此前的备份方案是基于内容的,每一条记录都有create_date和modify_date字段,同时APP保存有latest_backup_date(上次备份时间).然后开始备份的时候,就对所有表进行扫描,根据这3个时间的对

Linux 中httpd基于文件的用户的访问控制和CGI

基于用户访问控制(这里控制的是整个页面控制)         用户认证类型:             基本认证:Basic             摘要认证:digest,是否明文还是密文的控制. 虚拟用户:仅用于访问某服务和获取资源的凭证:         用户帐号密码存放位置:.htpasswd 这个文件用户名是明文的,密码是加密的.这个文件的名字也是你自己取的,一般我们不改动.htpasswd存放在httpd配置文件下即可                 实例:我们这里基于文件的认证(文件