多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
存储方式:行存储。HDFS 自带的文件格式。 **SequenceFile 特点:** 1、SequenceFile 文件是 Hadoop 用来存储二进制形式的(key,value)对而 设计的一种平面文件(Flat File)。 2、可以把 SequenceFile 当作一个容器,把所有文件打包到 SequenceFile 类中可以高效的对小文件进行存储和处理。 3、SequenceFile 文件并不按照其存储的 key 进行排序存储,SequenceFile 的内部类 Writer 提供了 append 功能。 4、SequenceFile 中的 key 和 value 可以是任意类型 Writable 或者是自定 义 Writable 类型。 <br/> **SequenceFile 压缩:** 1、SequenceFile 的<ins>内部格式取决于是否启用压缩</ins>,如果是:要么是记录压缩,要么是块压缩。通过 `io.seqfile.compression.type=RECORD(记录级压缩)`或 `io.seqfile.compression.type=BLOCK(块级压缩)`决定。 2、有以下三种类型: >A、无压缩类型:如果没有启用压缩(默认设置),那么每个记录就由它的记录长度(字节数)、键的长度、键和值组成,长度字段为四字节。 >B、记录压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意,键是不压缩的。 >C、块压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由 `io.seqfile.compress.blocksize 中的属性定义`,默认值是 1000000字节。格式为记录数、键长度、键、值长度、值。 `io.seqfile.compress.blocksize` 参数决定每一个记录块压缩的数据量,默认大小是 1000000 byte ,这个值具体指的是 key 和 value 缓存所占的空间,每要往文件写一条 key/value 时,都是将 key 和 value 的长度以及 key 和 value 的值缓存在 keyLenBuffer keyBuffer valLenBuffer valBuffer 这四个 DataOutputStream 中,当keyBuffer.getLength() + valBuffer.getLength() 大于或等于io.seqfile.compress.blocksize 时,将这些数据当做一个 block 写入sequence 文件。 ![](https://img.kancloud.cn/85/74/8574dc90f5f8ca5f1f5eb8677280ab78_1038x631.png) ![](https://img.kancloud.cn/2d/68/2d68021cda6b2f0723065fd44913df0d_1060x436.png) **SequenceFile 文件格式的优点:** ➢ 支持基于记录(Record)或块(Block)的数据压缩 ➢ 支持 splittable,能够作为 MapReduce 的输入分片 ➢ 修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式 ➢ 即使在压缩时也支持分割<br/> **SequenceFile 文件格式的缺点:** ➢ 需要一个合并文件的过程,且合并后的文件将不方便查看 **读写 SequenceFile:** 需要引入的依赖请查看 ```sql 【HDFS分布式文件系统 -> HDFS JavaAPI -> 基本使用】一节 ``` ```java package datamodel; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.*; import org.apache.hadoop.util.ReflectionUtils; import org.junit.Test; import java.io.IOException; import java.net.URI; public class SequenceFileOps { private static Configuration conf = new Configuration(); // 定义hdfs地址 private static String url = "hdfs://hadoop101:9000"; // 定义测试数据 private static String[] data = {"a,b,c,d,e,f,g", "e,f,g,h,j,k", "l,m,n,o,p,q,r,s", "t,u,v,w,x,y,z"}; /** * 写数据 */ @Test public void write() throws IOException { // io.seqfile.compression.type=RECORD 记录压缩 // io.seqfile.compression.type=BLOCK 块压缩 conf.set("io.seqfile.compression.type", "BLOCK"); // 获取文件系统 FileSystem fs = FileSystem.get(URI.create(url), conf); // 定义在hdfs上的输出路径 Path output = new Path("/tmp/myseqfile.seq"); // 定义输出的key和value IntWritable key = new IntWritable(); Text value = new Text(); // 调用写出方法 SequenceFile.Writer writer = SequenceFile.createWriter(fs, conf, output, IntWritable.class, Text.class); // 测试循环写出数据 for (int i = 0; i < 10; i++) { key.set(i); value.set(data[i % data.length]); writer.append(key, value); } //关闭流 IOUtils.closeStream(writer); } /** * 读数据 */ @Test public void read() throws IOException { FileSystem fs = FileSystem.get(URI.create(url), conf); //定义读入路径 Path input = new Path("/tmp/myseqfile.seq"); //创建读入流 SequenceFile.Reader reader = new SequenceFile.Reader(fs, input, 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()); } } } ``` **查看文件内容:** ```sql [root@hadoop101 hadoop]# hdfs dfs -text /tmp/myseqfile.seq 0 a,b,c,d,e,f,g 1 e,f,g,h,j,k 2 l,m,n,o,p,q,r,s 3 t,u,v,w,x,y,z 4 a,b,c,d,e,f,g 5 e,f,g,h,j,k 6 l,m,n,o,p,q,r,s 7 t,u,v,w,x,y,z 8 a,b,c,d,e,f,g 9 e,f,g,h,j,k ``` **在Hive中使用SequenceFile存储格式:** ```sql -- 方式一 create external table user_seq_ext( name string, favorite_number int, favorite_color string ) stored as sequencefile; -- 方式二: create external table user_seq_ext( name string, favorite_number int, favorite_color string ) stored as inputformat 'org.apache.hadoop.mapred.SequenceFileInputFormat' outputformat 'org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat'; ```