hive文件存储格式:SequenceFile系统总结
问题导读 1.什么是SequenceFile? 2.如何 通过 源码实现SequenceFile压缩? 3.SequenceFile格式压缩有什么优点和缺点? 1.SequenceFile是什么 1.1 SequenceFile概述
1.1.sequenceFile文件是Hadoop用来存储二进制形式的<Key,Value>对而设计的一种平面文件(Flat File)。
1.2.可以把SequenceFile当做是一个容器,把所有的文件打包到SequenceFile类中可以高效的对小文件进行存储和处理。
1.3.SequenceFile文件并不按照其存储的Key进行排序存储,SequenceFile的内部类Writer提供了append功能。
1.4.SequenceFile中的Key和Value可以是任意类型Writable或者是自定义Writable。
1.5.在存储结构上,SequenceFile主要由一个Header后跟多条Record组成,Header主要包含了Key classname,value classname,存储压缩算法,用户自定义元数据等信息,此外,还包含了一些同步标识,用于快速定位到记录的边界。每条Record以键值对的方式进行存储,用来表示它的字符数组可以一次解析成:记录的长度、Key的长度、Key值和value值,并且Value值的结构取决于该记录是否被压缩。
1.2:SequenceFile支持数据压缩
2.1.SequenceFIle的内部格式取决于是否启用压缩,如果是压缩,则又可以分为记录压缩和块压缩。
2.2.有一下三种类型的压缩:
A.无压缩类型:如果没有启用压缩(默认设置)那么每个记录就由它的记录长度(字节数)、键的长度,键和值组成。长度字段为4字节。
B.记录压缩类型:记录压缩格式与无压缩格式基本相同,不同的是值字节是用定义在头部的编码器来压缩。注意:键是不压缩的。下图为记录压缩:
C.块压缩类型:块压缩一次压缩多个记录,因此它比记录压缩更紧凑,而且一般优先选择。当记录的字节数达到最小大小,才会添加到块。该最小值由io.seqfile.compress.blocksize中的属性定义。默认值是1000000字节。格式为记录数、键长度、键、值长度、值。下图为块压缩:
1.3:优缺点 SequenceFile优点: A.支持基于记录(Record)或块(Block)的数据压缩。 B.支持splitable,能够作为MapReduce的输入分片。 C.修改简单:主要负责修改相应的业务逻辑,而不用考虑具体的存储格式。 SequenceFile的缺点 A.需要一个合并文件的过程,且合并后的文件不方便查看。 2.SequenceFile类解析 SequenceFile类位于org.apache.hadoop.io包内,类结构如下:
3.读写SequenceFile源码实例 写过程 1、创建Configuration 2、获取FileSystem 3、创建文件输出路径Path 4、调用SequenceFile.createWriter得到SequenceFile.Writer对象 5、调用SequenceFile.Writer.append追加写入文件 6、关闭流 3 例子如下:
[Bash shell] 纯文本查看 复制代码
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.SequenceFile.CompressionType;
import org.apache.hadoop.io.compress.BZip2Codec;
public class SequenceFileWrite {
public static String uri = "hdfs://10.13.33.218:9000" ;
public static String[] data = {
"one,two" ,
"three,four" ,
"five,six" ,
"seven,eight" ,
"nine,ten"
} ;
public static void main(String args[])throws Exception{
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()) ;//对SequenceFile进行记录压缩
for(int i=0;i<100;i++){
key.set(100-i) ;
value.set(data[i%data.length]) ;
writer.append(key, value) ;
}
IOUtils.closeStream(writer) ;
}
}
读过程 1、创建Configuration 2、获取FileSystem 3、创建文件输出路径Path 4、new一个SequenceFile.Reader进行读取 5、得到keyClass和valueClass 6、关闭流
[Bash shell] 纯文本查看 复制代码
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 SequenceFileRead {
public static String uri = "hdfs://10.13.33.218:9000" ;
public static String[] data = {
"one,two" ,
"three,four" ,
"five,six" ,
"seven,eight" ,
"nine,ten"
} ;
public static void main(String[] args) throws Exception{
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) ;
}
}
4.通过命令行接口显示SequenceFile hdfs dfs命令有一个-text选项可以以文本形式显示顺序文件,该选项可以查看文件的代码,由此检测出文件的类型并将其转换成相应的文本。该选项可以识别gzip压缩文件和顺序文件;否则,假设输入为纯文本文件。 对于顺序文件,如果键和值是由具体含义的字符串表示,那么这个命令就非常有用(通过toString()方法定义),同样,如果有自己定义的键或值的类,则应该确保它们在Hadoop类路径目录下。 project hdfs dfs -text tmp1.seq | head 5.SequenceFile的排序和合并 MapReduce是对多个顺序文件进行排序或合并的最有效的方法。MapReduce本身是并行的,并且可由用户指定要使用多少个reducer,该数决定这输出分区数。例如,通过指定一个reducer,可以得到一个输出文件。 除了MapReduce实现排序/归并,还有一种方法是使用SequenceFile.Sorter类中的sort()方法和merge()方法。它们比MapReduce更早出现,比MapReduce更底层,为了实现并行,需要手动对数据进行分区,因此不建议使用。
- WCF版的PetShop之二:模块中的层次划分[提供源代码下载]
- 我的WCF之旅(3):在WCF中实现双工通信
- 我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
- 更新弹幕系统的心得体会
- 我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案
- 我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
- 我的WCF之旅(6):在Winform Application中调用Duplex Service出现TimeoutException的原因和解决方案
- 扩展mysql - 手把手教你写udf
- scrapy初体验 - 安装遇到的坑及第一个范例
- Linux性能监控 - CPU、Memory、IO、Network
- 浅谈UDP(数据包长度,收包能力,丢包及进程结构选择)
- WCF版的PetShop之三:实现分布式的Membership和上下文传递
- “高并发”问题如何解决?腾讯云一分钟配置的“黑科技”帮您
- 初探JavaScript(三)——JS带我"碰壁"带我飞
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《Java从入门到失业》第四章:类和对象(4.6):类路径
- 《Java从入门到失业》第四章:类和对象(4.5):包
- 《Java从入门到失业》第四章:类和对象(4.4):方法参数及传递
- 《Java从入门到失业》第四章:类和对象(4.3):一个完整的例子带你深入类和对象
- 《Java从入门到失业》第四章:类和对象(4.2):String类
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.9):数组(数组基本使用、数组的循环、数组拷贝、数组排序、多维数组)
- Establishing SSL connection without server identity verification is not recommended
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(循环语句、while语句、for语句)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.8):流程控制(选择语句、if-else语句、switch语句)
- 线上服务启动卡死,堆栈分析
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(自增自减、关系运算、逻辑运算、条件运算、位运算、赋值运算、类型转换)
- JavaWeb——MyBatis框架之多表查询操作实战案例总结(MyBatis1对1查询,MyBatis1对多查询,MyBatis多对多查询)
- kubernetes(二十二) 服务网格化istio入门
- 使用Ngrok将本地服务映射为公网服务
- 前端图片下载