Hadoop 中SequenceFile的简介

2024-02-14 11:32
文章标签 简介 hadoop sequencefile

本文主要是介绍Hadoop 中SequenceFile的简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概念

SequenceFile是一个由二进制序列化过的key/value的字节流组成的文本存储文件,它可以在map/reduce过程中的input/output 的format时被使用。在map/reduce过程中,map处理文件的临时输出就是使用SequenceFile处理过的。 所以一般的SequenceFile均是在FileSystem中生成,供map调用的原始文件。

特点

SequenceFile是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是append only的,于是你不能对已存在的key进行写操作。
SequenceFile可以作为小文件的容器,可以通过它将小文件包装起来传递给MapReduce进行处理。
SequenceFile提供了两种定位文件位置的方法
  1. seek(long poisitiuion):poisition必须是记录的边界,否则调用next()方法时会报错
  2. sync(long poisition):Poisition可以不是记录的边界,如果不是边界,会定位到下一个同步点,如果Poisition之后没有同步点了,会跳转到文件的结尾位置

状态

SequenceFile 有三种压缩态:

  1.   Uncompressed – 未进行压缩的状
  2.   record compressed - 对每一条记录的value值进行了压缩(文件头中包含上使用哪种压缩算法的信息)
  3.   block compressed – 当数据量达到一定大小后,将停止写入进行整体压缩,整体压缩的方法是把所有的keylength,key,vlength,value 分别合在一起进行整体压缩,块的压缩效率要比记录的压缩效率高

格式

每一个SequenceFile都包含一个“头”(header)Header包含了以下几部分。

1.SEQ三个字母的byte数组

2.Version numberbyte,目前为数字3byte

3.KeyValue的类名

4.压缩相关的信息

5.其他用户定义的元数据

6.同步标记,sync marker

对于每一条记录(K-V),其内部格式根据是否压缩而不同。SequenceFile的压缩方式有两种,“记录压缩”(record compression)和“块压缩”(block compression)。如果是记录压缩,则只压缩Value的值。如果是块压缩,则将多条记录一并压缩,包括KeyValue。具体格式如下面两图所示:



 

扩展实现

  1. MapFile  一个key-value 对应的查找数据结构,由数据文件/data 和索引文件 /index 组成,数据文件中包含所有需要存储的key-value对,按key的顺序排列。索引文件包含一部分key值,用以指向数据文件的关键位置
  2. SetFile – 基于 MapFile 实现的,他只有key,value为不可变的数据。
  3. ArrayFile – 也是基于 MapFile 实现,他就像我们使用的数组一样,key值为序列化的数字。      
  4. BloomMapFile – 他在 MapFile 的基础上增加了一个 /bloom 文件,包含的是二进制的过滤表,在每一次写操作完成时,会更新这个过滤表。

操作

读写文件
package com.eric.hadoop.io.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;
/*** @author Eric.sunah 2014年12月10日**/
public class SequenceFileDemo {private static final String OPERA_FILE = "./output.seq";/*** 随便从网上截取的一段文本*/private static String[]    testArray = { "<plugin>                                                                     ","  <groupId>org.apache.avro</groupId>                                         ","  <artifactId>avro-maven-plugin</artifactId>                                 ","  <version>1.7.7</version>                                                   ","  <executions>                                                               ","    <execution>                                                              ","      <phase>generate-sources</phase>                                        ","      <goals>                                                                ","        <goal>schema</goal>                                                  ","      </goals>                                                               ","      <configuration>                                                        ","        <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory> ","        <outputDirectory>${project.basedir}/src/main/java/</outputDirectory> ","      </configuration>                                                       ","    </execution>                                                             ","  </executions>                                                              ","</plugin>                                                                    ","<plugin>                                                                     ","  <groupId>org.apache.maven.plugins</groupId>                                ","  <artifactId>maven-compiler-plugin</artifactId>                             ","  <configuration>                                                            ","    <source>1.6</source>                                                     ","    <target>1.6</target>                                                     ","  </configuration>                                                           ", "</plugin>"};public static void main(String[] args) throws IOException {writeSequenceFile(OPERA_FILE);readSequenceFile(OPERA_FILE);}private static void readSequenceFile(String inputFile) throws IOException {Configuration config = new Configuration();Path path = new Path(inputFile);SequenceFile.Reader reader = null;try {FileSystem fs = FileSystem.get(URI.create(inputFile), config);reader = new SequenceFile.Reader(fs, path, config);IntWritable key = new IntWritable();Text value = new Text();long posion = reader.getPosition();// reader.next()返回非空的话表示正在读,如果返回null表示已经读到文件结尾的地方while (reader.next(key, value)) {//打印同步点的位置信息String syncMark = reader.syncSeen() ? "*" : "";System.out.printf("[%s\t%s]\t%s\t%s\n", posion, syncMark, key, value);posion = reader.getPosition();}} finally {IOUtils.closeStream(reader);}}/*** 写Sequence File 文件** @param outputFile* @throws IOException*/private static void writeSequenceFile(String outputFile) throws IOException {Configuration config = new Configuration();Path path = new Path(outputFile);IntWritable key = new IntWritable();Text value = new Text();SequenceFile.Writer writer = null;try {FileSystem fs = FileSystem.get(URI.create(outputFile), config);writer = SequenceFile.createWriter(fs, config, path, key.getClass(), value.getClass());for (int i = 1; i < 2000; i++) {key.set(2000 - i);value.set(testArray[i % testArray.length]);System.out.printf("[%s]\t%s\t%s\n", writer.getLength() + "", key, value);// 通过Append方法进行写操作writer.append(key, value);}} finally {IOUtils.closeStream(writer);}}
}




这篇关于Hadoop 中SequenceFile的简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/708381

相关文章

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

业务协同平台--简介

一、使用场景         1.多个系统统一在业务协同平台定义协同策略,由业务协同平台代替人工完成一系列的单据录入         2.同时业务协同平台将执行任务推送给pda、pad等执行终端,通知各人员、设备进行作业执行         3.作业过程中,可设置完成时间预警、作业节点通知,时刻了解作业进程         4.做完再给你做过程分析,给出优化建议         就问你这一套下

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Tools】AutoML简介

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 AutoML(自动机器学习)是一种使用机器学习技术来自动化机器学习任务的方法。在大模型中的AutoML是指在大型数据集上使用自动化机器学习技术进行模型训练和优化。